Skip navigation

További műveletek

INC

Az INC (INCrement) utasításnak egy operandusa van. Az operandusában megadott értéket 1-gyel növeli. Nincs hatással az átvitelre.

Példa:

     MOV AX, 5h     ;    AX = 5h

     INC AX         ;    AX = 6h

DEC

A DEC (DECrement) utasításnak egy operandusa van. Az operandusában megadott értéket 1-gyel csökkenti. Nincs hatással az átvitelre.

Példa:

     MOV AX, 5h     ;    AX = 5h

     DEC AX         ;    AX = 4h

NEG

A NEG (NEGate) utasításnak egy operandusa van. Az operandusában megadott érték előjelét megfordítja, azzal, hogy az adott számot átkonvertálja a kettes komplemensére.

Példa:

     MOV AX, 5h     ;    AX = 5h

     NEG AX         ;    AX = FFFFFFFBh

ADC

Az ADC (ADd with Carry) utasítás hozzáadja a forrás operandust és a Carry flag tartalmát is a cél operandushoz. Az utasítás formátuma megegyezik az ADD utasításéval és mind két operandus méretének meg kell egyeznie. 64 bites összeadás esetén a következő módon használható fel az ADC parancs.

Példa:

     MOV EAX, 0FFFFFFFFh      ; EAX = 0FFFFFFFFh

     MOV EBX, 0FFFFFFFFh      ; EBX = 0FFFFFFFFh

     MOV ECX, 11h              ; ECX = 11h

     MOV EDX, 11h              ; EDX = 11h

     ADD EAX, EBX              ; EAX = EAX + EBX = FFFFFFFEh, C = 1

     ADC ECX, EDX              ; ECX = ECX + EDX + C = 23h

SBB

Az SBB (SuBtract with Borrow) utasítás kivonja a cél operandusból a forrás operandust és a Carry flag tartalmát is. A lehetséges operandusok listája megegyezik az ADC utasításéval. A következő példa 64 bites kivonás használatának lehetőségét mutatja be 32 bites regiszterek segítségével. Először beállítjuk az EDX:EAX regiszter tartalmát a 0000000700000001h értékre, majd kivonunk belőle 5-öt. Az alsó 32 bitek kerülnek kivonásra először, beállítódik a Carry flag értéke 1-re, majd a felső 32 bitből kivonódik a Carry flag értéke (és az SBB második operandusának tartalma):

Példa:

     MOV EDX, 7     ; EDX = 00000007h

     MOV EAX, 1     ; EAX = 00000001h

     SUB EAX, 5     ; EAX = EAX - 5 = FFFFFFFCh, C = 1

     SBB EDX, 0     ; EDX = EDX - C = 00000006h

CMP

A CMP (CoMPare) utasítás két operandusú művelet. Szintaxisa:

            CMP op1, op2

A megadott két operandus értékét hasonlítja össze oly módon, hogy veszi az op1-op2 művelet eredményét, és az eredménynek megfelelően állítja be a flag-eket. A későbbiekben feltételes vezérlésátadáshoz nagyon jó felhasználható lesz.

SHL

Az SHL (SHift Left) utasítás logikai léptetést végez balra a cél operanduson belül, az alsó biteket feltöltve nullával. A legmagasabb helyiértéken lévő bit bekerül a Carry flag-be, és ami addig a Carry flag-ben volt eldobódik. A forrás operandusban adhatjuk meg, hogy hány bittel szeretnénk arrább léptetni.

Példa:

     MOV AL, 8Fh    ; AL = 10001111b

     SHL AL, 1      ; AL = 00011110b mivel 1 bittel balra tolódott

                    ; C = 1

SHR

Az SHR (SHift Right) utasítás logikai léptetést végez jobbra a cél operanduson belül, a felső biteket feltöltve nullával. A legalacsonyabb helyiértéken lévő bit bekerül a Carry flag-be, és ami addig a Carry flag-ben volt eldobódik. A forrás operandusban adhatjuk meg, hogy hány bittel szeretnénk arrább léptetni.

Példa:

     MOV AL, 0D0h   ; AL = 11010000b

     SHR AL, 1      ; AL = 01101000b mivel 1 bittel jobbra tolódott

                    ; C = 0

ROL

A ROL utasítás hasonlít az SHL utasításhoz, azzal a különbséggel, hogy itt körkörösen mozognak a bitek balra. A legmagasabb helyiértéken lévő bit beleíródik a Carry flag-be is és a legalacsonyabb helyiértékű bit helyére is.

Példa:

     MOV AL, 8Fh    ; AL = 10001111b

     ROL AL, 1      ; AL = 00011111b mivel 1 bittel balra tolódott

                    ; körbe. C = 1

ROR

A ROR utasítás hasonlít az SHR utasításhoz, azzal a különbséggel, hogy itt körkörösen mozognak a bitek jobbra. A legalacsonyabb helyiértéken lévő bit beleíródik a Carry flag-be is és a legmagasabb helyiértékű bit helyére is.

Példa:

     MOV AL, 0D1h   ; AL = 11010001b

     ROR AL, 1      ; AL = 11101000b mivel 1 bittel jobbra tolódott

                    ; körbe. C = 1

Példa

Egy gyakorlatiasabb példa az SHL és a ROL utasítás használatára:

     MOV AL, -80h   ;    AL = 80h

     CBW             ;    AX = FF80h

     MOV BX, 1234h  ;    BX = 1234h

     IMUL BX        ;    DX:AX = FFF6 E600h

 

A szorzás elvégzése után a szorzat a DX:AX regiszterpárosba kerül. Ha kiszeretnénk íratni a szorzatot, akkor mindenképp jó lenne elhelyezni előbb az EAX regiszterben. Erre több lehetőség is van. A következő példa az SHL utasítás használatát mutatja be erre a célra:

     PUSH AX        ;    AX tartalma a verembe

     MOV AX, DX     ;    AX = FFF6h

     SHL EAX, 16    ;    EAX = FFF6 0000h

     POP AX         ;    EAX = FFF6 E600h

 

Majd ugyancsak a DX:AX tartalmának EAX-be való áthelyezése a ROL utasítás segítségével:

     ROL EAX, 16    ;    EAX = E600 0000h

     MOV AX, DX     ;    EAX = E600 FFF6h

     ROL EAX, 16    ;    EAX = FFF6 E600h