第九章 转移指令的原理
可以修改IP 或同事修改CS和IP的指令统称为转移指令
9.1 操作符offset
操作符offset用于标记偏移的地址:
assume cs:codesg
codesg segment
start :
mov ax offset start ;相当于mov ax, 0
s:
mov ax,offset s ;相当于 mov ax,3
codesg ends
end start
9.2 jmp 指令
jmp 为无条件转移指令,可以修改cs和ip,jmp指令要给出两种信息
- 转移的目的地址
- 转移的距离(段间转移、段内转移,段内近距离转移)
9.3 依据位移进行转移的jmp指令
jmp short 标号(转到标号处执行命令)
这种格式的jmp叫段内转移, 对IP的修改范围为-128~127, 8位标号
assume cs:codesg
codesg :segment
start:
mov ax,0
jmp short s; 直接调转到s:处执行,执行inc ax后结束
add ax,1
s:
inc ax
codesg ends
end start
计算方法如图说是。 EB指令为当前IP + 后面的值, 例如EB03 为IP = IP + 03 这个03 是程序在编译的时候确定的。
类似的指令还有 jmp near ptr 标号 ,他的范围比较大 在-32768~32767范围内。16位标号
9.4 转移的目的地址在指令中的jmp指令
jmp far ptr 符号
是实现段间转移
可以看出 jmp指令对应的机器码为EA0B01BD0B 直接jmp 到0BBD:010B上。
可以修改IP以及CS
9.5 转移地址在寄存器中的jmp指令
jmp ax ;把ip修改为ax
9.6 转移地址在内存中的jmp指令
- jmp word ptr 内存单元地址(段内转移)
mov ax,0213h
mov ds:[0], ax
jmp word ptr ds:[0]
执行后 ip = 0123h 2. jmp dword ptr 内存单元地址(段间转移)
mov ax, 0123h
mov ds:[0], ax
mov word ptr ds:[2],0
jmp dword ptr ds:[0]
执行后 CS:IP指向 0000:0123
从ds:[0]取4个字节,ds:[0]=23 ds:[1]=01 ds:[2]=00 ds:[3]=00
9.7 jcxz指令
jcxz 全称为 jmp cx equal zero
jcxz 标号
:顾名思义就是如果cx==0, 则跳转 jmp short 标号
9.8 loop指令
loop指令为循环指令,所有的循环为短转移,ip修改范围在-128~127之间
loop 标号
的作用如下
- (cx) = (cx) - 1
- 如果 cx != 0, ip = ip + 标号