x64 nasm: empurrando endereços de memória para a função de pilha e chamada
Eu sou muito novo no assembly x64 no Mac, então estou ficando confuso portando algum código de 32 bits em 64 bits.
O programa deve simplesmente imprimir uma mensagem viaprintf
função da biblioteca C padrão.
Eu comecei com este código:
section .data
msg db 'This is a test', 10, 0 ; something stupid here
section .text
global _main
extern _printf
_main:
push rbp
mov rbp, rsp
push msg
call _printf
mov rsp, rbp
pop rbp
ret
Compilando-o com nasm assim:
$ nasm -f macho64 main.s
Erro de retorno retornado:
main.s:12: error: Mach-O 64-bit format does not support 32-bit absolute addresses
Eu tentei corrigir esse problema byte alterando o código para isso:
section .data
msg db 'This is a test', 10, 0 ; something stupid here
section .text
global _main
extern _printf
_main:
push rbp
mov rbp, rsp
mov rax, msg ; shouldn't rax now contain the address of msg?
push rax ; push the address
call _printf
mov rsp, rbp
pop rbp
ret
Ele compilou bem com onasm
comando acima, mas agora há um aviso ao compilar o arquivo objeto comgcc
para o programa atual:
$ gcc main.o
ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not
allowed in code signed PIE, but used in _main from main.o. To fix this warning,
don't compile with -mdynamic-no-pic or link with -Wl,-no_pie
Desde que é um aviso não é um erro que eu executei oa.out
Arquivo:
$ ./a.out
Segmentation fault: 11
Espero que alguém saiba o que estou fazendo de errado.