ログ

見る価値ありません

x86_64アセンブリでechoプログラム書いた

環境

Ryzen 5 2600
Windows10 2004 WSL2 Ubuntu 20.04.1 LTS
NASM version 2.14.02
GNU ld (GNU Binutils for Ubuntu) 2.34

コード

global _start

section .text

_start:
    mov rbp, rsp
    jmp main

main:
    sub rsp, 0x100 ; char string[256];

    mov rax, rbp
    sub rax, 0x100

    push 0x100
    push rax
    call read
    add rsp, 0x10

    mov rax, rbp
    sub rax, 0x100

    push 0x100
    push rax
    call write
    add rsp, 0x10

    mov eax, 0
    jmp exit

; int read(char *string, int length)
read:
    push rbp
    mov rbp, rsp

    mov rax, 0 ; syscall read
    mov rdi, 0 ; stdin
    mov rsi, [rbp + 16]
    mov edx, [rbp + 24]
    syscall
    mov rsp, rbp
    pop rbp
    ret

; void write(char *string, int length)
write:
    push rbp
    mov rbp, rsp

    mov rax, 1 ; syscall write
    mov rdi, 1 ; stdout
    mov rsi, [rbp + 16]
    mov edx, [rbp + 24]
    syscall

    mov rsp, rbp
    pop rbp
    ret

; void exit(int status)
exit:
    mov edi, eax
    mov rax, 60 ; syscall exit
    syscall

わかったこと

  • Linux x86_64 ABI(上のコードは準拠してない)
  • スタックはアドレスが若くなる方向に伸びる
  • ベースポインタは最初は0で初期化されている(環境依存かも)
  • manのセクション2はsyscall

わからなかったこと

  • 相対アドレスをスタックにpushする簡潔な方法
  • gdbの使い方

参考

www.mztn.org

vanya.jp.net