Вывод значений переменных в x86 asm - PullRequest
3 голосов
/ 24 марта 2010

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

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

1 Ответ

7 голосов
/ 24 марта 2010

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

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

Две вещи, на которые стоит обратить внимание:

  • Вам нужно сохранять и восстанавливать регистры, потому что они засоряются звонком; и
  • Когда вы вызываете функцию, аргументы передаются в порядке справа налево.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...