编译的 AVR 程序集二进制文件似乎不包含我的说明?

Posted

技术标签:

【中文标题】编译的 AVR 程序集二进制文件似乎不包含我的说明?【英文标题】:Compiled AVR assembly binary does not seem to contain my instructions? 【发布时间】:2019-09-28 09:49:29 【问题描述】:

所以我使用他们网站上的 AVR 指令集 PDF 编写并手动“组装”了以下 asm。

ldi     r17, 0          ; 1110 0000 0001 0000
ldi     r18, 3          ; 1110 0000 0010 0011
ldi     r16, 0          ; 1110 0000 0000 0000
loop:  
    sbrc    r18, 0      ; 1111 1101 0010 0000
    add     r16, r17    ; 0000 1111 0000 0001
    lsl     r17         ; 0000 1100 0001 0001
    lsr     r18         ; 1001 0101 0010 0110
    brne    loop        ; 1111 01-- ---- ----
again:
    rjmp again          ; 1001 010- ---- 110- 
                        ; ---- ---- ---- ----

但是,当我实际使用 Avra 组装文件并将生成的 .hex 文件转储为二进制文件时,我得到了:

0011101000110000
0011001000110000
0011000000110000
0011000000110000
0011001000110000
0011000000110000
0011000001000110
0100001100001101
0000101000111010
0011000100110000
0011000000110000
0011000000110000
0011000000110000
0011000100110000
0100010100110000
0011001000110011
0100010100110000
0011000000110000
0100010100110000
0011001000110000
0100011001000100
0011000000110001
0011000001000110
0011000100110001
0011000001000110
0011001000110110
0011100100110101
0100010000111001
0100011000110111
0011010000110101
0000110100001010
0011101000110000
0011001000110000
0011000000110001
0011000000110000
0011000001000110
0100011001000011
0100011000110010
0011000000001101
0000101000111010
0011000000110000
0011000000110000
0011000000110000
0011000000110001
0100011001000110
0000110100001010
0000110100001010

当我将 hex 文件刷写到 Arduino 时,它运行良好(给定的 asm 没有提供任何输出,但我已经制作了 asm 来关闭 LED 等,它工作正常,所以我假设这样做以及)。 有人可以告诉我这里发生了什么吗?为什么有这么多额外的位,为什么我找不到任何指令?

【问题讨论】:

十六进制文件是ascii,你是十六进制转储的吗?是的,看起来像这样,例如 00001101 00001010 CR LF。无需转储,只需在文本编辑器中查看或在终端中显示即可。 嗨 Jester,.hex 文件是 ASCII 是什么意思?文件的大部分字节不会转换为有效的 ASCII 字符,Visual Studio 代码只想将文件视为十六进制表示法的字节。 文件内容是二进制数据的 ASCII 文本表示,以十六进制表示。最佳方案:像普通人一样将你的机器码转换成十六进制,这样你就可以在文本.hex文件中轻松搜索。 【参考方案1】:

我不知道你为什么决定采用 ASCII 文本“.hex”文件并将其转换为二进制数字字符串,除非你想让我们的生活更艰难。

我已将那些神秘的行转换回.hex 来源:

:020000020000FC
:1000000010E023E000E020FD010F110F2695D9F745
:02001000FFCF20
:00000001FF

什么是“.hex”文件 - 例如,您可以阅读in Wikipedia。

第一行:02 0000 02 0000 FC 设置初始段偏移量 (0)。

第二行:10 0000 00 10E023E000E020FD010F110F2695D9F7 45 - 这是包含您的代码的位置。如果需要,您可以将突出显示的字符串转换为二进制:

1110000000010000
1110000000100011
1110000000000000
1111110100100000
0000111100000001
0000111100010001
1001010100100110
1111011111011001

如您所见,您的所有代码都在那里并且完好无损。

【讨论】:

啊我明白了,我对组成hex文件的理解完全错误,谢谢你的解释!

以上是关于编译的 AVR 程序集二进制文件似乎不包含我的说明?的主要内容,如果未能解决你的问题,请参考以下文章

AVR 内存和英特尔十六进制

AVR_GCC 编译错误 delay.h

Linux Mono C#错误:无法打开程序集'Bovine.csproj':文件不包含有效的CIL图像

使用 Atmel Studio 作为通用 C 编译器

为啥很多项目不提供预编译的二进制文件?

.res 文件是不是需要在源代码管理中?