【发布时间】:2022-01-13 22:56:29
【问题描述】:
我正在尝试编写一个 x86 版本的“cat”程序,作为汇编中系统调用调用的训练。
我在命令行参数方面遇到了很多困难。 我使用主符号作为入口点,所以我想我会在 %rdi 中找到 argc 参数,在 %rsi 中找到 argv 参数。 实际上 argc 正如预期的那样在 %rdi 中,但是在尝试将 argv[1] 传递给打开的系统调用时,我一直在发生段错误。
不知道我做错了什么,这是我的汇编代码:
main:
cmp $2, %rdi // If argc != 2 return 1
jne .err1
lea 8(%rsi), %rdi // Move argv[1] -> %rdi
xor %rsi, %rsi // 0 to %rsi -> O_RDONLY
xor %rdx, %rdx
mov $2, %rax // Open = syscall 2
syscall
cmp 0, %rax // If open returns <0 -> exit status 2
jl .err2
mov %rax, %rdi // Move fd to %rdi
call cat
ret
.err1:
mov $1, %rax
ret
.err2:
mov $2, %rax
ret
【问题讨论】:
-
你如何组装和链接你的代码?如果您不与 libc 链接,则不会将参数计数放入
esi或将指向参数的指针放入rdi。相反,您必须从程序加载器将参数放入堆栈的位置检索参数。那么入口点的名称就无关紧要了。 -
我使用 gcc 组装:gcc -o cat cat.S -no-pie
-
好的,那么您的代码应该可以工作了。请注意,
lea 8(%rsi), %rdi检索指向第二个参数的指针的指针。如果您想获得指向字符串本身的指针(看起来就像您正在尝试做的那样),请使用mov 8(%rsi), %rdi。 -
这能回答你的问题吗? Linux 64 command line parameters in Assembly
标签: linux assembly x86-64 command-line-arguments