如何解决Avra .db 指令似乎无法正常工作
我正在尝试为 ATmega16 编写一些代码。我一直在 FreeBSD 12.2-RELEASE 下使用 avra(1.4.2 版)。 我的代码段中有以下内容:
helloStr: .db "Hello World\0"
我的理解是字符的字节应该是连续的。 但是,当我查看生成的目标文件时,我看到以下内容(我正在使用命令 avra main.asm 组装代码):
00000190: 0000 3600 0000 2a65 4800 0039 0000 002b ..6...*eH..9...+
000001a0: 6c6c 0000 3900 0000 2c20 6f00 0039 0000 ll..9...,o..9..
000001b0: 002d 6f57 0000 3900 0000 2e6c 7200 0039 .-oW..9....lr..9
000001c0: 0000 002f 5c64 0000 3900 0000 3000 3000 .../\d..9...0.0.
000001d0: 0039 0000 0031 e2fa 0000 3d00 0000 32e0 .9...1....=...2.
注意右边的字符不是连续的。 我正在查看 avra 生成的 .obj 文件。 当我尝试运行代码时,它似乎证实了我的暂停,即字符字节没有连续存储,因为我在显示器上看到的大部分是带有一些正确字符的垃圾,但间隔太远。 我认为我的显示例程没有任何问题(例如,如果我删除循环代码并使用 ldi r16、'H' 将字符直接存储在 r16 中,则 LCD 显示代码将正确显示字符。):
WRITE_TO_LCD:
push r16
push r17
START_WRITE_TO_LCD:
lpm r16,Z+
ldi r17,0b0
cp r16,r17 ; Have we hit the null byte?
breq END_WRITE_TO_LCD
;; Output character command.
out PortA,r16
ldi r16,low(registerSelect) ; Set RS control signal
out PortC,r16
;; Set E and RS control siginals.
ldi r16,(low(registerSelect) | low(enable))
out PortC,low(registerSelect) ; Clear E control signal
out PortC,r16
jmp START_WRITE_TO_LCD
END_WRITE_TO_LCD:
pop r17
pop r16
ret
我正在加载 Z:
ldi r31,low(helloStr)
ldi r30,high(helloStr)
在我调用 WRITE_TO_LCD 之前。我不确定低至 r31 和高至 r30 是否正确,但我也尝试过另一种方式。我还读到内存是使用 2 字节字寻址的,所以我应该使用 2*helloStr。我也试过这样做。也许我刚才提到的这些细节在我在这里展示的代码中是不正确的,但我已经尝试了所有的排列,我认为这不是问题(正如 LCD 上的输出和我所显示的内容所证明的那样)可以在十六进制编辑器中看到。)
我还在中断向量之后定义了 helloStr。如果我将它放在中断向量之前,我似乎在 .obj 文件中看不到它的任何证据,并且当我实际运行它时,LCD 上的输出是不同的。我认为这与中断向量需要成为内存中的第一件事或类似的东西有关。但我认为它仍然会出现在代码中并且中断的处理会被搞砸。
无论如何,我真正感兴趣的是在 flash 中获取一个连续的字符串,以便我可以遍历它。
如果有人知道我可能做错了什么,我将非常感谢您的意见。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。