【问题标题】:Suspected error in textbook example - Atmel Assembly教科书示例中的可疑错误 - 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)。我想我错过了评论。立即修复

标签: assembly avr atmel


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-04-02
    • 2021-01-15
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多