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.

Était-ce utile?

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.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top