Вывод значений переменных в x86 asm

Я пишу программу на ассемблере, и она не работает, поэтому я хотел бы выводить переменные в функциях x86, чтобы убедиться, что значения соответствуют моим ожиданиям. Есть ли простой способ сделать это, или это очень сложно?

Если это упрощает, функции сборки используются из функций C и компилируются с помощью gcc.


person Joseph    schedule 24.03.2010    source источник


Ответы (1)


Похоже, ваш вопрос связан с вопросом «Как я могу распечатать значения переменных в ассемблере x86». Сам x86 не знает, как это сделать, потому что это полностью зависит от того, какое устройство вывода вы используете (и особенности интерфейса, предоставляемого операционной системой для этого устройства вывода).

Один из способов сделать это - использовать системные вызовы операционной системы, как вы упомянули в другом ответе. Если вы используете x86 Linux, вы можете использовать вызов sys_write sys для записи строки в стандартный вывод, например так (синтаксис ассемблера 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

Однако, если вы хотите напечатать числовые значения, то наиболее гибким методом будет использование функции printf() из стандартной библиотеки C (вы упоминаете, что вызываете свои подпрограммы на ассемблере из C, поэтому вы, вероятно, связываетесь со стандартной библиотекой в любом случае). Вот пример:

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

Две вещи, которые следует отметить:

  • Вам нужно сохранять и восстанавливать регистры, потому что они затираются вызовом; а также
  • Когда вы вызываете функцию, аргументы помещаются справа налево.
person caf    schedule 24.03.2010
comment
Это именно то, что я искал, большое спасибо за помощь. - person Joseph; 24.03.2010