x86_64 アセンブラー + C = One Love

このノートでは、アセンブラから C 関数を呼び出すプロセスについて説明します。
printf(“Hello World!\n”); を呼び出してみましょう。そして exit(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

すべては見かけよりもはるかに単純です。.rodata セクションでは静的データを記述します。この場合、行「Hello, world!」、10 は改行文字であり、null にすることも忘れません。

コード セクションでは、外部関数 printf、stdio の出口、stdlib ライブラリを宣言し、入力関数 main も宣言します。

    extern printf
    extern exit
    global main

rax 関数から戻りレジスタに 0 を渡します。mov rax, 0; を使用できます。しかし、高速化するために、xor rax、rax が使用されます。次に、文字列へのポインタを最初の引数に渡します。

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

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

同様に、最初の引数に 0 を渡して exit を呼び出します。

    call exit

アメリカ人はこう言います。
誰の言うことも聞かない
人は。そのピラフは @ Alexander Pelevin

を食べています。

ソース

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

ソースコード

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

Leave a Comment

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