x86_64 Montador + C = Um Amor

Nesta nota descreverei o processo de chamada de funções C a partir do assembler.
Vamos tentar chamar printf(“Hello World!\n”); e sair(0);

    message: db "Hello, world!", 10, 0

section .text
    extern printf
    extern exit
    global main

main:
    xor	rax, rax
    mov	rdi, message    
    call printf
    xor rdi, rdi
    call exit

Tudo é muito mais simples do que parece, na seção .rodata iremos descrever dados estáticos, neste caso a linha “Hello, world!”, 10 é um caractere de nova linha, e também não esquecemos de anulá-lo.

Na seção de código declararemos as funções externas printf, exit das bibliotecas stdio, stdlib e também declararemos a função de entrada main:

    extern printf
    extern exit
    global main

Passamos 0 para o registrador de retorno da função rax, você pode usar mov rax, 0; mas para acelerar eles usam xor rax, rax; A seguir, passamos um ponteiro para a string do primeiro argumento:

Далее вызываем внешнюю функцию Си printf:

    xor	rax, rax
    mov	rdi, message    
    call printf
    xor rdi, rdi
    call exit

Por analogia, passamos 0 para o primeiro argumento e chamamos exit:

    call exit

Como dizem os americanos:
Quem não escuta ninguém
Esse pilaf está comendo @ Alexander Pelevin

Fontes

https://www.devdungeon. com/content/how-mix-c-and-assembly
https://nekosecurity.com/x86-64-assembly/part-3-nasm-anatomy-syscall-passing-argument
https://www.cs.uaf.edu/2017/fall/cs301/reference/x86_64.html

Código fonte

https://gitlab.com/demensdeum/assembly-playground

Leave a Comment

Your email address will not be published. Required fields are marked *