天天看点

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出错则会显示出错原因: