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