Pergunta

Estou escrevendo um programa em assembly e ele não está funcionando, então gostaria de gerar variáveis ​​em funções x86 para garantir que os valores sejam o que espero que sejam.Existe uma maneira simples de fazer isso ou é muito complexa?

Para simplificar, as funções assembly estão sendo usadas a partir de funções C e compiladas com gcc.

Foi útil?

Solução

Parece que sua pergunta está na linha de "Como posso imprimir valores de variáveis ​​​​no assembler x86".O próprio x86 não sabe como fazer isso, porque depende inteiramente de qual dispositivo de saída você está usando (e das especificações da interface fornecida pelo sistema operacional para esse dispositivo de saída).

Uma maneira de fazer isso é usar syscalls do sistema operacional, como você mesmo mencionou em outra resposta.Se você estiver no Linux x86, poderá usar o sys_write sys para escrever uma string na saída padrão, como esta (sintaxe do assembler 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

No entanto, se você quiser imprimir valores numéricos, o método mais flexível será usar o método printf() função da biblioteca padrão C (você menciona que está chamando suas rotinas assembler de C, então provavelmente está vinculando à biblioteca padrão de qualquer maneira).Isto é um exemplo:

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

Duas coisas a serem observadas:

  • Você precisa salvar e restaurar registros, pois eles são prejudicados pela chamada;e
  • Quando você chama uma função, os argumentos são enviados na ordem da direita para a esquerda.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top