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

Assembly 教科书示例中的可疑错误-Atmel程序集,assembly,avr,atmel,Assembly,Avr,Atmel,所以,我在学习黄老师的教科书中的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 f

所以,我在学习黄老师的教科书中的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.

这似乎与示例所要做的完全无关。我遗漏了什么,或者我应该通知发布者吗?

指令应该是
subi r0、10
,或者“subtract immediate”,以从寄存器r0中减去值10

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


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

非常正确-并且XL和XH是X的一部分,而不是Y的一部分(注释有误导性)。有人把事情搞混了。我的示例解决方案中最初是Y,但我改为反映本书的示例解决方案(使用X)。我想我错过了评论。现在修理