Conversion très simple BRAS instructions binaire/hexadécimal
J'ai essayé d'utiliser cette page ainsi que de nombreux autres guides de comprendre comment l'exprimer très simple BRAS instructions en binaire et hexadécimal. Il semble que ce devrait être un processus simple pour moi, mais je ne comprends toujours pas. Voici quelques exemples.
De base NOP:
what goes here? what goes here?
_↓_ _____↓____
| | | |
mov r0, r0 ; ????00?1101?????????????????????
|__||__|
↑ ↑
how do I express registers?
Même question pour les autres.
De la comparaison de deux registres:
cmp r1, r0
L'ajout immédiat pour enregistrer la valeur:
add r0, #0x1a
Tous ces tutoriels en ligne sont excellentes pour décrire comment utiliser les instructions de ce genre, mais je n'en n'ai pu trouver de marcher à travers la façon de convertir un BRAS d'instruction dans le binaire/hexadécimal/code machine dans laquelle il obtient assemblé.
Merci d'avance pour votre aide.
- la grande question; malheureusement le lien est mort. pour les gens de passage, voici un rapide archive web lien
Vous devez vous connecter pour publier un commentaire.
Ici est de savoir comment le traitement des données les instructions sont codées:
Vous avez des codes table dans cette page, est la vôtre. Les registres sont codées
0000
par1111
.Tous vos exemples relèvent de la même catégorie. L'image est extraite d'un document sur mon disque dur, mais j'ai aussi réussi à le trouver en google. Le codage de ces instructions est un travail fastidieux.
Donc,
mov r0, r0
devrait aller comme ça:J'ai mis Rn à 0, car il n'est pas réellement applicable à
MOV
. En cas deCMP
, je crois,S
est toujours 1.Tout d'abord, vous avez besoin de l'ARM Architecture de Référence Manuel de l'ARM (ARM) a infocenter.arm.com, manuel de référence, obtenir le plus ancien (armv5 ou quoi que ce soit). le jeu d'instructions est bien définie par là.
Deuxième, pourquoi ne pas vous juste d'assembler des instructions et voir ce qui se passe?
quelle que soit la croix-assembleur, vous avez (voir http://github.com/dwelch67/raspberrypi dans la construction répertoire de gcc pour un script, il suffit d'exécuter à travers binutils dans le script)
arm-none-linux-gnueabi vs arm-none-elfe vs arm-elf, etc n'ont pas d'importance pour ce faire, tous faire la même
Les quatre premiers bits de 32 bits arm instruction (pas le pouce) sont la condition de code, voir le champ de condition de l'article dans le BRAS de BRAS de. un 0xE-à-dire toujours, toujours exécuter cette instruction. 0b0000 est eq ne s'exécutera que si le z drapeau est réglé, 0b0001 ne s'exécutent seulement si z est clair, etc.
Dans les BRAS de BRAS de pousser dans les bras de l'instruction, puis la liste alphabétique de bras instructions, puis de trouver cmp Il commence avec cond 00I10101 rn sbz shifter
De notre instruction cmp au-dessus de nous voir 1110 000101010001 ... j'ai donc un zéro les bits 15:12 bits sont à zéro, 27:26 zéro et 24:21 1010 donc, c'est une instruction cmp
bits de 19 à 16 ci-dessus sont 0b001 qui est rn, donc rn = 1 (r1) pour le levier de vitesses opérande dans les BRAS de BRAS qu'il vous dit de regarder Mode d'Adressage 1 Traitement de Données d'opérandes et a un lien dans le fichier pdf de la page
nous savons que nous voulons le deuxième opérande à être tout simplement d'un registre, qui est appelé le traitement des données des opérandes - inscrivez-vous, et un numéro de page, allez à la page de la page 15:12 rd 11:4 sont des zéros et 3:0 est rm. nous savons à partir de l'instruction cmp il dit 15:12 devrait être égale à zéro, je me demande si il se soucie de la cmp ne pas stocker le résultat dans un registre rd n'est pas utilisé. rm est utilisé et dans ce cas, nous voulons r0, donc 0b0000 va de 3:0 note aussi qu'il montre bits 27:25 comme des zéros, dans l'instruction cmp 25 est je, nous savons maintenant que nous voulons un zéro il y a donc
entre le cmp et de la page de ce traitement de données - inscrivez-vous à la page nous avons l'ensemble de l'image
le complément est similaire, mais utilise un immédiat, donc aller pour le complément d'instruction dans l'alpha de la liste d'instructions. nous savons maintenant à partir de la cmp qui 24:21 pour cette classe d'enseignement est l'opcode, nous pouvons très bien aller directement à la manette opérande trucs pour continuer à partir de là
cette fois nous faisons ajouter rd,rn,#immédiate
donc chercher la page pour #immédiate
et l'encodage est
maintenant vient la partie la plus intéressante, on peut coder le 26 façons différentes. bits 7:0 sont immédiats et les bits 11:8 permettre immédiats de la rotation, 26 est 0x1A, on pourrait simplement mettre 0x1A dans la partie inférieure de 8 bits et définir la rotation à 0, et c'est ce que l'assembleur gnu n'. pourrait probablement mettre un 0x68 dans la partie inférieure de 8 bits et un 1 dans le rotate_imm champ 1101000 rotation à droite 1*2 bits est 11010 = 0x1A = 26.
Vous devriez obtenir une copie du bras BRAS il décrit le codage pour toutes les instructions.
BRAS-Instructions d'utilisation utiliser la partie supérieure de 4 bits pour un code conditionnel. Si vous ne voulez pas exécuter l'instruction conditionnelle suffit d'utiliser la pseudo-état AL (1110).
Le premier registre (Rn) dans le codage n'est pas utilisé pour le MOV-instruction et il doit être réglé sur 0000 tel que défini par le BRAS le BRAS.
Le deuxième registre est la destination, ici vous venez d'encoder le numéro de registre, de sorte que, dans votre cas, il serait aussi 0000 parce que vous êtes à l'aide de r0 comme un destinal, pour r4 il serait 0100.
Le reste est le levier de vitesses opérande qui est très flexible. Il pourrait être un simple registre comme dans votre cas (r0), alors il est tout 0000 0000 0000 où les 4 derniers bits de nouveau encoder le registre. Il peut aussi encoder les différents types de changements et tourne avec registre immédiate ou valeurs pour le traitement des données.
Mais il pourrait également être une immédiate de 8 bits sont codés dans le bas de bits et les 4 premiers bits de définir un droit à tourner en 2 étapes. Dans ce cas bit25 sera également 1, dans tous les autres cas, c'est 0.