Comment Utiliser Scanf Dans les MSNA?
Je ne peux pas comprendre cela. Je suis évidemment vraiment nouveau à l'Assemblée, et je suis à essayer de comprendre comment utiliser Scanf pour obtenir la saisie de l'utilisateur.
Je sais pour les utiliser Printf tout ce que j'ai à faire est d'appuyer sur les données que je veux écrire sur l'écran dans la pile comme ceci:
global _main
extern _printf
extern _scanf
section .data
msg db "Hi", 0
section .text
_main:
push ebp
mov ebp, esp
push msg
call _printf
mov esp, ebp
pop ebp
ret
Mais je ne peux pas comprendre comment utiliser Scanf. Quelqu'un peut s'il vous plaît donnez-moi le plus simple possible code source, vous pouvez pour le Scanf? Vraiment, je veux juste mettre ce que l'utilisateur tape dans.
Je ne suis pas habitué à 32 bits de l'Assemblée. Je n'ai jamais utilisé 16bit, et je sais que dans 16bit (DOS), tu peux faire ça:
mov ah, 3fh
mov dx, input
int 21h
input rb 100d
Et tout ce que vous tapez dans la volonté de l'placés à l'adresse de "input".
S'il vous plaît garder avec moi. Je suis en train d'essayer de comprendre cela.
OriginalL'auteur user1432532 | 2012-06-11
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé ce 'La programmation en MSNA.PDF"
Qui est l'asm version de cette fonction de C:
Où est l'assemblée du code de printf("%d\n", integer1+integer2) déclaration ?
Bien repéré. C'est dans le PDF et je l'ai ajouté
OriginalL'auteur Preet Sangha
Grâce Preet. J'ai fait un exemple simple basé sur votre code pour illustrer l'utilisation de scanf.
Programme qui demande un entier et l'imprime à l'écran:
OriginalL'auteur mateuszb
C'est le premier post qui s'affiche lorsque vous effectuez une recherche pour
scanf
dans l'assemblée, de sorte que, même si ses 4 ans post, je pense qu'il devrait être correct.Oukei, donc, à
call scanf
dans MSNA de l'assemblée, vous devez:Donc, disons que vous êtes traying d'
et à la suite de la liste:
... 1.
...
2. C'est le premier paramètre que vous transmettez à vos C
scanf
, il dit ce que vous obtenez. Un nombre entier, deux, un float, string, char... Dans ce cas, deux entiers séparés par un espace (fonctionne aussi avec Enter)...
3.
...
4 5 6. Notez que vous poussez l'adresse des variables, et non son contenu (c'est à dire [var])
Notez également que vous devez ajouter 12 à le pointeur de pile, parce que vous avez poussé 3 double paramètres de word. Si vous ajoutez à 12 octets (3*4 octets) à la pile de "sauter" les paramètres.
*J'ai déclaré dword pour les variables parce que
%d
utilise dword, tout commeprintf
.**Le
,0
à la fin de la formatation chaîne est une sentinelle de caractère.J'ai répondu en tant qu'invité avec le nom de PunditPoe, ne peut pas comprendre si je peut "entrer" dans ce compte invité et de supprimer le post. Mais, de toute façon, j'ai corrigé ce un pour se tenir debout sur ses propres. Merci.
OriginalL'auteur
Permet de dire que vous voulez faire quelque chose comme
Qui prend deux valeurs et de les stocker dans des variables.
En assemblée vous
push
l'entrée des variables dans la pile (en arrière) et puiscall scanf
.Quelque chose comme vous avez deux variables
... et puis
*Notez que j'ai poussé en arrière afin, la première valeur sera stockée dans var1.
Après l'exécution les valeurs que vous avez entrées soient stockées dans les variables.
Si vous voulez une seule valeur, il suffit d'appuyer une seule variable.
add esp, 8
pour les 32 bits de code, ouadd rsp, 16
pour 64-bit).OriginalL'auteur PunditPoe