jmp指令的疑惑?

boywang 2003-07-26 01:34:16
77DFE021 EB21 jmp 77DFE044

77DFE855 E99F000000 jmp 77DFE8F9
以上是我用w32Dasm反汇编的代码,为什么同样的jmp指令反汇编成机器码时会有不同的结果呀?
...全文
177 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xinxinyu2000 2003-07-26
  • 打赏
  • 举报
回复
构造jmp near指令
指令格式: 
db 0e9h;(jmp near指令机器码)
dw RelativeOffset(相对偏移量)
所以构造jmp near指令的关键在于计算RelativeOffset
用两个等例子来说明问题:
JmpAddr : jmp Exit JmpAddr: db 0e9
... dw offset Exit-offset JmpAddr+3
... ...
Exit:
nop Exit: nop

RelativeOffset=jmp指令的后一条指令地址 减去 你要跳转的位置地址
而jmp指令的后一条指令地址=offset JmpAddr+3(3是本jmp指令长度)
对于Win32的32位jmp near来说,jmp指令机器玛不变,而长度则为5
因为32位的jmp near的RelativeOffset是32位的(它跳转的相对空间是:-2^31~2^31-1)
xinxinyu2000 2003-07-26
  • 打赏
  • 举报
回复
E9 是段内相对转移指令, 后面跟的是个相对当前指令的下一条指令的地址的偏移量, 不是目标地址的绝对值. 即转移去的目的地址是该指令中的偏移值再加上本转移指令的下一条指令的地址, 也就是说, 如果要 JMP 00481F3C, 这条指令在不同的地方是不同的. 比如:
00401000 E9370F0800 JMP 00481F3C
00401005 ...
因为在win32下e9指令占5个字节, 所以偏移量=目的地址-(转移指令地址+5)=00481f3c-(00401000+5)=00080f37, 输入时LSB在前,MSB在后就是了.
Areslee 2003-07-26
  • 打赏
  • 举报
回复
JMP分远、近跳转,又有直接间接之分,当然不同啊
karach 2003-07-26
  • 打赏
  • 举报
回复
机器不同吧

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧