程序集子程序被调用两次,甚至没有从main调用

Sar*_*all 5 linux assembly gcc x86-64 subroutine

我正在尝试定义一些在其中调用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
Run Code Online (Sandbox Code Playgroud)

这里测试只是调用printf,将数字10输出到屏幕.我不希望这个被调用,因为我没有打电话给它.

但是在编译和运行时:

nasm -f elf64 test.asm
gcc -m64 -o test test.o
Run Code Online (Sandbox Code Playgroud)

我得到输出:

10
10
Run Code Online (Sandbox Code Playgroud)

我完全感到困惑,并想知道是否有人可以解释为什么会这样?

Mat*_*ery 3

int 80H调用 32 位系统调用接口,其中 a) 使用 32 位系统调用号,b) 供 32 位代码而不是 64 位代码使用。您的代码实际上是umask使用随机参数执行系统调用。

对于 64 位系统调用,请改用syscall指令:

...
os_return:
    mov  rax, EXIT      ; Linux system call 60 i.e. exit ()
    mov  rdi, 0     ; Error code 0 i.e. no errors
    syscall         ; Interrupt Linux kernel
...
Run Code Online (Sandbox Code Playgroud)