3 votes

Attribution d'une valeur à une variable en x86 (NASM)

J'ai décidé d'apprendre l'assembleur pour le plaisir. J'ai codé en C pendant de nombreuses années.

J'ai suivi quelques tutoriels en ligne qui imprimaient "Hello world" et j'ai creusé un peu dans le manuel NASM. Tout est bien qui finit bien. Je me suis donc fixé comme tâche d'imprimer "hello world" dans une boucle. Je sais que je peux le faire avec la fonction loop mais je voulais le coder explicitement et utiliser les variables définies dans l'opcode .bss section.

Cependant, je n'ai manifestement pas compris comment fonctionne l'affectation de variables en assembleur, car je reçois le message d'erreur suivant :

nasm -felf -o hello.o hello.asm
hello.asm:16: error: invalid combination of opcode and operands
hello.asm:17: error: invalid combination of opcode and operands
hello.asm:28: error: invalid combination of opcode and operands

J'ai essayé de chercher sur le web des informations sur l'affectation variable, y compris dans le manuel NASM, mais je n'arrive pas à trouver les informations dont j'ai besoin. Quelqu'un peut-il m'aider ? Voici mon code (simple !):

; print "Hello world!" to the screen multiple times

section .data
    msg:    db  'Hello world!', 10
    msglen: equ $ - msg

section .bss
    iter:   resb    1

section .text
    global _start

_start:

    ; loop 10 times
    mov iter, 0     ; initalise loop counter
FL: cmp iter, 10    ; is iter == 10?
    jge LoopEnd

    ; write the message to STDOUT:
    mov eax,4       ; code for write syscall
    mov ebx,1       ; stdout fd
    mov ecx,msg     ; message to print...
    mov edx,msglen  ; ...and it's length
    int 80h         ; kernel interrupt

    ; increment loop iterator
    inc iter
    jp FL

LoopEnd:

    ; now exit, with return code 0:
    mov eax,1
    mov ebx,0
    int 80h

7voto

Pour faire une référence mémoire dans nasm, vous devez entourer l'adresse de crochets. De plus, dans chacun des cas que vous avez ici, vous devez également spécifier une taille, comme ceci :

    mov byte [iter], 0     ; initalise loop counter
FL: cmp byte [iter], 10    ; is iter == 10?

    inc byte [iter]

Dans ce cas, cependant, il serait probablement plus judicieux d'enregistrer iter dans un registre plutôt qu'en mémoire. Tu t'occupes de la plupart de ceux qui sont évidents avec tes appels système, mais esi o edi look disponible.

4voto

Jonathon Reinhart Points 40535

Je pense que ça doit être entre parenthèses. Essayez [iter] .

Voir le Documents de la NASM chaque fois que vous avez des questions de ce genre.

Dans ce cas, la section sur Adresses effectives :

Une adresse effective est tout opérande d'une instruction qui fait référence à la mémoire. Les adresses effectives, dans le MSNA, ont une syntaxe très simple : elles consistent en une expression évaluant l'adresse souhaitée, entre crochets. Par exemple :

wordvar dw 123
mov ax,[wordvar]
mov ax,[wordvar+1]
mov ax,[es:wordvar+bx]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X