2016-12-21 7 views
0

J'essaye d'écrire un programme en langage assembleur pour le microcontrôleur stm8sf103. Je voudrais stocker une valeur hexadécimale immédiate dans un registre de RAM (tel que 0 $), mais cela ne fonctionne pas et je me demande pourquoi:STM8SF103 Assembly - Charger la valeur immédiate dans le registre RAM

stm8/ 
    segment 'rom' 

loop 
    ld $0,#5 
    jp loop 

    end 

Je reçois l'erreur:

as1 : Error 54: Can't match Addressing mode ' ld $0,#5'

Répondre

4

Utilisez

MOV $0, #5 

L'instruction ne affecte tout drapeau de condition.

De l'ST8 Programming Manual, la description de MOV est

Moves a byte of data from a source address to a destination address. Data is examined as it is moved1. The accumulator is not affected.

There are 3 addressing modes for the MOV instruction:

  • An immediate byte to a direct memory location
  • A direct memory location to another direct memory location (from $00 to $FF)
  • A direct memory location to another direct memory location (from $0000 to $FFFF)

Vous pouvez consulter ce manuel pour les modes d'adressage pris en charge (20 au total), afin que vous puissiez comprendre pourquoi ld $0,#5 ne peut pas travailler (il n'y a pas direct avec adressage immédiat).


Je ne comprends pas cette phrase, je crois qu'il ya une faute de frappe (il devrait être données ne sont pas examinées ...). Le manuel indique clairement qu'aucun drapeau n'est affecté.

+0

Merci beaucoup, 'mov' est l'instruction correcte. – binaryBigInt

+0

Mais pourquoi cela ne fonctionne-t-il pas? 'ld $ 1, $ 7F0A' – binaryBigInt

+3

@binaryBigInt Comme je l'ai dit dans ma réponse, vous pouvez regarder le manuel. Vous constaterez que le ST8 n'a pas de charge de mem-to-mem (il a un mouvement mem-to-mem cependant, "MOV $ 1, $ 7F0A" fera l'affaire). Sérieusement, ouvrez ce lien et passez une heure à lire ce document, il est très bien écrit et très facile à suivre. Vous le trouverez très utile. :) –