2017-08-23 3 views
0

Donc, j'apprends l'assemblage d'Atmel AVR à partir du manuel de Huang. Il y a l'exemple suivant dans le livre:Erreur présumée dans l'exemple de manuel - Atmel Assembly

// 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) 

N'est-ce pas incorrect? La ligne 4 ne devrait-elle pas être subi, et non sbi.

La documentation sbi lit:

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

Cela ne semble pas du tout lié à ce que l'exemple essaie de faire. Ai-je manqué quelque chose, ou devrais-je informer l'éditeur?

+0

Tout à fait à droite - et XL et XH font partie de X, pas de Y (le commentaire est trompeur). Quelqu'un a mélangé les choses. –

+0

Il était à l'origine Y dans ma solution à l'exemple, mais j'ai changé pour refléter la solution d'exemple du livre (qui a utilisé X). Je suppose que j'ai raté le commentaire. Fixer maintenant – Airhead

Répondre

1

L'instruction doit être subi r0, 10, ou "soustraire immédiate" pour soustraire la valeur 10 du registre r0.

Toutes les instructions d'adresse immédiate se réfèrent au nombre littéralement dans l'instruction, par opposition à d'autres modes d'adressage qui se réfèrent à des registres, ou le décalage d'une adresse enregistrée dans un registre d'index tel que X ou Y, etc.

Par exemple, ld r0, X charge la valeur stockée à l'adresse stockée dans X, ici 0x2000. (Il ne charge pas 0x2000 dans r0.)