X86
X86
X86分為32位元與64位元。
X86-32
32位元使用如下的寄存器。
%eax for syscall_number.
%ebx, %ecx, %edx, %esi, %edi, %ebp are used for passing 6 parameters to system calls.
eax會放入syscall的號碼。
%ebx, %ecx, %edx, %esi, %edi, %ebp 用來傳遞syscall參數,最多六個參數。X86-64
64位元使用如下的寄存器。
%rax 會放入syscall的號碼.
%rdi, %rsi, %rdx, %rcx, %r8 and %r9 用來傳遞syscall參數。可參考 : https://stackoverflow.com/a/2538212/4622645
System Call Table
剛才講到放入systemcall的號碼,可參考如下表格:
http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/
Hello World
以下為簡單的印出Hello World 範例。
完成後使用nasm -felf64 hello.asm && ld hello.o && ./a.out 及會印出,但使用Windows系統會有點問題。
a.out為預設compile 完後會產生的檔案名稱。
1.程式會從global 指定的 start開始執行,一定要命名為_start,而global是給linker看的https://stackoverflow.com/a/17899048/4622645。
2.其中section .text 下面放入了read only 與 executable code only
而 section .data 放入了存放的資料。
3.接著讓rax存入1,代表write,讓文字可以寫到Terminal
rdi, rsi, rdx 分別為write的三個參數,可以參考syscall Table表格。
4.跑到syscall 之後即會執行。
可參考不錯的教學範例:http://cs.lmu.edu/~ray/notes/nasmtutorial/
星星範例
以下範例可印出星星
Last updated
Was this helpful?