如何使用AVR-GCC生成准确的列表文件?

时间:2019-07-02 01:50:40

标签: assembly avr avr-gcc

我正在尝试为AVR模拟器创建接口。接口的输入是avr程序集,该程序由接口编译。在此编译过程中,我想为每个汇编指令生成一个包含4项内容的文件:原始汇编文件中的行号,汇编指令在内存中的位置,汇编汇编指令的操作码以及原始汇编指示。

到目前为止,我已经使用基本的测试程序取得了成功,但是当我开始使用包含分支的程序进行测试时,我注意到我生成的清单文件和目标文件都不准确:分支没有分支到标签上,而不是pc +1。我相信这是来自链接器的问题,来自this question

给出此test.s文件:

D

我用来组装的原始命令是:

.global main
main:
    ldi r16, 10
    ldi r17, 0
loop: 
    add r17, r16
    dec r16
    cpi r16, 0
    brne loop
    cpi r17, 50
    brge grtr
    ldi r18, 1
    rjmp done
grtr:
    ldi r18, 2
done:
    mov r0, r18

我使用avr-objcopy生成的相应十六进制文件为

avr-gcc -Wa,-alhns -Wa,-L -mmcu=atmega2560 test.s -c -o test.o > test.lst

,列表文件为:

:100000000AE010E0100F0A950030>01F4123304F4F6
:0800100021E000C022E0022EF5
:00000001FF

如果我改用

   1                .global main
   2                main:
   3 0000 0AE0              ldi r16, 10
   4 0002 10E0              ldi r17, 0
   5                loop: 
   6 0004 100F              add r17, r16
   7 0006 0A95              dec r16
   8 0008 0030              cpi r16, 0
   9 000a 01F4              brne loop
  10 000c 1233              cpi r17, 50
  11 000e 04F4              brge grtr
  12 0010 21E0              ldi r18, 1
  13 0012 00C0              rjmp done
  14                grtr:
  15 0014 22E0              ldi r18, 2
  16                done:
  17 0016 022E              mov r0, r18
  18                
DEFINED SYMBOLS
              test.s:2      .text:0000000000000000 main
              test.s:5      .text:0000000000000004 loop
              test.s:14     .text:0000000000000014 grtr
              test.s:16     .text:0000000000000016 done

NO UNDEFINED SYMBOLS

我生成包含整个中断向量表的十六进制

avr-gcc -Wa,-alhns -Wa,-L -mmcu=atmega2560 test.s -o test.o > test.lst

但值得注意的是,分支的十六进制现在是准确的。问题是,清单文件仍然与以前相同。不仅分支的操作​​码错误,而且汇编指令的存储位置现在也错误。

在生成此列表文件时我犯了什么错误?理想情况下,我想生成一个具有适当操作码且不包含中断向量表或包含中断向量表并具有正确汇编指令存储位置的程序。

谢谢。

1 个答案:

答案 0 :(得分:1)

另一种可能的方法是用调试信息进行组装和链接,然后将objdump与源代码+反汇编输出模式一起使用以获取机器代码和地址+原始源代码行。

这将使您获得链接的可执行文件,并正确填写分支目标。

您可以使用objdump -D来“反汇编”可执行文件的非代码部分,因此您可以使用它来获取IVT的十六进制转储。