最近学习了X86汇编,其实无论是古老的8086还是现在i3/5/7/9,Xeon3/5,在最基本原理上,都是相通的,只是CPU位数,寻址空间,寄存器个数,指令集的扩充等方面有所不同,对于学习,8086永不过时。

转移指令
1.转移指令分类:
(1)无条件转移指令,如: jmp
(2)条件转移指令
(3)循环指令,如: loop
(4)过程
(5)中断

操作符
1.offset
释义:由编译器处理的符号,功能是取得标号的偏移地址
start: mov ax,offset start ;相当于mov ax, 0
s: mov ax, offset s ;相当于mov ax, 3

高级指令
1.jmp指令
释义: 无条件转移指令,可以只修改IP,也可以同时修改CS和IP。
jmp指令要给出两种信息:
(1)转移的目的地址
(2)转移的距离(段时间转移、段内短转移,段内近转移)
1)依据位移进行转移的jmp指令:
jmp short 标号(转到标号处执行指令)
这种指令格式的jmp指令实现的是段内转移,它对IP的修改范围是:-128 ~ 127,也就是说,它向前转移时最多128字节,向后最多127.
jmp near ptr 标号,功能为:(IP)= (IP)+ 16
2)转移的目的地址在指令中的jmp指令
jmp far ptr 标号,实现段间转移,又称远转移
(CS) = 标号所在段的段地址,(IP) = 标号在段中的偏移地址
far ptr指明了指令用标号的段地址和偏移地址修改CS和IP
3)转移地址在寄存器中的jmp指令
指令格式:jmp 16位 reg
4)转移地址在内存中的jmp指令
jmp word ptr 内存单元地址(段内转移) ;功能:从内存单元地址处开始存放一个字,是转移的目的偏移地址
内存单元地址可用寻址方式的任一格式给出
jmp dword ptr 内存单元地址(段间转移) ;功能:从内存单元地址处开始存放两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。

2.jcxz指令
jcxz指令是有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对于IP的修改范围都是:-128 ~ 127
指令格式:jcxz 标号

3.loop指令
loop指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都是:-128 ~ 127。
指令格式:loop 标号

3.call指令
执行call指令时,进行两步操作
(1)将当前IP或CS和IP压入栈,(sp) = (sp)-2 , ((ss)*16 + (sp)) = IP
(2)转移, (IP) = (IP)+ 16
指令格式:call 标号
call指令不能实现短转移,除此之外,call和jmp原理相同。
call far ptr 标号 ;实现段间转移
call 16位reg ;转移地址在寄存器中的call指令
call word ptr 内存单元地址 ;转移地址在内存单元中的call指令
call dword ptr 内存单元地址 ;转移地址在内存单元中的call指令

4.ret指令
ret指令用栈中的数据,修改IP的内容,从而实现近转移
指令格式:ret

5.retf指令
retf指令用栈中的数据,修改CS和IP的内容,从而实现元转移
指令格式:retf

6.movsb指令
将ds:si指向的内存单元中的字节送入es:di,然后根据df值递增或递减
执行movsb指令相当于:
(1)((es)16 + (di)) = ((ds)16 + (si))
(2)如果df=0则:(si) = (si)+1, (di)=(di)+1
如果df=1则:(si) = (si)-1, (di)=(di)-1
指令格式:movsb
相关指令:movsw、cld(df置0)、std(df置1)

7.pushf
将标志寄存器的值压栈

8.popf
从栈中弹出数据,放入标志寄存器

9.int指令
银发中断过程
指令格式:int n
执行过程:
(1)取中断号n
(2)标志寄存器入栈,IF=0,TF=0
(3)CS、IP入栈
(4)(IP) = (n4) , (CS)=(n4 +2)

10.iret指令
中断返回
指令格式:iret
int指令和iret指令的配合使用,与call和ret指令的配合使用类似。

11.in指令
读端口
in al,20h

12.out指令
写端口
out 20h,al

13.shl和shr指令
shl是左移指令,shr是右移指令
shl al,1 ;将al中的数据左移一位
shr al,1 ;将al中的数据右移一位