汇编
指令相关部分。
转移指令
- 可以修改IP,或同时修改CS和IP的指令统称为转移指令
- 换而言之,转移指令就是可以控制CPU执行内存中某处代码的指令
- 8086CPU转移指令
- 只修改IP,如:jmp ax
- 同时修改CS和IP,为段间转移,如:jmp 1000:0
- 根据对IP的修改范围,可分为
- 短转移:-128~127
- 近转移:-32768~32767
- 分类
- 无条件转移指令
- 条件转移指令
- 循环指令
- 过程
- 中断
offset
- offset在汇编中是由编译器处理的符号
- 功能是取得标号的偏移地址
jmp指令
- 无条件转移指令
- 可以只修改IP,也可以同时修改CS和IP
- jmp给出的信息
- 转移的目的地址
- 转移的距离(段间转移、段内短转移、段内近转移)
dmp根据位移进行转移
jmp short 标号
(转到标号处执行指令)- 段内短转移,对IP的修改范围为-128~127,即向前转移时可以最多越过128个字节,向后转移可以最多越过127个字节
- 转移指令结束后,CS:IP应该指向标号处的指令
jcxz
- 有条件转移指令,所有的有条件转移指令都是短转移
- 在对应的机器码中包含转移的位移,而不是目的地址
- 对IP的修改范围为:-128~127
jcxz 标号
:如果(cx)=0,转移到标号处执行,当(cx)!=0时,什么也不做- 当(cx)=0时,(ip)=(ip)+8位位移
- 8位位移=标号处的地址-jcxz指令后的第一个字节的地址
- 8位位移的范围为:-128~127,用补码表示
- 8位位移由编译程序在编译时算出
loop
- 循环指令,所有的循环指令都是短转移
- 在对应的机器码中包含转移的位移,而不是目的地址
- 对IP的修改范围为:-128~127
loop 标号
:(cx)=(cx)-1,如果(cx)!=0,转移到标号处执行- (cx)=(cx)-1
- 如果(cx)!=0,(ip)=(ip)+8
- 8位位移=标号处的地址-loop指令后的第一个字节的地址
- 8位位移的范围为:-128~127,用补码表示
- 8位位移由编译程序在编译时算出
位移转移的意义
1 2 3 4 5 |
jmp short 标号 jmp near ptr 标号 jcxz 标号 loop 标号 |
- 它们对IP的修改是根据转移目的地址和转移起始地址之间的位移来进行的
- 在它们对应的机器码中不包含转移的目的地址,而是包含的是目的地址的位移
ret
- 转移指令,可以修改IP或同时修改CS和IP
- ret用栈中的数据,修改IP的内容,从而实现近转移
- 执行ret指令
- (ip)=((ss)*16+(sp))
- (sp)=(sp)+2
- CPU执行ret指令,用汇编解释
pop IP
retf
- 转移指令,可以修改IP或同时修改CS和IP
- retf用栈中的数据,修改CS和IP的内容,从而实现远转移
- 执行retf指令
- (ip)=((ss)*16+(sp))
- (sp)=(sp)+2
- (cs)=((ss)*16+(sp))
- (sp)=(sp)+2
- CPU执行retf指令,用汇编解释
pop IP
pop CS
call
- CPU执行call指令时,要进行两步操作
- 将当前的IP或CS和IP压入栈中
- 转移
1 2 3 4 5 |
//1. (sp)=(sp)-2 ((ss)*16+(sp))=(IP) //2. (IP)=(IP)+16 |
- call指令不能实现短转移
- call指令实现转移的方法和jmp指令的原理相同
依据位移进行转移的call指令
call 标号
- 将当前的IP压栈后,转到标号处执行指令
转移的目的地址在指令中的call指令
- call far ptr 标号
- 实现的是段间转移
1 2 3 4 5 6 7 8 |
//1. (sp)=(sp)-2 ((ss)*16+(sp))=(CS) (sp)=(sp)-2 ((ss)*16+(sp))=(IP) //2. (CS)=标号所在段的段地址 (IP)=标号所在段的偏移地址 |
转移地址在寄存器中的call指令
- call 16位reg
1 2 3 |
(sp)=(sp)-2 ((ss)*16+(sp))=(IP) (IP)=(16位reg) |
转移地址在内存中的call指令
第一种
- call word ptr 内存单元地址
1 2 3 |
//汇编语法 push IP jmp word ptr 内存单元地址 |
第二种
- call dword ptr 内存单元地址
1 2 3 4 |
//汇编语法 push CS push IP jmp dword ptr 内存单元地址 |
mul
- 乘法指令
- 两个相乘的数,要么都是8位,要么都是16位。
- 如果是8位,一个默认放在AL中,另一个放在8位reg或内存字节单元中
- 如果是16位,一个默认放在AX中,另一个放在16位reg或内存字单元中
- 如果是8位乘法,结果默认放在AX中;如果是16位乘法,结果默认高位默认放在DX中,低位放在AX中。
1 2 |
mul reg mul 内存单元 |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 定位内存与数据处理03/31
- ♥ x86_64汇编学习记述二08/07
- ♥ 汇编记述二08/07
- ♥ x86_64汇编学习记述一08/06
- ♥ X86_64汇编学习记述四08/09
- ♥ 汇编记述一08/04