Variables en sortie des valeurs x86 asm
Question
Je suis en train d'écrire un programme dans l'assemblage et il ne fonctionne pas, donc je voudrais à des variables de sortie dans les fonctions x86 pour faire en sorte que les valeurs sont ce que je les attends à être. Est-il un moyen simple de le faire, ou est-ce très complexe?
Si elle le rend plus simple, les fonctions de montage sont utilisées des fonctions C et sont en cours d'élaboration avec gcc.
La solution
Il semble que votre question est le long des lignes de « Comment puis-je imprimer des valeurs variables en assembleur x86 ». Le x86 lui-même ne sait pas comment faire, parce que cela dépend entièrement de ce dispositif de sortie que vous utilisez (et les spécificités de l'interface fournie OS à ce périphérique de sortie).
Une façon de le faire est d'utiliser syscalls du système d'exploitation, comme vous avez mentionné dans une autre réponse. Si vous êtes sur Linux x86, vous pouvez utiliser l'appel sys_write
sys pour écrire une chaîne de sortie standard, comme celui-ci (syntaxe assembleur GNU):
STR:
.string "message from assembler\n"
.globl asmfunc
.type asmfunc, @function
asmfunc:
movl $4, %eax # sys_write
movl $1, %ebx # stdout
leal STR, %ecx #
movl $23, %edx # length
int $0x80 # syscall
ret
Cependant, si vous souhaitez imprimer des valeurs numériques, la méthode la plus flexible sera d'utiliser la fonction printf()
de la bibliothèque standard C (vous mentionnez que vous appelez vos rountines assembleur de C, de sorte que vous êtes probablement liez la bibliothèque standard de toute façon). Voici un exemple:
int_format:
.string "%d\n"
.globl asmfunc2
.type asmfunc2, @function
asmfunc2:
movl $123456, %eax
# print content of %eax as decimal integer
pusha # save all registers
pushl %eax
pushl $int_format
call printf
add $8, %esp # remove arguments from stack
popa # restore saved registers
ret
Deux choses à noter:
- Vous devez sauvegarder et restaurer les registres, car ils faussés par l'appel; et
- Lorsque vous appelez une fonction, les arguments sont poussés dans le bon ordre à gauche.