jmp和call指令的问题?

CoomyMorris 2004-04-05 10:25:33
汇编程序中,jmp和call指令后的地址为何可以通过将下一条指令的地址加上本条jmp和call指令后的地址的机器码获得?例如:
:bff816e6 e859edffff call bff80444
:bff816eb c3 ret
bff816eb + ffffed59 = bff80444
...全文
166 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
CoomyMorris 2004-04-06
  • 打赏
  • 举报
回复
sx
bsnhk 2004-04-06
  • 打赏
  • 举报
回复
你的地址应该写错了,应该是bff8:16e6和bff8:16eb,跳转指令应该是call bff8:0444
不管源程序中的跳转指令采用何种寻址方式,最终取得的操作数并不是所要跳转的目的地址,而是一个位移量(地址差),也就是说跳转指令最终要寻找的操作数是一个地址差,而不是目的地址,所以,在跳转指令的机器码中,其操作数字段是一个地址差(目的跳转地址-当前ip的值),该跳转指令机器码的执行时会将这个地址差加上当前IP的值(也就是该跳转指令的下一条指令的偏址)将结果保存进IP,从而实现跳转。
所以59edffffh是目的条转地址(即0444h)减去当前ip的值(即16ebh)的差(由于地址量是无符号数,所以结果也是无符号数,所以59edffffh不是补码)。
需要指出的是“bff816eb + ffffed59 = bff80444”是错误的,应该是“16ebh+ffffed59=444h”,因为444h-16ebh=0ffffed59h。
CoomyMorris 2004-04-05
  • 打赏
  • 举报
回复
地址的机器码是跳转的长度?
louisbadbad 2004-04-05
  • 打赏
  • 举报
回复
bff80444是跳转过去的地址。ffffed59是跳转的长度

21,459

社区成员

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

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