Salida de valores variables en x86 ASM
Pregunta
Estoy escribiendo un programa en ensamblaje y no funciona, por lo que me gustaría generar variables en funciones X86 para garantizar que los valores sean lo que espero que sean. ¿Existe una manera simple de hacer esto, o es muy complejo?
Si lo hace más simple, las funciones de ensamblaje se utilizan de las funciones C y se están compilando con GCC.
Solución
Parece que su pregunta está en la línea de "¿Cómo puedo imprimir valores variables en el ensamblador x86"? El X86 en sí no sabe cómo hacerlo, porque depende completamente de qué dispositivo de salida está utilizando (y los detalles de la interfaz proporcional de SO a ese dispositivo de salida).
Una forma de hacerlo es usar Syscalls del sistema operativo, como te mencionaste en otra respuesta. Si estás en x86 Linux, entonces puedes usar el sys_write
SYS Llamada para escribir una cadena a la salida estándar, como esta (sintaxis del ensamblador de 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
Sin embargo, si desea imprimir valores numéricos, el método más flexible será usar el printf()
Funciona desde la biblioteca estándar C (usted menciona que está llamando a su ensamblador Rotines desde C, por lo que probablemente esté vinculando a la biblioteca estándar de todos modos). Esto es un ejemplo:
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
Dos cosas a tener en cuenta:
- Debe guardar y restaurar registros, porque la llamada los golpean; y
- Cuando llama a una función, los argumentos se impulsan en orden de derecha a izquierda.