Content extract
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 Assembly programozás • Időleges változó – Regiszterek • Változók – 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 Assembly programozás if x == 1 then y=2 end if 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 . Bináris szám kiírása ujra: MOV BL, szam MOV AH, 02 MOV CX, 0008 MOV DL, 00 RCL BL, 1 ADC DL, 30h INT 21h LOOP ujra INT 20h Bitforgatás Carry 7 6 5 4 3 2 „Átforgatjuk” a biteket a Carry biten keresztül A Carry bit vagy 1 vagy 0 1 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, MOV AH, MOV DL, ADD DL, CMP DL, JL szam ADD DL, INT 21h INT 20h szam 02 BL 30h 3ah ; DL < 3ah 07 2 Hexadecimális szám kiírása, első számjegy szam: MOV BL, MOV AH, MOV DL, MOV CL, SHR DL, ADD DL, CMP DL, JL szam ADD DL, INT 21h INT 20h szam 02 BL 4 CL 30h 3ah ; DL < 3ah 07 2 Hexadecimális szám kiírása, első számjegy Carry 7 0 Bitléptetés előtt 1010 0101 Bitléptetés után 0000 1010 6 5 4 3 2 1 0 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 MOV INT SUB CMP JLE SUB AH, 01 21h AL, 30h AL, 09h szam AL, 07h szam: INT 20h 2 jegyű hexadecimális szám beolvasása MOV INT MOV SUB
CMP JLE SUB szam1: MOV SHL AH, 01 21h DL, AL DL, 30h DL, 09h szam1 DL, 07h CL, 04h DL, CL INT SUB CMP JLE SUB szam2: ADD INT 21h AL, 30h AL, 09h szam2 AL, 07h DL, AL 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= AX= XOR 1010 1010 1010 1010 0000 0000 1111 1111 1111 1111 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= AX= XOR 1111 1111 1010 1010 0101 0101 1111 1111 0011 1001 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= AX= XOR BX,AX BX= AX= XOR AX, BX AX= 1111 1111 1010 1010 1111 1111 0011 1001 0101 0101 1010 1010 1100 0110 0011 1001 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= AX= XOR BX,AX BX= AX= XOR AX, BX AX= BX= XOR BX, AX BX= 1111 1111 1010 1010 1111 1111 0011 1001 0101 0101 1010 1010 1100 0110 0011 1001 1111 1111 0101 0101 1111 1111 1100 0110 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 Aritmetika 1. • Két kis szám összeadása, az eredmény belefér 8 bitbe átvitel Carry bit 1 0011 0101 +0001 0010 0 0100 0111 Sign bit 53 + 18 71 Aritmetika 2. • Egy kis és egy nagy szám összeadása, az eredmény helytelen átvitel 111 0011 +0101 0 1000 111 0101 0011 1000 53 + 83 136 (-120!) Aritmetika 3. • Két negatív szám összeadása átvitel 1 1 1 1100 +1110 1 1011 11 1011 1110 1001 -53 + -18 -71 Aritmetika 4. • Két nagy negatív szám összeadása átvitel 1 1 1100 +1010 1 0111 111 1011 1101 1000 -53 + -83 -136
(120!) Aritmetika 5. • Két különböző előjelű szám összeadása átvitel 1 1100 1011 +0001 0010 0 1101 1101 -53 + 18 -35 Aritmetika 6. • Két különböző előjelű szám összeadása átvitel 1 1111 0011 +1110 1 0010 1 0101 1110 0011 53 + -18 35 Aritmetika 7. • Két különböző előjelű szám összeadása átvitel 1 1111 1110 +0001 1 0000 11 1110 0010 0000 18 + -18 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 7bitrő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