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)
我完全感到困惑,并想知道是否有人可以解释为什么会这样?
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)