Похоже, что ваш вопрос соответствует строкам «Как распечатать значения переменных в ассемблере 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
Две вещи, чтобы отметить:
- Вы должны сохранять и восстанавливать регистры, потому что они затерт вызовом; и
- Когда вы вызываете функцию, аргументы выставляются в порядке справа налево.
Да, извините, x86 сборка. – Joseph