文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
1. 调用 libc 函数
调用 libc 函数。
global main section .rodata fmt: db '%x', 10, 0 ; \n\NULL section .text main: extern printf mov rdi, fmt ; int printf(const char *format, ...) mov rsi, 100 xor rax, rax call printf extern exit ; void exit(int exit_code) mov rdi, 0 call exit
使用 gcc 链接动态库。由于 gcc 自带 _start
引导,所以我们的代码入口改成 global main
。调试时,以 b main
设置入口断点。
$ nasm -g -F dwarf -f elf64 -o test.o test.s $ gcc -o test -no-pie test.o
调用规范(amd64, 简略):
- 从左到右 ,依次使用
RDI
、RSI
、RDX
、RCX
、R8
、R9
寄存器传递参数。 - 超出部分, 从右往左 依次入栈。(内存由调用方负责)
- 返回值
RAX
或RDX:RAX
。
浮点数使用 xmm 寄存器。
global main section .rodata fmt: db '%d, %d, %d, %d, %d, %d, %d', 10, 0 ; \n\NULL section .text main: extern printf mov rdi, fmt mov rsi, 1 mov rdx, 2 mov rcx, 3 mov r8 , 4 mov r9 , 5 push 7 push 6 xor rax, rax call printf ; 1 2 3 4 5 6 7 extern exit mov rdi, 0 call exit
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论