一、转移指令
只修改IP 叫做段内转移;
短转移:ip修改氛围-128~127
近转移:ip修改范围-32768~32767
修改CS和IP叫做段间转移;
转移指令氛围:
无条件跳转 jmp;
条件跳转 jcxz;
循环指令 loop;
过程;
中断;
操作符offset 标号 (取得标号出的偏移地址)
二、依据位移的jmp指令原理
jmp指令要给出两种信息;
转移的目的地址和转移的距离;(转移距离就相当于指出段间转移、段内段转移还是段内近转移);
1、jmp short 标号;
实现的是段内短转移;对ip的修改氛围是-128~127;比如说:
assume cs: code
code segment
start mov ax,0
jmp short s
add ax,1
s: inc ax
code ends
end start
jmp的指令和机器代码分析;
assume cs:code
code segment
start:
mov ax,0
mov bx,0
jmp short s
add bx ,1
s:
inc ax;
code ends
end start
这个代码的机器码是:
可以看出来,jmp short s 转换为了jmp 000B ,也就是s编号的汇编地址;
而jmp指令的机器码是EB03;
代码的执行过程:
- 首先代码是从0BBD:0000开始执行;
- 执行第一条指令是,首先取指 mov ax,0,然后IP加上指令的长度也就是+3
- 然后cpu就会在指令缓冲器中开始执行
- 依次到(cs)=0BBDH,(ip)=0006H,取得的指令是EB03;然后指令码进入指令缓冲器
- ip=ip+2,cs:ip指向吓一跳指令也就是 0BBDH:0008的位置;
- 然后CPU开始执行EB03;
- 执行完EB03后,ip由0008H变成了000BH;
实际上 jmp short 标号 的功能是:(IP) =(ip) +8位的位移;
八位的位移=标号出的地址-jmp指令后的第一个字节的地址;
比如说:上面jmp后一个字节的地址是:0BBD7,标号的地址是0BBBD;
这个03 也是是0B-08的结果,也就是S标号位置的地址-下一个字节的地址;
类似的:
2、jmp near ptr 标号
实现的是段内的近转移;
三、转移的目的地址在指令中的jmp指令原理
1、jmp far ptr 标号
start:mov ax,0
mov bx,0
jmp far ptr s
db 256 dup (0)
s: add ax ,1
inc ax
jmp far ptr s 的机器码是EA0B01BD0B ,其中目的地址是0B 01 BD 0B;
高位BD 0B是段地址:0BBDH;
地位0B 01是偏移地址:010BH;
四、转移地址在内存单元中的jmp指令
一共有两种格式:
1、jmp word ptr 内存单元地址;
属于段内转移
2、jmp dword ptr 内存单元地址;
属于段间转移;
五、jcxz指令
有条件跳转指令:
jcxz 标号;(判断cx=0时,跳转到标号位置往下执行);
其实“jcxz 标号”相当于:
if((cx)==0) jmp short 标号;
所有的有条件跳转指令都是短转移,对于的机器码中包含转移的位移,而不是目的地址;对ip的修改范围是-128~127;
六、loop指令
所有的 循环指令都属于短转移;
“loop 标号”相当于:
(cx)--;
if((cx)!=0) jmp short 标号;