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