linux – 程序集子程序被调用两次,甚至没有从main调用
发布时间:2020-12-14 00:59:54 所属栏目:Linux 来源:网络整理
导读:我正在尝试定义一些在其中调用printf的子例程. 一个非常简单的例子如下: 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
我正在尝试定义一些在其中调用printf的子例程.
一个非常简单的例子如下: extern printf LINUX equ 80H EXIT equ 60 section .data intfmt: db "%ld",10,0 segment .text global main main: call os_return ; return to operating system os_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 kernel test: 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.asm gcc -m64 -o test test.o 我得到输出: 10 10 我完全感到困惑,并想知道是否有人可以解释为什么会这样? 解决方法
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 ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |