1

我正在尝试为 68000 处理器构建温度控制应用程序。我目前正在使用 GCC 8.2.0。我正在使用 -msoft-float 标志进行编译。但是,浮点库例程似乎被破坏了。例子:

'000174f4 <__ltdf2>:'
   '174f4:  4e56 0000       linkw %fp,#0'
   '174f8:  4878 0001       pea 1 <ADD>'
   '174fc:  2f2e 0014       movel %fp@(20),%sp@-'
   '17500:  2f2e 0010       movel %fp@(16),%sp@-'
   '17504:  2f2e 000c       movel %fp@(12),%sp@-'
   '17508:  2f2e 0008       movel %fp@(8),%sp@-'
   '1750c:  61ff            bsrs 1750d <__ltdf2+0x19>'
   '1750e:  ffff            .short 0xffff'
   '17510:  fd94            .short 0xfd94'
   '17512:  4e5e            unlk %fp'
   '17514:  4e75            rts'
   '17516:  4e71            nop'

有人可以解释为什么会生成此代码或这里发生了什么吗?68000 不会分支到奇数地址。

更新我一直在研究这个,问题似乎是在链接过程中注入的。从 libgcc.a 转储此函数的代码显示以下内容:

`00000000 <__ltdf2>:`
  ` 0:   4e56 0000           linkw %fp,#0`
  `4:   4878 0001            pea 1 <__ltdf2+0x1>`
  ` 8:   2f2e 0014           movel %fp@(20),%sp@-`
  ` c:   2f2e 0010           movel %fp@(16),%sp@-`
  `10:   2f2e 000c           movel %fp@(12),%sp@-`
  `14:   2f2e 0008           movel %fp@(8),%sp@-`
  `18:   61ff 0000 0000      bsrl 1a <__ltdf2+0x1a>`
  `1e:   4e5e                unlk %fp`
 ` 20:   4e75                      rts`

所以链接器必须试图填写分支偏移量并搞砸。由于这个函数的来源是一串宏,我不确定它真正想分支到哪里。

4

1 回答 1

4

在 MC68020 及更高版本上,如果 8 位位移为bra,则bsrbcc后跟 32 位位移0xff。在您的情况下,这没有意义,因为它0xfffffd94适合 16 位。

如果您没有 68020 或更高版本,请确保为 68000 编译(并且您的 softfloat-library 已编译)。

于 2019-02-22T07:59:32.157 回答