教科书示例中的可疑错误 - Atmel Assembly

Posted

技术标签:

【中文标题】教科书示例中的可疑错误 - Atmel Assembly【英文标题】:Suspected error in textbook example - Atmel Assembly 【发布时间】:2017-08-23 22:12:54 【问题描述】:

所以,我正在从 Huang 的教科书中学习 Atmel AVR 组装。书中有如下例子:

// Subtract 10 from mem(0x2000)

ldi  XL,        0x00        ; Load mem(0x2000) into X
ldi  XH,        0x20        ;
ld   r0,        X           ; Load the value into r0
sbi  r0,        10          ; Subtract 10 from r0.
st    X,        r0          ; Store the result back in mem(0x2000)

这不是错误的吗?第 4 行不应该是subi,而不是sbi

sbi 的文档内容如下:

Description:
Sets a specified bit in an I/O register. This instruction operates on the 
lower 32 I/O registers - addresses 0-31.

这似乎与示例试图做的事情无关。我错过了什么,还是应该通知发布者?

【问题讨论】:

非常正确 - XL 和 XH 是 X 的一部分,而不是 Y(该评论具有误导性)。有人把事情搞混了。 在我的示例解决方案中最初是 Y,但我改为反映本书的示例解决方案(使用 X)。我想我错过了评论。立即修复 【参考方案1】:

该指令应为subi r0, 10,或“减立即数”以从寄存器 r0 中减去值 10。

所有立即地址指令都指的是指令中的字面数字,而不是其他指代寄存器的寻址模式,或者与存储在索引寄存器中的地址的偏移量,例如 X 或 Y 等。

例如,ld r0, X 加载存储在 X 中存储的地址的值,这里是 0x2000。 (它不会将 0x2000 加载到 r0 中。)

【讨论】:

以上是关于教科书示例中的可疑错误 - Atmel Assembly的主要内容,如果未能解决你的问题,请参考以下文章

每当我调试时出现几个错误

如何使用 USB 上的示例程序对我的 atmel 开发板进行编程

C 中的 Windows 套接字编程

【求助】关于UF_ASSEM_add_part_to_assembly

将项目从 ICCAVR 移植到 Atmel Studio 7.0 _flash 问题

Atmel Studio:行尾出现垃圾错误