Domanda

Sto scrivendo un programma in assemblaggio e non funziona, quindi vorrei produrre variabili nelle funzioni X86 per garantire che i valori siano ciò che mi aspetto che siano. C'è un modo semplice per farlo, o è molto complesso?

Se lo rende più semplice, le funzioni di assemblaggio vengono utilizzate dalle funzioni C e vengono compilate con GCC.

È stato utile?

Soluzione

Sembra che la tua domanda sia sulla falsariga di "Come posso stampare valori variabili nell'assemblatore X86". Lo stesso X86 non sa come farlo, perché dipende interamente dal dispositivo di output che stai utilizzando (e le specifiche dell'interfaccia fornita da sistema operativo con quel dispositivo di output).

Un modo per farlo è utilizzare Syscalls del sistema operativo, come hai menzionato in un'altra risposta. Se sei su X86 Linux, puoi usare il sys_write Sys chiama per scrivere una stringa su output standard, come questo (sintassi dell'assemblatore 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

Tuttavia, se si desidera stampare valori numerici, il metodo più flessibile sarà utilizzare il printf() Funzione dalla libreria standard C (menziona che stai chiamando il tuo assemblatore di rountine da C, quindi probabilmente stai collegando comunque alla libreria standard). Questo è un esempio:

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

Due cose da notare:

  • Devi salvare e ripristinare i registri, perché vengono clobberati dalla chiamata; e
  • Quando si chiama una funzione, gli argomenti vengono spinti in ordine da destra a sinistra.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top