Comment imprimer un certain nombre dans les BRAS de montage?
Je suis en train d'imprimer un certain nombre que j'ai stockés. Je ne sais pas si je suis près ou de loin. Toute aide serait appréciée. Voici mon code:
.data
.balign 4
a: .word 4
.text
.global main
main:
ldr r0, addr_of_a
mov r1, #8
str r1, [r0]
write:
mov r0, #1
ldr r1, addr_of_a
mov r2, #4
mov r7, #4
swi #0
bx lr
addr_of_a: .word a
Il compile et s'exécute, mais je ne vois pas tout ce qui est imprimé. Ce que je comprends, j'ai besoin de l'adresse de l'endroit où pour commencer l'impression en r1, le nombre d'octets dans r2, le descripteur de fichier dans r0, et r7 spécifie l'appel d'écriture, si elle est définie à #4. Je suis tout simplement essayer de le magasin n ° 8, puis imprimer le numéro mémorisé.
Vous avez besoin de convertir le nombre en une chaîne (par exemple,
123
- > "123"
) en premier.OriginalL'auteur braden.groom | 2013-06-28
Vous devez vous connecter pour publier un commentaire.
Le syscall écriture prend le deuxième argument (r1) comme un pointeur vers la chaîne que vous souhaitez imprimer. Vous êtes en passant un pointeur sur un entier, c'est pourquoi il n'est pas l'impression de rien, car il n'y a pas de caractères ASCII sur la région de mémoire vous êtes de passage.
Vous trouverez ci-dessous un programme "Hello World" à l'aide de la syscall écrire.
Si vous souhaitez imprimer un nombre, vous pouvez utiliser la fonction printf du C de la bibliothèque. Comme ceci:
Enfin, si vous souhaitez imprimer le nombre avec le syscall écrire, vous pouvez également mettre en place une fonction itoa (qui convertit un entier en une chaîne de caractères).
Rappelez-vous que les caractères ne sont rien de plus que des chiffres dans le code ASCII. Le numéro 48 correspond au caractère '0' ASCII. Le numéro 49 " 1 " et ainsi de suite. Si vous voulez convertir un entier en char, par conséquent, vous pouvez ajouter 48 à l'entier, puis stocker le résultat comme un octet (et non pas un nombre entier, comme des entiers de 4 octets) dans un emplacement mémoire. Alors si vous envoyez un pointeur de cet emplacement de la mémoire pour le syscall écrire, il permet d'imprimer le caractère.
OriginalL'auteur Daniel Scocco
Salut je reconnais que c'est un assez vieux thread mais j'ai gratté ma tête sur ce pendant un certain temps et l'envie de partager ma solution. Peut-être que ça va aider quelqu'un sur le chemin!
Je cherchais à imprimer de chiffres sans avoir recours à l'aide de C++ en quelque sorte, si je me rends compte que, tout simplement, la décompilation d'un tostring() - ou quelque soit l'équivalent existe en C++, et de voir ce qui est venu avec aurait été beaucoup plus rapide de l'itinéraire.
Fondamentalement, j'ai fini avec la création d'un pointeur à un vide .chaîne de caractères ascii dans la section .données et ajouté les chiffres que j'ai voulu imprimer + 48 avant d'imprimer ce chiffre.
L' +48 du cours est de se référer aux chiffres ascii du numéro d'index.
Le plus grand inconvénient de cette approche est qu'il ne gère pas n'importe quel nombre de plus d'un chiffre de cours.
Ma solution a été beaucoup, beaucoup plus laid et au-delà de la portée de cette réponse ici mais si vous avez l'estomac solide, vous pouvez le voir, il ici:
#'0'
au lieu de#48
. IDK si le BRAS assembleurs permet, mais il'0'
fonctionne avec de l'assembleur GNU pour x86. Aussi, vous n'avez pas besoin.ascii
être initialisé, parce que vous n'avez pas lu avant d'écrire.Bon à savoir. Je vais vérifier ça, m'aurait sauvé un peu de peine!
OriginalL'auteur Tombas