天天看點

linux下64位彙編的系統調用(3)

背景知識基本交代清楚了,下面我們實際寫一個小例子看一下。代碼的功能很簡單,顯示一行文本,然後退出。我們使用了syscall中的write和exit調用,查一下前面的調用号和參數,我們初步總結如下:

write(即sys_write)調用号為1,需傳遞3個參數

exit(sys_exit)調用号為60,隻需傳遞一個錯誤碼

如果該值為0表示程式執行成功。

因為以上兩個調用最多的也隻有3個參數,是以我們依次隻會用到3個寄存器rdi,rsi和rdx。

實際代碼如下:

編譯連接配接指令如下:

如果是mac os x系統下指令如下:

因為本博的标題是linux下的彙編,是以mac os x下請參考本貓另一篇博文[mac os x64位以及32位彙編系統調用]。

如果你要生成32位的代碼,在編譯時把elf64改為elf32就可以了,不過我前面說過:32位和64位彙編結構變化較大,光改這個是沒辦法運作成功的。

不出所料代碼運作輸出一行:hello world!并且程式傳回後用echo $?看,應該為0.

這個例子很簡單,下面看一下稍微複雜點的調用:mmap,該調用共有6個參數,我們再一次總結如下:

mmap(sys_mmap) 系統調用号為9,參數分别為:

第一個參數是需要映射到的位址,我們這裡傳0,表示不關心映射到哪;第二個參數是映射空間的大小;第三個參數表示映射區域的保護方式,有很多種,我們這裡隻讓它可讀可寫即可,是以隻用到2者的組合:

prot_write|prot_read

第四個參數是映射區域的一些特性,有很多組合。這裡隻用map_shared|map_anonymous,後者表示建立匿名映射,會忽略參數fd,是以不設及檔案。

第五個參數就是fd,前面說了可以忽略,是以我們傳遞-1;最後一個參數是映射的偏移量,我們也傳遞0.

該調用如果成功傳回映射區域記憶體的起始位址,否則傳回map_failed(-1),錯誤原因存于errno中,我們可以用strerror(errno)檢視具體含義。不過該函數是c庫中的,這裡我們捎帶的用一下。

提到mmap我們不得不提到munmap,用猜大家也知道該調用的含義吧:

munmap(sys_munmap) 調用号為11,需傳遞2個參數:

繼續閱讀