2

这是对此的后续问题。我正在__AVR_HAVE_LPMX__使用为处理器(avr25)编写代码

  • GNU C (WinAVR 20100110) 版本 4.3.3 (avr) / 由 GNU C 版本 3.4.5 (mingw-vista special r3)、GMP 版本 4.2.3、MPFR 版本 2.4.1 编译。

当我在内lpm rd, Z联汇编中使用时,编译器总是将其转换为lpm rd,Z+(摘自 lss 文件):

asm volatile("lpm r24,Z");
248:    84 91           lpm r24, Z+

这很糟糕,如果它用于连续访问查找表。查找值可能是0xff,因此这会不必要地增加ZH( r31) 从而破坏此解决方案

有什么建议可以规避这种行为吗?

4

1 回答 1

1

解决方案没有错;您的反汇编程序(avr-objdump -dbinutils包的一部分)有问题。

请参阅Atmel AVR 指令集手册(PDF) 的第 97 页。lpm指令变体被编码为

1001 0101 1100 1000 = 0x95C8   lpm r0,Z
1001 000? ???? 0100 = 0x9??4   lpm r?,Z
1001 000? ???? 0101 = 0x9??5   lpm r?,Z+

假设我们比您的反汇编程序更信任 Atmel 文档,那么

84 91    lpm r24,Z

然而

85 91    lpm r24,Z+

实际上,avr-gcc (GCC) 4.8.2 使用 将内联程序集编译为相同的两个字节 ( 84 91) avr-gcc-4.8.2 -O2 -fomit-frame-pointer -mmcu=avr25,并将其列lpm r24,Z在程序集源文件中(使用-S选项);当编译为目标文件并使用 avr-objdump (GNU binutils) 2.23.1 反汇编时avr-objdump -d,指令仍然是84 91 lpm r24,Z.

这让我相信这是 avr-objdump(GNU binutils 的一部分)中的一个错误。啊,是的,在此处报告,显然已于 2013 年 10 月在 binutils-2.23.1 中修复。

简而言之,只有拆卸受到影响;反汇编错误地显示Z+它应该显示的时间Z。它不影响生成的代码,只有人类可读的输出不正确。要修复,请升级到 binutils 版本 2.23.1 或更高版本。如果不能,请不要担心:您可以放心地忽略此错误,因为它只会影响人类可读的反汇编。

问题?

于 2014-09-08T18:18:59.570 回答