ATmega128: addition et la soustraction des nombres 16 bits (de l'assemblée)
Je travaille avec un ATmega128 microcontrôleur et les soi-disant besoin d'ajouter deux nombres 16 bits. Je suis à l'aide d'AVR Studio et c'est ce que j'ai obtenu jusqu'à présent:
.include "m128def.inc";
.equ ramstart = 0x100
.def temp = r16
.dseg
.org ramstart
number1: .byte 2
number2: .byte 2
.cseg
.org 0
rjmp start
start:
; number1 := 0x7856
ldi temp, low(number1)
sts number1, temp
ldi temp, high(number1)
sts number1+1, temp
; number2 := 0x34B2
lds temp, number1
sts number2, temp
lds temp, number1+1
sts number2+1, temp
slutt:
rjmp slutt
Ce n'est pas loin d'être la première fois que je suis en utilisant n'importe quel type d'assemblée, je sais que je suis en train de faire quelque chose de mal, mais n'arrive pas à comprendre quoi. Ai-je raté le drapeau de portage?
est-ce un devoir? Si oui, veuillez étiqueter comme tel. oui, vous devez d'abord charger des registres, alors vous devez ajouter tous ou la soustraction. Vous pouvez toujours revenir à ajouter/adc ou sub/sbc à effectuer un grand nombre de bits/octet ajoute ou soustrait.
Si j'utilise ajouter ou adc, comment dois-je stocker le résultat de la bonne façon?
Si j'utilise ajouter ou adc, comment dois-je stocker le résultat de la bonne façon?
OriginalL'auteur Lasse A Karlsen | 2012-02-09
Vous devez vous connecter pour publier un commentaire.
Retour à gradeschool avec un crayon et du papier. Si je veux ajouter 5678 1234 et
4+8 est 2 transporter le 1
et ainsi de suite
le bit de retenue au-dessus de ceux de la colonne est importante, il est appelé à effectuer, et de la transporter
peu que les feuilles de la colonne la plus à gauche est de mener.
Que si je n'avais papier assez large pour ajouter deux colonnes à la fois?
Je commence par les moins de deux séries de chiffres, et j'ai besoin d'un zéro comme un bagage. J'obtiens un résultat de 12 à effectuer.
Maintenant, je prends que les mener à bien, l'utiliser comme un bagage à pour les deux chiffres suivants. Cet additionneur je dois être en mesure de prendre une effectuer à partir d'un avant d'ajouter et de les utiliser comme le carry pour ce complément.
Quand tout est dit et fait je obtenir 69 et 12, les mettre ensemble, je reçois 6912 mais il n'a pas besoin d'un additionneur à 4 chiffres pour y arriver. Vous pouvez répéter cette indéfiniment ou jusqu'à ce que vous exécutez hors de la mémoire, de registres ou de cycles d'horloge.
Le régulateur peut avoir d'autres façons de résoudre le problème, mais la plupart des processeurs au moins deux formes d'ajouter et de deux formes de soustraire, de sorte que vous pouvez cascade de l'additionneur à être aussi large que vous avez besoin. Examiner l'ensemble d'instructions pour l'avr et ce qui se passe ci-dessus devrait vous sauter aux yeux.
EDIT:
Un C exemple peut aider...(passage hex)
EDIT2:
J'espère que ce n'est pas un devoir à la maison...
le résultat est le r20 octet de poids fort, et r21 l'octet de poids faible
si vous avez besoin de lire à partir de la ram il y a de nombreuses façons, ce qui suppose le 16 bits, les nombres sont en little endian
r0 moitié basse de résultat, r1 moitié supérieure.
ou d'utiliser l'un des x,y,ou z pointeur registres
OriginalL'auteur old_timer
Bien, vous n'êtes pas vraiment à l'émission de tout plus d'instructions. Je ne suis pas un AVR programmeur en aucune façon, mais après un rapide coup d'œil sur le jeu d'instructions de l'ATmega128, quelque chose comme cela semble beaucoup plus correct. Je suis en supposant que votre assembleur utilise la syntaxe Intel et que les nombres sont stockés en tant que Little-Endian.
Le résultat est donc stockée dans
r17:r16
, par exemple, l'octet de poids fort enr17
, et l'octet de poids faible dansr16
.La spécification de la LDS instruction dit qu'il ne fonctionne correctement que sur les registres de 16 à 31. J'ai édité mon post en conséquence.
Au lieu d'utiliser des saints des derniers jours, que diriez ldm? Vous ne savez pas où dans la mémoire RAM ramstart est alloué, mais il pourrait être dans "la mémoire de programme" vu que vous êtes en plaçant les chiffres de votre code et dans la même région. Je suppose que c'est pourquoi vous obtenez 0xFF - SRAM n'est pas initialisé ou n'existe pas.
erreur: Opérande(s) en dehors de la plage dans 'ldi r16,0x100'
OriginalL'auteur Daniel Kamil Kozar
Votre feuille de données a
add
etadc
de cette lien. Comme je l'ai deviné ci-dessus, peut-être vous avez besoin d'utiliser le programme de la mémoire des charges, du gestionnaire de disque logique pour obtenir vos numéros.En gros:
Code ci-dessus ne fonctionnent pas et il est un exemple de travail...
Si je suis la compréhension du contexte correctement avec la post-incrémentation du gestionnaire de disque logique de commande et tous les registres de 8 bits.
Adresse de chargement immédiat en r0. Le chargement d'un Programme en Mode de r0 en r16,r17,r18,r19. Donc, je parlais de la ldm de l'instruction. Je suis confus comment faire pour obtenir les valeurs à partir de la RAM si via les registres qu'ils ne sont que 8-bits de longueur.
Ah, X/Y/Z registres ala Z80 jours. Mon mauvais.
OriginalL'auteur Michael Dorgan
Le symbole "de1" a la valeur d'une adresse, pas le contenu de cette adresse.
Depuis que vous avez placé "de1".ORG RAMSTART, ce qui est probablement 0100 Hex, alors
faible(nombre1) est égal à 00 et haute(nombre1) est égal à 01
Si vous souhaitez que le CONTENU de l'adresse "de1", vous devez d'abord obtenir l'adresse en
16 bits de l'adresse de registre, par exemple le Z registre = (R30,R31) par le texte suivant
LDI R30, ÉLEVÉ(nombre1)
LDI R31, FAIBLE(nombre1)
Maintenant le Z registre peut être utilisé pour régler la VALEUR à l'adresse "de1" par:
LD R16,Z+
LD R17.Z
Vous avez maintenant la valeur 16 bits en R16,R17
Maintenant que vous avez à faire la même chose pour "nombre2"
LDI R30, ÉLEVÉ(nombre2)
LDI R31, FAIBLE(nombre2)
LD R18,Z+
LD R19.Z
Vous avez maintenant la deuxième 16-bit nombre de R18, R19
Maintenant vous ajoutez-les ensemble avec de la LSB de l'ESM
AJOUTER R19,R17 ;ajouter le bit de poids faible du premier
ADC R18,R16 ;puis ajouter l'Esm avec le bit de retenue
La réponse est aujourd'hui dans R18,R19
Conclusion: Le RÉGULATEUR a une très grossière, de l'inefficacité du jeu d'instructions. Il a un avantage sur le 8051, cependant: C'est la pile peut être n'importe où dans la mémoire RAM, ce qui permet d'avoir plusieurs processus en cours d'exécution, chacun avec leurs propres piles.
Mais en général, tous Harvard l'architecture des processeurs SUCER par rapport à von Neumann architectures.
Si seulement, s'il plaît à Dieu, je souhaite que quelqu'un a fait un microcontrôleur basé sur le 8085 ou Z80, avec de la puce de mémoire RAM et FLASH, en laissant toutes les quilles gratuit à I/O ports!
OriginalL'auteur Paul