Вывода значений переменной в x86 ASM
Вопрос
Я пишу программу в сборке, и она не работает, поэтому я хотел бы вывести переменные в функциях x86, чтобы гарантировать, что значения - это то, чем я ожидаю. Есть ли простой способ сделать это, или это очень сложно?
Если это делает его проще, функции сборки используются из C -функций и собираются с GCC.
Решение
Похоже, что ваш вопрос соответствует: «Как я могу распечатать значения переменных в ассемблере x86». Сам x86 не знает, как это сделать, потому что это полностью зависит от того, какое устройство вы используете (и специфичность интерфейса, предоставленного ОС, к этому устройству вывода).
Один из способов сделать это - использовать Syscalls операционной системы, как вы упомянули в другом ответе. Если вы находитесь на 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
Две вещи, чтобы отметить:
- Вам нужно сохранить и восстановить регистры, потому что они становятся смягченными по вызову; а также
- Когда вы вызываете функцию, аргументы выдвигаются в порядке правого налеги.