gpt4 book ai didi

assembly - 为什么堆栈中总是有一个无用的函数参数?

转载 作者:行者123 更新时间:2023-12-04 14:48:04 25 4
gpt4 key购买 nike

我正在 FreeBSD 上学习汇编语言编程。我正在使用 FreeBSD 9.0 i386 版本和 nasm 汇编程序。

当我写一个简单的 syscall 函数时,我发现我必须将一个无用的值压入堆栈才能使代码正确运行。

例如:

; File:test.asm
section .text
global _start
_start:
xor eax,eax
; Argument of exit()
push 0x0
; Syscall of exit()
mov al,1
int 0x80

我用下面的命令来组装和链接上面的代码:
%nasm -f elf test.asm -o test.o
%ld test.o -o test.bin

我用 ktrace 检查程序,发现:
%ktrace ./test.bin
%kdump -d -f ./ktrace.out
2059 ktrace RET ktrace 0
2059 ktrace CALL execve(-1077940941,-1077941260,-1077941252)
2059 ktrace NAMI "./test.bin"
2059 test.bin RET execve 0
2059 test.bin CALL exit(1)

所以代码没有正确运行,因为我提供了 0 作为 exit() 的唯一参数,但程序实际上运行了 exit(1)。

然后我改变了我的代码。
; File:test.asm
section .text
global _start
_start:
xor eax,eax
push 0x0
; Whatever digits,0x1,0x2...0xFFFFFFFF, ect.
push 0xFFFFFFFF
mov al,1
int 0x80

然后代码被正确执行。

起初,我认为这是因为诸如“堆栈填充”或“堆栈对齐”之类的东西,例如 Stack allocation, padding, and alignment .所以它可能会尊重 16 位对齐。但我发现没有。例如,以下代码:
; File:test.asm
section .text
global _start
_start:
xor eax,eax
push 0x0
; Actual argument of exit()
push 0x3
push 0xFFFFFFFF
; Syscall of exit()
mov al,1
int 0x80

实际执行exit(3)。它似乎没有对齐字节。我用gdb调试了上面的代码,当最后一行即将执行时,堆栈是这样的:
0xFFFFFFFF  -> esp
0x00000003
0x00000000

所以这是我的问题:为什么总是有一个无用的论点,或者有什么方法可以解决?

最佳答案

通过阻止 call/ret 指令对来稍微提高性能是一个伪参数。

请参阅以下链接中的 $2.1:

http://www.int80h.org/bsdasm/#default-calling-convention

关于assembly - 为什么堆栈中总是有一个无用的函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11433563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com