欢迎关注博主的公众号:薛定谔的小鱼儿
转移指令:可以修改IP或同时修改CS和IP的指令统称为转移指令。
短转移IP的修改范围:-128——127
近转移IP的修改范围:-32768——32767
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
2.jmp指令
jmp为无条件转移指令,可以只修改IP,也可以同时修改CS和IP
jmp指令要给出两种信息:
(1)转移的目的地址
(2)转移的距离(段间转移,段内短转移,段内近转移)
1)jmp short 标号(转移到标号位置执行指令)
例:
assume cs:codesg
codesg segment
start : mov ax,0
jmp short,s
add ax,1
s: inc ax
codesg ends
end start
上面的程序执行完,ax=1,因为执行了jmp short,s,直接跳到inc ax,不会执行add ax,1
2)转移的目的地址在指令中的jmp指令
“jmp far ptr 标号”实现的是段间转移,又称为远转移。far ptr指明了用标号的段地址和偏移地址修改CS和IP
例子:
assume cs:codesg
codesg segment
start:mov ax,0
mov bx,0
jmp far ptr s
db 256 dup (0)
s: add ax,1
inc ax
codesg ends
end start
3)jmp word ptr 内存单元地址(段内转移)
从内存单元地址处开始存放一个字,是转移的目的偏移地址
例:
mov ax,0123H
mov ds:[0],ax
jmp word ptr ds:[0]
执行后,(IP)=0123H
4)jmp dword ptr 内存单元地址(段间地址)
从内存单元地址处开始存放两个字,高地址的字是转移的目的段地址,低地址处是转移的目的偏移地址。
mov ax,0123H
mov ds:[0],ax
mov word ptr ds:[2],0
jmp dword ptr ds:[0]
执行后,(CS)=0,(IP)=0123H
3.jcxz指令
jcxz指令为有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址,对IP的修改范围为:-128——127
jcxz 标号
相当于 if ((cx)==0) jmp short 标号;
例(本实例利用jcxz实现在内存2000H段中查找第一个值为0的字节,找到后把它的偏移地址存储在dx中。
asuume cs:code
code segment
start: mov ax,2000H
mov ds,ax
mov bx,0
s: mov cl,[bx]
mov ch,0
jcxz ok
inc bx
jmp short s
ok : mov dx,bx
mov ax,4c00H
int 21H
code ends
end start