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の使い方