汇编指令JMP是什么意思?

汇编指令JMP是什么意思?,第1张

无条件转移指令JMP
格式:
JMP
OPRD
功能:
JMP指令将无条件地控制程序转移到目的地址去执行当目的地址仍在同一个代码段内,称为段内转移;当目标地址不在同一个代码段内,则称为段间转移这两种情况都将产生不同的指令代码,以便能正确地生成目的地址,在
段内转移时,指令只要能提供目的地址的段
内偏移量即够了;而在段间转移时,指令应能提供目的地址的段地址及段内偏移地址值
说明:
1
其中OPRD为转移的目的地址程序转移到目的地址所指向的指令继续往下执行
2
本组指令对标志位无影响
3
<1>
段内直接转移指令:
JMP
NEAR
标号
<2>
段内间接转移指令:
JMP
OPRD
<3>
段间直接转移指令:
JMP
FAR
标号
<4>
段间间接转移指令:JMP
OPRD其中的OPRD为存储器双字 *** 作数段间间接转移只能通过存储器 *** 作数来实现

java jmp 8
java jmp 8_如何在汇编程序中实现相对JMP(x86)?

warrior flying
原创
关注
0点赞·85人阅读
在为x86平台构建汇编程序时,我遇到了编码 JMP 指令的一些问题:
OPCODE INSTRUCTION SIZE
EB cb JMP rel8 2
E9 cw JMP rel16 4 (because of 0x66 16-bit prefix)
E9 cd JMP rel32 5

所有都是 relative 跳转,其中每个编码( *** 作 *** 作数)的大小在第三列中
现在我的原始设置(因此因故障而设计)为每条指令保留了最大(5个字节)空间 该 *** 作数尚不清楚,因为它实现了一个"rewrite"机制,如果已知跳转的位置,则将 *** 作数重写在内存中的正确位置,并用 NOP s填充其余部分 在紧密循环中这是一个有点严重的问题
现在我的问题是以下情况:
b: XXX
c: JMP a
e: XXX

XXX
d: JMP b
a: XXX (where XXX is any instruction, depending
on the to-be assembled program)
问题是我想要 JMP 指令的最小可能编码(并且没有 NOP 填充)
我必须知道 c 处指令的大小才可以计算 a 的 *** 作数 a 和 b 之间的相对距离 这同样适用于 c c :它需要知道 d 的大小才能计算 e 和 a 之间的相对距离
How do existing assemblers solve this problem, or how would you do this
这就是我在想的解决问题的方法:
首先将所有指令编码为JMP与其目标之间的 *** 作码,如果该区域包含可变大小的 *** 作码,则使用最大大小,例如: 5为JMP 然后通过选择最小可能的编码大小(3,4或5)将相对JMP编码到其目标,并计算距离 如果对任何可变大小的 *** 作码进行编码,则更改之前的所有绝对 *** 作数,以及跳过此编码指令的所有相关指令:当 *** 作数更改为选择最小可能大小时,将对其进行重新编码 保证此方法结束,因为可变大小的 *** 作码只能缩小(因为它使用它们的最大大小)
我想知道,也许这是一个过度设计的解决方案,这就是我问这个问题的原因

要知道怎么来,需要理解两个基本概念,指令地址和指令长度:
指令地址,编译器在编译时,会根据指令的长度,累加计算出一个段内的指令的地址。
如图中第一条指令"inc ax"的地址(严格来说是相对与该代码段的偏移地址)为0,指令长度为1;
以此类推,第二条指令的地址为1,指令长度为2(两个字节长);
第三条指令的地址为3(等于前两条指令长度相加),指令长度为3
另一个需要理解的关键点就是,指令执行时,当前指令指针IP(或EIP)已经指向下以指令地址,也就是说,在x86芯片架构中,call,jmp,及其它条件跳转指令偏移量的增加或减少都是相对下一指令地址(call,jmp等指令结尾处)而言的,所以:
s0的标号代码第四条指令的指令地址,6,第二条指令“jmp s0”计算跳转偏移量的地址为第三条指令地址3(第二条指令结尾处),即有6-3;
同理,s标号代表第一条指令地址0,低五条指令计算跳转偏移量的地址为第六条指令地址(第五条指令结尾处)9,所以有9-0


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/13425940.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-03
下一篇 2023-08-03

发表评论

登录后才能评论

评论列表(0条)

保存