8086匯編指令總結(jié)
來源:程序員人生 發(fā)布時(shí)間:2014-11-20 08:59:12 閱讀次數(shù):3095次
經(jīng)過學(xué)習(xí),對(duì)8086匯編經(jīng)常使用指令進(jìn)行了以下總結(jié):
(1).mov : 移動(dòng)數(shù)據(jù)
例如:
mov ax, 8h ;mov 寄存器,常量
mov ax, bx ;mov 寄存器,寄存器
mov ax, ds:[0] ;mov 寄存器,內(nèi)存單元
mov ds:[0], ax ;mov 內(nèi)存單元,寄存器
mov ds, ax ;mov 段寄存器,寄存器
mov word ptr ds:[0], 8h ;mov (內(nèi)存單元大小聲明) 內(nèi)存單元, 常量
sk: mov ax, offset sk ;mov 寄存器,標(biāo)號(hào)偏移地址
mov byte ptr ds:[0], offset sk ;mov 內(nèi)存單元,標(biāo)號(hào)偏移地址
易錯(cuò)點(diǎn):
mov ds:[0], ds:[1] ;mov 內(nèi)存單元,內(nèi)存單元(非法指令)
mov ds, 8h ;mov 段寄存器,常量(非法指令)
mov ds, es ;mov 段寄存器,段寄存器(非法指令)
mov ds, offset sk ;mov 段寄存器,標(biāo)號(hào)偏移地址(非法指令)
mov [0], ax ;常量偏移地址不可省略默許ds,必須作段地址聲明(非法指令)
(2).add:增加數(shù)據(jù)值,用法同mov類似
(3).sub:減少數(shù)據(jù)值,用法同mov類似
(4).push:入棧,棧頂指針(sp)=(sp)+2,,并將1個(gè)字?jǐn)?shù)據(jù)存入sp所指內(nèi)存單元
例如:
push ax ;push 寄存器
push ds:[0] ;push 內(nèi)存單元
易錯(cuò)點(diǎn):
push al ;push 寄存器(高/低)字節(jié)(非法指令),必須是1個(gè)字,16位數(shù)據(jù)
push 8h ;push 常量(非法指令)
(5).pop:出棧,讀取1個(gè)字sp所指的內(nèi)存單元,并使棧頂指針(sp)=(sp)⑵
例如:
pop ax ;pop 寄存器
pop ds:[0] ;pop 內(nèi)存單元
易錯(cuò)點(diǎn):
pop al ;pop 寄存器(高/低)字節(jié)(非法指令),必須是1個(gè)字,16位數(shù)據(jù)
pop 8h ;pop 常量(非法指令)
(6).inc:數(shù)據(jù)值+1, dec:數(shù)據(jù)值⑴
例如:
inc ax ;inc 寄存器
inc byte ptr ds:[0] ;inc (大小聲明)內(nèi)存單元
dec ax ;dec 寄存器
dec byte ptr ds:[0] ;dec (大小聲明)內(nèi)存單元
易錯(cuò)點(diǎn):
inc 8h ;inc 常量(非法指令)
dec 8h ;dec 常量(非法指令)
(7).jmp:無條件轉(zhuǎn)移指令
例如:
s: jmp short s ;段內(nèi)短轉(zhuǎn)移,jmp short 標(biāo)號(hào),IP修改范圍⑴28~127
jmp near ptr s ;段內(nèi)近轉(zhuǎn)移,jmp near ptr 標(biāo)號(hào), IP修改范圍⑶2768~32767
;以上兩條指令的實(shí)質(zhì)為保存IP到標(biāo)號(hào)的偏移距離,注意正確使用
jmp far ptr s ;段間轉(zhuǎn)移(遠(yuǎn)轉(zhuǎn)移),jmp far ptr s, 修改CS:IP為標(biāo)號(hào)的段地址:偏移地址
jmp ax ;段內(nèi)轉(zhuǎn)移,jmp 16位reg, (IP)=(16位reg)
jmp word ptr ds:[0] ;段內(nèi)轉(zhuǎn)移,jmp word ptr 內(nèi)存單元地址,
;(IP)=(內(nèi)存單元地址處雙字節(jié)內(nèi)存)
jmp dword ptr ds:[0] ;段間轉(zhuǎn)移,jmp dword ptr 內(nèi)存單元地址,
;(IP)=(內(nèi)存單元地址處低16位內(nèi)存數(shù)據(jù)),(CS)=(內(nèi)存單元地址處高16位內(nèi)存數(shù)據(jù))
易錯(cuò)點(diǎn):
jmp 1000:0 ;想轉(zhuǎn)移到(cs:ip)=(1000:0)處(非法指令)
jmp offset s ;想轉(zhuǎn)移到標(biāo)號(hào)s處(非法指令)
(8).jcxz:有條件轉(zhuǎn)移指令,等價(jià)于
if((cx)==0) jmp short 標(biāo)號(hào);
(9).loop:循環(huán)指令,等價(jià)于
(cx)--;
if((cx)!=0)jmp short 標(biāo)號(hào);
(10).and:2進(jìn)制與運(yùn)算,同mov,add,sub用法相似
(11).or:2進(jìn)制或運(yùn)算, 同mov,add,sub用法相似
例如:
and ds:[0], 1111h ;and 內(nèi)存單元
and ax, 1111h ;and 16位寄存器 常量
and al, 11111110b ;and 8位寄存器 常量(第0位設(shè)為0)
and ax, bx ;and 16位寄存器,16位寄存器
;等等...
or ds:[0], 1111h ;or 內(nèi)存單元
or ax, 1111h ;or 16位寄存器 常量
or al, 00000001b ;or 8位寄存器 常量(第0位設(shè)為0)
or ax, bx ;or 16位寄存器,16位寄存器
;等等...
(12).mul:乘法指令
;(1)兩個(gè)相乘的數(shù):兩個(gè)相乘的數(shù),要末都是8位,要末都是16位。如果是8位,
;1個(gè)默許放在AL中,另外一個(gè)放在8位reg或內(nèi)存字節(jié)單元中;如果是16位,1個(gè)默許在
;AX中,另外一個(gè)放在16位reg或內(nèi)存單元中。
;(2)結(jié)果:如果是8位乘法,結(jié)果默許放在AX中;如果是16位乘法,結(jié)果高位默許在
;DX中寄存,低位在AX中放。
;計(jì)算100*10
mov al, 100
mov bl, 10
mul bl
;結(jié)果:(ax)=1000(03E8h)
;計(jì)算100*10000
mov ax, 100
mov bx, 10000
mul bx
;結(jié)果:(ax)=4240H, (dx)=000FH (F4240H=1000000)
(13).div:除法指令
;除數(shù):有8位和16位兩種,在1個(gè)reg或內(nèi)存單元中
;被除數(shù):默許放在AX或DX和AX中,如果除數(shù)為8位,被除數(shù)則為16位,
;默許在AX中寄存;如果除數(shù)為16位,被除數(shù)位32位,在DX和AX中寄存,DX存
;放高16位,AX寄存低16位
;結(jié)果:如果除數(shù)為8位,則AL存儲(chǔ)除非操作的商,AH存儲(chǔ)除非操作的余數(shù);
;如果除數(shù)為16位,則AX存儲(chǔ)除法操作的商,DX存儲(chǔ)除法操作的余數(shù)
;計(jì)算100001/100
mov dx, 1
mov ax, 86A1H ;(dx)*10000H+(ax)=100001
mov bx, 100
div bx
;結(jié)果:(ax)=03E8H(即1000),(dx)=1(余數(shù)為1)
;計(jì)算1001/100
mov ax, 1001
mov bl, 100
div bx
;結(jié)果:(al)=0AH(即10),(ah)=1(余數(shù)為1)
(14)call 標(biāo)號(hào):等價(jià)于
push IP
jmp near ptr 標(biāo)號(hào)
(15)ret : 等價(jià)于
pop IP
因此常如此配合使用:
call program1
program1:
;........
ret
(16)call far ptr 標(biāo)號(hào):等價(jià)于
push CS
push IP
jmp far ptr 標(biāo)號(hào)
(17).retf:等價(jià)于
pop IP
pop CS
因此常如此配合使用:
call far ptr program2
program2:
;........
retf
(18)call word ptr 內(nèi)存地址:等價(jià)于
push IP
jmp word ptr 內(nèi)存地址
;例如:
mov sp, 10h
mov ax, 0123h
mov ds:[0], ax
call word ptr ds:[0]
;結(jié)果:(IP)=0123H, (SP)=0EH
(19)call dword ptr 內(nèi)存地址:等價(jià)于
push CS
push IP
jmp dword ptr 內(nèi)存單元地址
;例如:
mov sp, 10h
mov ax, 0123h
mov ds:[0], ax
mov word ptr ds:[2], 0
call dword ptr ds:[0]
;結(jié)果:(CS)=0,(IP)=0123H,(sp)=0CH
(20)shl:邏輯左移指令
;(1)將1個(gè)寄存器或內(nèi)存單元中的數(shù)據(jù)向左移位;
;(2)將最后移出的1位寫入CF中
;(3)最低位用0補(bǔ)充
;例如:
mov al, 01001000b
shl al, 1
;結(jié)果:(al)=10010000b, CF=0
;若移動(dòng)位數(shù)大于1,則必須將移動(dòng)位數(shù)放在cl中
mov al, 01010001b
mov cl, 3
shl al, cl
;結(jié)果:(al)=10001000b, 由于最后移除的1位是0,所以CF=0
(21)shr:邏輯右移指令
;(1)將1個(gè)寄存器或內(nèi)存單元中的數(shù)據(jù)向右移位;
;(2)將最后移出的1位寫入CF中
;(3)最高位用0補(bǔ)充
;例如:
mov al, 10000001b
shr al, 1
;結(jié)果:(al)=01000000b, CF=0
;若移動(dòng)位數(shù)大于1,則必須將移動(dòng)位數(shù)放在cl中
mov al, 01010001b
mov cl, 3
shr al, cl
;結(jié)果:(al)=00001010b, 由于最后移除的1位是0,所以CF=0
(22)int 常量:中斷例程
總結(jié):
由上述可以看出8086匯編有以下語(yǔ)法規(guī)律:
(1)指令格式有3種情勢(shì):
指令 目標(biāo) 源
指令 目標(biāo)
指令
(2)除int指令外,“目標(biāo)”不能為常量
(3)當(dāng)“目標(biāo)”為段寄存器時(shí),“ 源”只能為寄存器
(4)"目標(biāo)“和"源"所占的內(nèi)存字節(jié)大小應(yīng)保證相同,
當(dāng)雙方顯式知曉內(nèi)存字節(jié)大小時(shí),若不相同,則沒法通過編譯,
當(dāng)唯一1方知曉內(nèi)存字節(jié)大小時(shí),數(shù)據(jù)處理則按該方內(nèi)存字節(jié)大小計(jì)算,
當(dāng)雙方都不知曉內(nèi)存字節(jié)大小時(shí),利用byte/word/dword ptr顯示聲明,其中dword ptr僅用于1些特殊指令。
(5)轉(zhuǎn)移指令有直接設(shè)置和位移偏移兩種,其中位移偏移有距離限制。
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)