汇编,条件转移指令怎么超出-128~+127的转移
条件转移指令本身只能跳转-127~+128之间的地址,但如果需要超出这一范围该怎么做,麻烦举一个例子
在力所能及的范围内,写一个标号,跳到此处后,再写一个转移指令,转移到目的地,即可。
https://blog.csdn.net/abc_12366/article/details/79685102
本章主要介绍jmp指令
操作符offset
offset是写给编译器看的编译器处理符号,它的功能是取得标号处的偏移地址
assume cs:codesg
codesg segment
start:mov ax, offset start ;相当于 mov ax, 0
s:mov ax, offset s ;相当于 mov ax, 3
coedsg ends
end start
1
2
3
4
5
6
在上面的程序中,offset操作符取得了标号start和s的偏移地址0和3
jmp指令
jmp是无条件转移指令,可以只修改IP,也可以同时修改CS和IP的值
jmp指令给出两个信息:1)转移的目的地址,2)转移的距离(断段间转移、段内短转移、段内近转移)
根据位移进行转移
jmp short 标号(转到标号处执行指令)
1
这种格式的转移指令实现了段内短转移,它的IP的修改范围为-127~128(向下为正、向上为负,原地为0)
assume cs:codesg
codesg segment
start:mov ax, 0
jmp short s
add ax, 1
s:inc ax
codesg ends
end start
1
2
3
4
5
6
7
8
上面的程序结束后,ax的值为1(跳过了add ax, 1 这条指令)
需要指出的是:jmp指令在机器指令的级别上是根据位移大小进行转移(而不是根据绝对地址进行转移的)
一次完整的jmp指令演示(背景知识:几种寻址方式之比较)——
1)初始状态,CS:IP=2000:8
这里写图片描述
2)地址加法器得到实际物理地址
这里写图片描述
3)根据物理地址寻址,获取内存中的指令(这里是EBF6)
这里写图片描述
4)获取到的指令进入指令缓存器,注意到IP已经自动增加了2(指向下一条指令)
这里写图片描述
5)执行缓存的指令(EB代表jmp,F6代表-10),可以看到IP和F6相加后变成了0000(F6等于-10用到了补码表示)
这里写图片描述
6)只要代码段尚未end,CS:IP继续寻址、执行(IP自增3,指向下一条指令)
这里写图片描述
这里写图片描述
实际上,jmp short 标号的功能为:(IP)=(IP)+8位地址
1)8位地址=标号处的地址-jmp指令后的第一个字节的地址
2)short指明此处的位移为8位位移
3)8位位移的范围为-128~127,用补码表示
4)8位位移由编译程序在编译时算出
还有一种和jmp short 标号功能相近的指令格式,jmp near prt 标号,它可以实现段内近转移
jmp near prt 标号的功能为:(IP)=(IP)+16位位移
1)16位位移=标号处的地址-jmp指令后的第一个字节的地址
2)near ptr指明此处的位移为16位位移,进行的是段内近转移
3)16位位移的范围为-32768~32767,用补码表示
4)16位位移由编译程序在编译时算出
转移的目的地址在指令中的jmp指令
jmp far 标号
1
实现的是段间转移,又称为远转移
远转移(类似于打长途电话,除了正常号码外还要拨区号)
jmp far ptr 标号的功能:让(CS)=标号所在的段地址,(IP)=标号所在的偏移地址;使用远转移指令可以同时修改(CS)和(IP)
assume cs:codesg
codesg segment
start:mov ax,0
mov bx,0
jmp far ptr s
s:add ax,1
inc ax
codesg ends
end start
1
2
3
4
5
6
7
8
9
转移的目的地址在寄存器中的jmp指令
指令格式:jmp 16位reg
指令功能:(IP)=(16位reg)
1
2
转移地址在内存中的jmp指令
演示一:
jmp word ptr 内存单元地址(段内地址)
1
功能:从内存单元地址处开始存放着一个字,是转移的目的地址
内存单元地址可以用寻址方式的任任一格式给出
解释:word为16位(字型数据),最多只能实现段内转移(只能给出IP的值,不能决定CS的值)
mov ax,0123H
mov ds:[0],ax
jmp word ptr ds:[0]
;(IP)=0123H(提示:看最后一行代码,word表示字型数据占16位,而IP刚好也占16位大小,所以把jmp指令后面的内存地址表示的大小赋值给IP即可,和CS无关)
1
2
3
4
mov ax,0123H
mov [bx],ax
jmp word ptr [bx]
;(IP)=0123H
1
2
3
4
演示二:
jmp dword ptr 内存单元地址(段间地址)
1
功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址
解释:dword为32位(双字类型)
(CS)=(内存单元地址+2)
(IP)=(内存单元地址)
内存单元地址可以用寻址方式的任一格式给出
mov ax,0123H
mov ds:[0],ax
mov word ptr ds:[2],0 ;「word」表示ds:[2]、ds:[3]为0(word->字型数据,占16位)
jmp dword ptr ds:[0]
;(CS)=0, (IP)=0123H, CS:IP=0000:0123(提示:看最后一行代码,dword表示双字类型占32位,其中CS、IP各占16位,CS占高16位、IP占低16位)
1
2
3
4
5
mov ax,0123H
mov [bx],ax
mov word ptr [bx+2],0
jmp dword ptr [bx]
;(CS)=0, (IP)=0123H, CS:IP=0000:0123
作者:凡尘间
来源:CSDN
原文:https://blog.csdn.net/abc_12366/article/details/79685102
版权声明:本文为博主原创文章,转载请附上博文链接!