一个非常简单的例子如下:
extern printfliNUX equ 80HEXIT equ 60section .data intfmt: db "%ld",10,0segment .text global mainmain: call os_return ; return to operating systemos_return: mov rax,EXIT ; linux system call 60 i.e. exit () mov rdi,0 ; Error code 0 i.e. no errors int liNUX ; Interrupt linux kerneltest: push rdi push rsi mov rsi,10 mov rdi,intfmt xor rax,rax call printf pop rdi pop rsi ret
这里测试只是调用printf,将数字10输出到屏幕.我不希望这个被调用,因为我没有打电话给它.
但是在编译和运行时:
nasm -f elf64 test.asmgcc -m64 -o test test.o
我得到输出:
1010
我完全感到困惑,并想知道是否有人可以解释为什么会这样?
解决方法 int 80H调用32位系统调用接口,a)使用32位系统调用号,b)用于32位代码,而不是64位代码.您的代码实际上是使用随机参数执行umask系统调用.对于64位系统调用,请使用syscall指令:
...os_return: mov rax,0 ; Error code 0 i.e. no errors syscall ; Interrupt linux kernel...总结
以上是内存溢出为你收集整理的linux – 程序集子程序被调用两次,甚至没有从main调用全部内容,希望文章能够帮你解决linux – 程序集子程序被调用两次,甚至没有从main调用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)