加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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
...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读