天天看點

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

經過上一篇的鋪墊貌似可以很輕松的用彙編寫出mmap的代碼來,可仔細一看,還是有不少問題需要解決:

1.系統調用mmap如果出錯并不直接傳回map_failed(-1),而是一個“類似”值;c庫中的mmap函數對其做了包裝,使其最終傳回-1;如果我們直接調用mmap syscall,則這些事必須自己來做。

2.c庫函數如果出錯會設定errno的值,而在彙編中沒法直接用:

的方法使用外部的值,連接配接時會報錯:

c語言的解決辦法很簡單,直接把:

但nasm下這招沒法使;我們先看一下errno對應的c代碼:

可以看到其調用另一個函數,在nasm中我們可以大緻這麼寫:

不過貌似也不太對 :( ,不過我們可以在mmap系統調用後自己操作errno的值,以下代碼将填充變量errno的值并且如果出錯将修正mmap的傳回值為-1:

3 可以看到c代碼中調用mmap參數壓棧,是将第4個參數放到rcx裡,但是在c庫mmap函數裡又将rcx指派給r10;這正應了前面調用規則裡的核心系統調用第4個參數是放在r10裡,而不是rcx裡的哦;是以彙編中我們直接放在r10裡即可,不用先轉到rcx裡了。

最後的代碼如下:

編譯連接配接:

如果mmap成功結果如下:

可以用strace檢視其傳回的syscall:

如果mmap出錯則會顯示出錯原因: