Instruktionerna
Här en lista på de vanligaste och mest användbara assembler instruktionerna. Till vänster står hur
instruktionen används med beteckningar och till höger ett exempel med verkliga register. Mem är en
variabel i minnet som kan kallas vad som helst, tex Kalle, Pris, Therese, color, resultat osv.
Använda beteckningar:
reg 8 eller 16-bits register
reg8 endast 8-bits register
reg16 endast 16-bits register
segreg segmentregister alltid 16bitar
mem minnet
mem16 word i minnet
immed en konstant, immediate (direkt på svenska).
label en minnesplats i code segmentet
accum AX eller AL
Dataförflyttningsinstruktioner
MOV
Kopierar värdet från källan till destinationen
mov reg,reg mov ax,bx
mov mem,reg mov resultat,ax
mov reg,mem mov bl, color
mov mem,immed mov xpos, 45
mov reg,immed mov cx,200
mov segreg,reg16 mov ds, ax
mov segreg,mem16 mov es,bildminne
mov reg16,segreg mov dx, es
mov mem16,segreg mov old_data, ds
PUSH
lagrar ett värde på stacken (alltid 16 bitar) enligt principen sist in först ut
push reg16 push Ax
push mem16 push Pris
push segreg push Ds
POP
Hämtar ett värde från stacken (alltid 16 bitar) enligt principen sist in först ut
pop reg16 pop Ds
pop mem16 pop Pris
pop segreg pop Ax
XCHG
Byter ut data mellan operanderna
xchg reg,reg xchg BL,BH
xchg mem,reg xchg Summa, Ax
xchg reg,mem xchg Ch,Tal1
IN
Hämtar en byte eller ett word från en port till ackumulatorn (Ax eller Al)
in accum,immed in Al,2FH ;hämta en byte från port 2f hexadecimalt
in accum,dx in Ax,dx ;hämta ett word från port med nummer i dx
in accum,dx in Al,dx ;hämta en byte från port med nummer i dx
OUT
Skickar en byte eller ett word från ackumulatorn till en port
out immed,accum out 5,Al ;skicka ut en byte från al till port 5
out dx,accum out dx,Al
Aritmetiska instruktioner
ADD
Adderar operanderna, summan i första operanden
add reg,reg add Ax,Bx
add mem.reg add Summa,Cx
add reg,mem add Dx, Tal2
add reg, immed add Al,35
add mem,immed add Pris, 12
SUB
Subtraherar operanderna, differensen i första operanden
sub reg,reg sub Dx,Ax
sub mem.reg sub Total,Bx
sub reg,mem sub Cx, Summa
sub reg, immed sub Ah,21
sub mem,immed sub Tal1, 14
INC
Räkna upp (increase)
inc reg inc bh
inc mem inc color
DEC
Räkna ned (decrease)
dec reg dec Cx
dec mem dec Pris
NEG
Negering (görs genom att ta 0 - operanden)
neg reg neg dx
neg mem neg delta_y
CMP
Jämför två operander, följs ofta av ett villkorligt hopp
cmp reg,reg cmp Si,Bx
cmp mem,reg cmp Summa, Cx
cmp reg,mem cmp Ax, Rader
cmp reg,immed cmp Di,0
cmp mem,immed cmp Therese, 666
MUL
Utför multiplikation, Ax alltid en operand, resultatet i Ax (16 låga bitarna)
och Dx (16 höga) vid 8-bitars multiplikation, resultatet i Ax
mul reg mul Ch ;CH*AL, resultatet i Ax
mul reg mul Bx ;BX*AX, höga bitar i Dx, låga bitar i Ax (Dx:Ax)
mul mem mul Liston ;Liston*Al eller Ax beroende på om Liston är byte el. word
DIV
Utför division om 8-bitars divisor är Ax divident svar i Al, rest i Ah
om 16-bitars divisor är Dx:Ax divident svar i Ax, rest i Dx
div reg div Ch ;Ax/Ch, svar i Ax
div reg div Bx ;Dx:Ax/Bx, svar i Ax, rest i Dx
div mem div Size ;Ax/Size, byte storlek
div mem div Stor ;Dx:Ax/Stor, word storlek
div mem div [Bx] ;Dx:Ax/[Bx], word storlek, divisor är innehållet i ds:bx
Logiska instruktioner
NOT
Komplement (inverterar alla bitar i operanden)
not reg not Ax
not mem not Dennis
AND
Bitvist logiskt and, resultatet i första operanden
and reg,reg and Bx, Cx
and mem,reg and Summa, Al
and reg,mem and Dx, Maskord
and reg,immed and Ax, 3 ;maska ut de två nedersta bitarna i Ax
and mem,immed and Christine, 7 ;maska ut de tre nedersta bitarna i Christine
OR
Bitvist logiskt or, resultatet i första operanden
or reg,reg or Dl, Dh
or mem,reg or Tomte, Cx
or reg,mem or Dx, Lennart
or reg,immed or Ax, 3 ;Sätt de två nedersta bitarna i Ax
or mem,immed or Christine, 7 ;Sätt de tre nedersta bitarna i Christine
XOR
Bitvist logiskt xor, resultatet i första operanden
xor reg,reg xor Al, Bh
xor mem,reg xor Pris, Dx
xor reg,mem xor Ax, Antal
xor reg,immed xor Ch, 15
xor mem,immed xor Alfons, 39H
TEST
Samma som AND, men ändrar inte destinationsoperanden. Används för att testa om vissa bitar är
satta (följs ofta av ett villkorligt hopp)
SHL/SHR
Logiskt skift vänster (SHift Left) och höger (SHift Right)
shl reg,1 shl Dl,1 ;Samma sak som att multiplicera med 2
shr reg,Cl shr Si,Cl ;Samma sak som att dela med (2^Cl)
ROL/ROR/RCR/RCL
roterar operanden (RCR och RCL roterar med föregående carry, inte så ofta
använda)
rol reg,1 rol Bx,1
rcr reg,cl rcr Ah,Cl
Strängmanipulerande instruktioner
MOVSB/MOVSW
Kopierar en byte resp ett word från den minnescell som pekas ut av ds:si till den
minnescell som pekas ut av es:di samt räknar upp si och di en byte med movsb och två byte (ett word)
med movsw. Kombineras med fördel med REP instruktionen
movsb ;kopierar en byte från ds:si till es:di
rep movsw ;kopierar Cx st word från ds:si till es:di
LODSB/LODSW
Kopierar en byte (lodsb) eller word (lodsw) från minnet till ackumlatorn.
Registerparet ds:si pekar på adressen i minnet där byten eller wordet finns. dessutom räknas si upp en
byte (lodsb) eller två byte (lodsw) så om man gör lodsb/lodsw en gång till så laddas nästa byte eller word i
minnet till Ax.
STOSB/STOSW
Kopierar en byte (stosb) eller word (stosw) från ackumulatorn till minnet.
Registerparet es:di pekar på adressen i minnet där byten eller wordet kommer att lagras. Dessutom
räknas di upp ett steg (stosb) eller två steg (stosw) så nästa gång man gör stosb/stosw lagras Ax till nästa
position i minnet. Kan kombineras med REP instruktionen som gör stos Cx antal ggr.
stosw ;kopierar ett word från Ax till minnescellen som es:di pekar på
rep stosb ;kopierar Cx antal bytes från AL till es:di
Flödeskontrollerande instruktioner
CALL
Anropa en subrutin
RET
Återhopp från subrutin (avslutar en subrutin)
JMP
Ovillkorligt hopp (hoppar alltid)
Villkorliga hopp utnyttjar Cf och Zf bitarna i FLAG - registret. Flag registret har vissa bitar som innehåller
information om föregående instruktion. Flag bitarna kallas:
FLAG bitar:
Of Overflow flag
Df Direction flag
If Interrupt flag
Tf Trap flag
Sf Sign flag
Zf Zero flag
Af Auxiliary carry flag
Pf Parity flag
Cf Carry flag
Villkorliga hopp
. . . . . . . . . . . . . . . . . . . .Flaggvillkor
JZ / JE Jump if Zero / Jump if Equal zf = 1 (zero flaggan)
JNZ / JNE Jump if Not Zero / Jump if Not Equal zf = 0
JB / JNAE Jump if Below / Jump if Not Above or Equal cf = 1 (carry flaggan)
JAE / JNB Jump if Above or Equal / Jump if Not Below cf = 0
JBE / JNA Jump if below or equal / Jump if Not Above cf = 1 or zf = 1
JA / JNBE Jump if Above / Jump if Not Below or Equal cf = 0 and zf = 0
JL / JNGE Jump if Less / Jump if Not Greater or Equal cf = 1
JGE / JNL Jump if Greater or Equal / Jump if Not Less zf = 1
JG / JNLE Jump if Greater / Jump if Not Less or Equal zf = 0
JC Jump if Carry cf = 1
JNC Jump if Not Carry cf = 0
Villkorliga hopp görs lämpligen efter en jämförelse (CMP) eller en aritmetisk instruktion (ADD, INC osv)
eller en Logisk instruktion (AND, XOR). Man klarar sig oftast med de två översta villkorliga hoppen JZ och
JNZ. Observera att många av instruktionerna hoppar vid samma tillfälle (betyder samma sak), se
flaggvillkoren.
Sub Bl, Ah ;dra ifrån ah från bl
jnz Kalle ;hoppa till labeln Kalle om resultatet ej blev noll
...
Kalle:
LOOP
Kontrollerad upprepning. Loopar till en label. LOOP minskar CX med 1 och om resultatet ej är 0,
utförs hopp till labeln.
mov Cx, 50 ;ladda Cx med antal varv som loopen skall snurra
Dennis: . . .
. . .
. . .
loop Dennis ; loopar 50 ggr till Dennis
Villkorliga loopar
(jämför villkorliga hopp)
LOOPE / LOOPZ
Loopar till label om Cx inte är noll (som loop) och om zf = 1
LOOPNE / LOOPNZ
Loopar till label om Cx inte är noll och om zf = 0
INT
Utför ett interrupt (avbrott)
int immed int 10h ;utför interrupt 10h
IRET
Återhopp från interrupt, används när man skriver egna avbrottsrutiner. Dessa fungerar ungefär
som subrutiner men kan utföras när som helst (tex när man rör tangentbordet, tangentbordsinterrupt).
Processorkontrollerande instruktioner
Betydelse Flaggvillkor
CLC CLear Carryflag, nollställer cf i flaggregistret cf = 0
CLD CLear Directionflag, riktning framåt vid t ex stos df = 0
CLI CLear Interruptflag, tillåt inga interrupt if = 0
CMC CoMplementera Carryflaggan cf = NOT(cf)
STC SeT Carryflag, ettställer cf i flaggregistret cf = 1
STD SeT Directonflag, riktning bakåt vid t ex movs df = 1
STI SeT Interruptflag, tillåt avbrott if = 1
HLT HaLT, processorn upphör utföra instruktioner
Det var alla instruktioner som jag tycker är viktiga. Det finns massor till men man klarar sig utmärkt med de
här. Om du vill veta mer om de andra instruktionerna så gå till närmaste bibliotek eller internetanslutning
och fördjupa dig. Man behöver inte kunna alla instruktioner som finns i listan utantill, det är meningen att
listan skall fungera som en referens, men det är bra om man åtminstone läst igenom alla så man vet vad
som finns.
950519 Albert Veli
e-mail: dat94avi@bilbo.mdh.se