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 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