Assembly Utasítások, programok Iványi Péter
Assembly programozás Egyszerű logikán alapul Egy utasítás CSAK egy dolgot csinál Magas szintű nyelven: x = 5 * z + y; /* 3 darab művelet */ Assembly: Szorozzuk meg z-et 5-el és tároljuk az eredményt valahol Adjuk y értékét az időleges eredményhez Az eredményt tároljuk x-ben
Időleges változó Regiszterek Változók Assembly programozás Memóriában egy hely Regiszter használat Sebesség miatt Csökken az adatbusz használata Bizonyos műveleteket csak regiszterekkel lehet végrehajtani
Assembly programozás x = y + 1 Mozgassuk y értékét az 1. regiszterbe Mozgassuk az 1-es számot a 2. Regiszterbe Az 1. regisztert adjuk a 2. regiszterhez A 2. regisztert mozgassuk az x változóba
if x == 1 then y = 2 end if Assembly programozás Hasonlítsuk össze x-et és az 1-es számot Ugorj a THEN címkére ha igaz Ugorj a VÉGE címkére THEN: címke Mozgassuk a 2-es értéket az 1. regiszterbe Mozgassuk az 1. regisztert az y memória helyre VÉGE: címke...
Assembly programozás Hasonlítsuk össze x-et és az 1-es számot Ugorj a VÉGE címkére ha nem igaz THEN: címke ; nem is kell Mozgassuk a 2-es értéket az 1. regiszterbe Mozgassuk az 1. regisztert az y memória helyre VÉGE: címke...
MOV BL, szam MOV AH, 02 MOV CX, 0008 ujra: MOV DL, 00 RCL BL, 1 ADC DL, 30h INT 21h LOOP ujra INT 20h Bináris szám kiírása
Bitforgatás Carry 7 6 5 4 3 2 1 0 Átforgatjuk a biteket a Carry biten keresztül A Carry bit vagy 1 vagy 0
ASCII előállítása 0 -ASCII 30h 1 -ASCII 31h ADC DL,30h DL = DL + 30h + Carry bit
Hexadecimális szám kiírása 0-9 számjegyek: 30h -39h ASCII A -F számjegyek: 41h -46h ASCII Két csoportot külön kell kezelni IF BL < 0Ah THEN BL = BL + 30h ELSE BL = BL + 37h Assembly-ben nincs ELSE ág
Hexadecimális szám kiírása Átszervezett kód: BL = BL + 30h IF BL >= 03Ah THEN BL = BL + 07h
1 Hexadecimális szám kiírása szam: MOV BL, szam MOV AH, 02 MOV DL, BL ADD DL, 30h CMP DL, 3ah JL szam ADD DL, 07 INT 21h INT 20h ; DL < 3ah
2 Hexadecimális szám kiírása, első számjegy szam: MOV BL, szam MOV AH, 02 MOV DL, BL MOV CL, 4 SHR DL, CL ADD DL, 30h CMP DL, 3ah JL szam ADD DL, 07 INT 21h INT 20h ; DL < 3ah
2 Hexadecimális szám kiírása, első számjegy Carry 7 6 5 4 3 2 1 0 0 Bitléptetés előtt 1010 0101 Bitléptetés után 0000 1010
2 Hexadecimális szám kiírása, két számjegy MOV BL, szam MOV AH, 02 MOV DL, BL MOV CL, 4 SHR DL, CL ADD DL, 30h CMP DL, 3ah JL szam1 ADD DL, 07 szam1: INT 21h MOV DL, BL AND DL, 0Fh ADD DL, 30h CMP DL, 3ah JL szam2 ADD DL, 07 szam2: INT 21h INT 20h
1 jegyű hexadecimális szám beolvasása szam: MOV AH, 01 INT 21h SUB AL, 30h CMP AL, 09h JLE szam SUB AL, 07h INT 20h
2jegyű hexadecimális szám beolvasása szam1: MOV AH, 01 INT 21h MOV DL, AL SUB DL, 30h CMP DL, 09h JLE szam1 SUB DL, 07h MOV CL, 04h SHL DL, CL szam2: INT 21h SUB AL, 30h CMP AL, 09h JLE szam2 SUB AL, 07h ADD DL, AL INT 20h
XOR utasítás Sok mindenre használható Törlés Változók cseréje...
XOR utasítás 1. Törlés MOV AX, 0AAFFh XOR AX,AX ; AX=0000 lesz AX= 1010 1010 1111 1111 AX= 1010 1010 1111 1111 XOR 0000 0000 0000 0000
XOR utasítás 2. Írjunk programot a XOR felhasználásával, melynek hatása ugyanaz mint NOT AX. PUSH BX MOV BX, FFFFh XOR AX, BX POP BX BX= 1111 1111 1111 1111 AX= 1010 1010 0011 1001 XOR 0101 0101 1100 0110
XOR utasítás 3. Írjunk programot a XOR felhasználásával, melynek hatása ugyanaz mint MOV AX,BX XOR BX, AX XOR AX, BX
XOR utasítás 3. BX= 1111 1111 1111 1111 AX= 1010 1010 0011 1001 XOR BX,AX BX= 0101 0101 1100 0110 AX= 1010 1010 0011 1001 XOR AX, BX AX= 1111 1111 1111 1111 MOV AX,BX
XOR utasítás 4. Írjunk programot a XOR felhasználásával, melynek hatása ugyanaz mint XCHG AX,BX XOR BX, AX XOR AX, BX XOR BX, AX
XOR utasítás 4. BX= 1111 1111 1111 1111 AX= 1010 1010 0011 1001 XOR BX,AX BX= 0101 0101 1100 0110 AX= 1010 1010 0011 1001 XOR AX, BX AX= 1111 1111 1111 1111 BX= 0101 0101 1100 0110 XOR BX, AX BX= 1010 1010 0011 1001
NOP utasítás Ugyanaz csak másképpen Több ciklust vesz igénybe MOV reg, reg XCHG AX, AX
Aritmetika1. Két kis szám összeadása, az eredmény belefér 8 bitbe átvitel 1 0011 0101 53 +0001 0010 + 18 0 0100 0111 71 Carry bit Sign bit
Aritmetika2. Egykis és egy nagy szám összeadása, az eredmény helytelen átvitel 111 111 0011 0101 53 +0101 0011 + 83 0 1000 1000 136 (-120!)
Aritmetika3. Két negatív szám összeadása átvitel 1 1 1 11 1100 1011-53 +1110 1110 + -18 1 1011 1001-71
Aritmetika4. Két nagy negatív szám összeadása átvitel 1 1 111 1100 1011-53 +1010 1101 + -83 1 0111 1000-136 (120!)
Aritmetika5. Két különböző előjelű szám összeadása átvitel 1 1100 1011-53 +0001 0010 + 18 0 1101 1101-35
Aritmetika6. Két különböző előjelű szám összeadása átvitel 1 1111 1 0011 0101 53 +1110 1110 + -18 1 0010 0011 35
Aritmetika7. Két különböző előjelű szám összeadása átvitel 1 1111 11 1110 1110 18 +0001 0010 + -18 1 0000 0000 0
Overflow bit 2. és 4. esetben az eredmény nem volt jó Overflow bit 1 ha: Ha volt átvitel a 6. és 7. bit között, de a 7.bitről nem generálódik carry bit (2. eset) Ha a 6. és 7. bit között nem volt átvitel, de a 7. bitről generálódik carry bit (4. eset)
Overflow bit Átvitel 7-C-re Átvitel 6-7-re XOR 1. eset 0 0 0 2. eset 0 1 1 3. eset 1 1 0 4. eset 1 0 1 5. eset 1 1 0 6. eset 1 1 0 7. eset 1 1 0
Overflow bit Megmutatja hogy az eredmény előjel helyes-e Hogy a Sign vagy Carry bit alapján kell az előjelet meghatározni Ha 1 akkor a Carry bit adja meg az előjelet Ha 0 akkor a Sign bit adja meg az előjelet