Gerando valores de variáveis em x86 asm
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.
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.