程序员人生 网站导航

8086汇编指令总结

栏目:互联网时间:2014-11-20 08:59:12

经过学习,对8086汇编经常使用指令进行了以下总结:

(1).mov : 移动数据

例如:

mov ax, 8h ;mov 寄存器,常量 mov ax, bx ;mov 寄存器,寄存器 mov ax, ds:[0] ;mov 寄存器,内存单元 mov ds:[0], ax ;mov 内存单元,寄存器 mov ds, ax ;mov 段寄存器,寄存器 mov word ptr ds:[0], 8h ;mov (内存单元大小声明) 内存单元, 常量 sk: mov ax, offset sk ;mov 寄存器,标号偏移地址 mov byte ptr ds:[0], offset sk ;mov 内存单元,标号偏移地址

易错点:

mov ds:[0], ds:[1] ;mov 内存单元,内存单元(非法指令) mov ds, 8h ;mov 段寄存器,常量(非法指令) mov ds, es ;mov 段寄存器,段寄存器(非法指令) mov ds, offset sk ;mov 段寄存器,标号偏移地址(非法指令) mov [0], ax ;常量偏移地址不可省略默许ds,必须作段地址声明(非法指令)


(2).add:增加数据值,用法同mov类似

(3).sub:减少数据值,用法同mov类似


(4).push:入栈,栈顶指针(sp)=(sp)+2,,并将1个字数据存入sp所指内存单元

例如:

push ax ;push 寄存器 push ds:[0] ;push 内存单元
易错点:

push al ;push 寄存器(高/低)字节(非法指令),必须是1个字,16位数据 push 8h ;push 常量(非法指令)

(5).pop:出栈,读取1个字sp所指的内存单元,并使栈顶指针(sp)=(sp)⑵

例如:

pop ax ;pop 寄存器 pop ds:[0] ;pop 内存单元

易错点:

pop al ;pop 寄存器(高/低)字节(非法指令),必须是1个字,16位数据 pop 8h ;pop 常量(非法指令)

(6).inc:数据值+1, dec:数据值⑴

例如:

inc ax ;inc 寄存器 inc byte ptr ds:[0] ;inc (大小声明)内存单元 dec ax ;dec 寄存器 dec byte ptr ds:[0] ;dec (大小声明)内存单元

易错点:

inc 8h ;inc 常量(非法指令) dec 8h ;dec 常量(非法指令)

(7).jmp:无条件转移指令

例如:

s: jmp short s ;段内短转移,jmp short 标号,IP修改范围⑴28~127 jmp near ptr s ;段内近转移,jmp near ptr 标号, IP修改范围⑶2768~32767 ;以上两条指令的实质为保存IP到标号的偏移距离,注意正确使用 jmp far ptr s ;段间转移(远转移),jmp far ptr s, 修改CS:IP为标号的段地址:偏移地址 jmp ax ;段内转移,jmp 16位reg, (IP)=(16位reg) jmp word ptr ds:[0] ;段内转移,jmp word ptr 内存单元地址, ;(IP)=(内存单元地址处双字节内存) jmp dword ptr ds:[0] ;段间转移,jmp dword ptr 内存单元地址, ;(IP)=(内存单元地址处低16位内存数据),(CS)=(内存单元地址处高16位内存数据)

易错点:

jmp 1000:0 ;想转移到(cs:ip)=(1000:0)处(非法指令) jmp offset s ;想转移到标号s处(非法指令)

(8).jcxz:有条件转移指令,等价于
if((cx)==0) jmp short 标号;


(9).loop:循环指令,等价于

(cx)--; if((cx)!=0)jmp short 标号;

(10).and:2进制与运算,同mov,add,sub用法相似

(11).or:2进制或运算, 同mov,add,sub用法相似

例如:

and ds:[0], 1111h ;and 内存单元 and ax, 1111h ;and 16位寄存器 常量 and al, 11111110b ;and 8位寄存器 常量(第0位设为0) and ax, bx ;and 16位寄存器,16位寄存器 ;等等... or ds:[0], 1111h ;or 内存单元 or ax, 1111h ;or 16位寄存器 常量 or al, 00000001b ;or 8位寄存器 常量(第0位设为0) or ax, bx ;or 16位寄存器,16位寄存器 ;等等...

(12).mul:乘法指令

;(1)两个相乘的数:两个相乘的数,要末都是8位,要末都是16位。如果是8位, ;1个默许放在AL中,另外一个放在8位reg或内存字节单元中;如果是16位,1个默许在 ;AX中,另外一个放在16位reg或内存单元中。 ;(2)结果:如果是8位乘法,结果默许放在AX中;如果是16位乘法,结果高位默许在 ;DX中寄存,低位在AX中放。 ;计算100*10 mov al, 100 mov bl, 10 mul bl ;结果:(ax)=1000(03E8h) ;计算100*10000 mov ax, 100 mov bx, 10000 mul bx ;结果:(ax)=4240H, (dx)=000FH (F4240H=1000000)

(13).div:除法指令

;除数:有8位和16位两种,在1个reg或内存单元中 ;被除数:默许放在AX或DX和AX中,如果除数为8位,被除数则为16位, ;默许在AX中寄存;如果除数为16位,被除数位32位,在DX和AX中寄存,DX存 ;放高16位,AX寄存低16位 ;结果:如果除数为8位,则AL存储除非操作的商,AH存储除非操作的余数; ;如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数 ;计算100001/100 mov dx, 1 mov ax, 86A1H ;(dx)*10000H+(ax)=100001 mov bx, 100 div bx ;结果:(ax)=03E8H(即1000),(dx)=1(余数为1) ;计算1001/100 mov ax, 1001 mov bl, 100 div bx ;结果:(al)=0AH(即10),(ah)=1(余数为1)

(14)call 标号:等价于

push IP jmp near ptr 标号

(15)ret : 等价于

pop IP
因此常如此配合使用:

call program1 program1: ;........ ret

(16)call far ptr 标号:等价于

push CS push IP jmp far ptr 标号

(17).retf:等价于

pop IP pop CS
因此常如此配合使用:

call far ptr program2 program2: ;........ retf

(18)call word ptr 内存地址:等价于

push IP jmp word ptr 内存地址 ;例如: mov sp, 10h mov ax, 0123h mov ds:[0], ax call word ptr ds:[0] ;结果:(IP)=0123H, (SP)=0EH

(19)call dword ptr 内存地址:等价于

push CS push IP jmp dword ptr 内存单元地址 ;例如: mov sp, 10h mov ax, 0123h mov ds:[0], ax mov word ptr ds:[2], 0 call dword ptr ds:[0] ;结果:(CS)=0,(IP)=0123H,(sp)=0CH

(20)shl:逻辑左移指令

;(1)将1个寄存器或内存单元中的数据向左移位; ;(2)将最后移出的1位写入CF中 ;(3)最低位用0补充 ;例如: mov al, 01001000b shl al, 1 ;结果:(al)=10010000b, CF=0 ;若移动位数大于1,则必须将移动位数放在cl中 mov al, 01010001b mov cl, 3 shl al, cl ;结果:(al)=10001000b, 由于最后移除的1位是0,所以CF=0


(21)shr:逻辑右移指令

;(1)将1个寄存器或内存单元中的数据向右移位; ;(2)将最后移出的1位写入CF中 ;(3)最高位用0补充 ;例如: mov al, 10000001b shr al, 1 ;结果:(al)=01000000b, CF=0 ;若移动位数大于1,则必须将移动位数放在cl中 mov al, 01010001b mov cl, 3 shr al, cl ;结果:(al)=00001010b, 由于最后移除的1位是0,所以CF=0

(22)int 常量:中断例程


总结:

由上述可以看出8086汇编有以下语法规律:

(1)指令格式有3种情势:

指令   目标   源

指令   目标

指令

(2)除int指令外,“目标”不能为常量

(3)当“目标”为段寄存器时,“ 源”只能为寄存器

(4)"目标“和"源"所占的内存字节大小应保证相同,

当双方显式知晓内存字节大小时,若不相同,则没法通过编译,

当唯一1方知晓内存字节大小时,数据处理则按该方内存字节大小计算,

当双方都不知晓内存字节大小时,利用byte/word/dword ptr显示声明,其中dword ptr仅用于1些特殊指令。

(5)转移指令有直接设置和位移偏移两种,其中位移偏移有距离限制。





------分隔线----------------------------
------分隔线----------------------------

最新技术推荐