微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Avra .db 指令似乎无法正常工作

如何解决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 举报,一经查实,本站将立刻删除。