2010-03-24 5 views
3

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

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

+0

Да, извините, x86 сборка. – Joseph

ответ

7

Похоже, что ваш вопрос соответствует строкам «Как распечатать значения переменных в ассемблере 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 

Две вещи, чтобы отметить:

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

Это именно то, что я искал, огромное спасибо за помощь. – Joseph

Смежные вопросы