【问题标题】:What does this bsr.l instruction do?这个 bsr.l 指令有什么作用?
【发布时间】:2014-11-12 22:19:34
【问题描述】:

我正在玩冷火反汇编程序并找出这段代码:

loc_F7E:
    bsr.l loc_F7E+2
    lea 12(sp),sp
    pea (284).w
    clr.l -(sp)
    move.l  a6,d0
    addi.l  #-636,d0
    move.l  d0,-(sp)

loc_F98:
    bsr.l loc_F98+2
    lea $C(sp),sp
    pea (284).w
    clr.l -(sp)
    move.l  a6,d0
    addi.l  #-$398,d0
    move.l  d0,-(sp)

我试图弄清楚这些 bsr.l 的需求是什么。对我来说,它只是在跳跃。

【问题讨论】:

  • 在每种情况下move.l d0,-(sp) 之后是否还有其他内容?
  • 不,就是这样。这很奇怪,因为它将一些值压入堆栈,就好像它要调用一个子例程一样,但只是调用了它自己。
  • 这是一个可执行文件、库、目标文件还是什么?我只是想知道 bsr 目标地址是否实际上只是一个在链接/加载时修复的占位符?
  • 它是一个elf文件,这个特殊的代码是一个导出函数的和平。

标签: assembly 68000 disassembly coldfire


【解决方案1】:

根据手册,bsr.l *+2 具有十六进制代码 $61FF $0000 $0000,因此它很可能是由于 Igor Skochinsky 上面提到的未解决的重定位而取消目标代码的结果。

【讨论】:

    【解决方案2】:

    我认为这可能是编译器优化更紧凑代码的结果。请参阅编译器指南中的“短 BRA 优化”。

    最近的 IDA 版本为 HC08 和 HC12 代码反汇编了 skip2(也有 skip1)等分支。我之前在 ColdFire 代码中没有看到过这样的优化。

    编辑:或者它可能只是一个带有未解决重定位的目标文件。

    【讨论】:

    • 我已经用 REC (backerstreet.com/rec) 反汇编了相同的代码,它能够告诉我这些实际上是函数调用并告诉我是哪个函数。所以我认为你是对的,但遗憾的是 IDA 无法解决这个问题!
    • 然后发送错误报告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 2016-02-27
    • 2014-04-28
    相关资源
    最近更新 更多