汇编语言入门:转移指令(一)

汇编,条件转移指令怎么超出-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
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/baidu_37503452/article/details/87905377