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.

¿Fue útil?

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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top