gpt4 book ai didi

assembly - FreeBSD/amd64 程序集 - 如何读取 "ARGC"?

转载 作者:行者123 更新时间:2023-12-01 01:23:28 25 4
gpt4 key购买 nike

有时返回正确的值,有时返回 0,有时(看似)随机数......都来自同一个可执行文件。

.section .text
.global _start
_start:
movq $1, %rax
popq %rdi
syscall

例如:
%as -o this.o this.s ; ld -o this this.o

%./this; echo $?
1

%./this 1; echo $?
0

%./this 1 2; echo $?
3

%./this 1 2 a; echo $?
4

%./this 1 2 a f; echo $?
0

%_

我是汇编的新手,但我非常有信心获得参数计数就像将它从堆栈中弹出一样容易。
我做错了什么,还是真的搞砸了?

最佳答案

我在 FreeBSD 9.0/amd64 上遇到了同样的情况。我所做的是(我将 nasm 用于汇编程序):

$ cat foo.asm
global _start
_start:
mov rax, 4 ; write
mov rdi, 1 ; stdout
mov rsi, rsp ; address
mov rdx, 16 ; 16bytes
syscall

mov rax, 1 ; exit
syscall
$ nasm -f elf64 foo.asm && ld -o foo foo.o
$ ./foo | hd
00000000 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 |................|
00000010
$ ./foo 2 | hd
00000000 02 00 00 00 00 00 00 00 b8 dc ff ff ff 7f 00 00 |................|
00000010
$ ./foo 2 3 | hd
00000000 00 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 |................|
00000010
$ ./foo 2 3 4 | hd
00000000 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 |................|
00000010
$ ./foo 2 3 4 5 | hd
00000000 05 00 00 00 00 00 00 00 b0 dc ff ff ff 7f 00 00 |................|
00000010

我原以为 argc 在 rsp 上,但事实并非如此。

我猜是内核(图像激活器)设置了寄存器。我搜索了源代码树,在/usr/src/sys/amd64/amd64/machdep.c(exec_setregs)中找到了以下代码。
        regs->tf_rsp = ((stack - 8) & ~0xFul) + 8;
regs->tf_rdi = stack; /* argv */

这些行看起来是说 rsp 是对齐的,实际数据在 rdi。我更改了代码,得到了预期的结果。
$ cat foo.asm
global _start
_start:
push rdi
mov rax, 4 ; write
mov rdi, 1 ; stdout
pop rsi
mov rdx, 16 ; 16bytes
syscall

mov rax, 1 ; exit
syscall
$ nasm -f elf64 foo.asm && ld -o foo foo.o
$ ./foo | hd
00000000 01 00 00 00 00 00 00 00 b0 dc ff ff ff 7f 00 00 |................|
00000010
$ ./foo 2 | hd
00000000 02 00 00 00 00 00 00 00 a8 dc ff ff ff 7f 00 00 |................|
00000010
$ ./foo 2 3 | hd
00000000 03 00 00 00 00 00 00 00 a8 dc ff ff ff 7f 00 00 |................|
00000010
$ ./foo 2 3 4 | hd
00000000 04 00 00 00 00 00 00 00 a8 dc ff ff ff 7f 00 00 |................|
00000010
$ ./foo 2 3 4 5 | hd
00000000 05 00 00 00 00 00 00 00 a8 dc ff ff ff 7f 00 00 |................|
00000010

你可以试试 rdi 吗?

关于assembly - FreeBSD/amd64 程序集 - 如何读取 "ARGC"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8177734/

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