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?