在 x86 程序集中获取命令行参数时遇到问题
Trouble getting command line arguments in x86 assembly
我正在尝试编写一个 x86 版本的 'cat' 程序作为汇编系统调用的训练。
我在命令行参数方面苦苦挣扎。
我使用主符号作为入口点,所以我想我会在 %rdi 中找到 argc 参数,在 %rsi 中找到 argv 参数。
实际上 argc 按预期在 %rdi 中,但在尝试将 argv[1] 传递给打开的系统调用时我一直在出现段错误。
不确定我做错了什么,这是我的汇编代码:
main:
cmp , %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 , %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 , %rax
ret
.err2:
mov , %rax
ret
您的代码有两个问题。
首先,您使用 lea 8(%rsi), %rdi
检索第二个参数。请注意 rsi
指向命令行参数的指针数组,因此要检索指向第二个参数的指针,您必须使用 mov 8(%rsi), %rdi
.[=17= 之类的东西取消引用 8(%rsi)
]
其次,您在cmp [=15=], %rax
中忘记了0
前面的美元符号。这导致地址 0
的绝对地址模式被 selected,有效地取消引用空指针。要解决此问题,请将缺少的美元符号添加到 select 立即寻址模式。
当我解决这两个问题时,您发布的代码似乎工作正常。
我正在尝试编写一个 x86 版本的 'cat' 程序作为汇编系统调用的训练。
我在命令行参数方面苦苦挣扎。 我使用主符号作为入口点,所以我想我会在 %rdi 中找到 argc 参数,在 %rsi 中找到 argv 参数。 实际上 argc 按预期在 %rdi 中,但在尝试将 argv[1] 传递给打开的系统调用时我一直在出现段错误。
不确定我做错了什么,这是我的汇编代码:
main:
cmp , %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 , %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 , %rax
ret
.err2:
mov , %rax
ret
您的代码有两个问题。
首先,您使用 lea 8(%rsi), %rdi
检索第二个参数。请注意 rsi
指向命令行参数的指针数组,因此要检索指向第二个参数的指针,您必须使用 mov 8(%rsi), %rdi
.[=17= 之类的东西取消引用 8(%rsi)
]
其次,您在cmp [=15=], %rax
中忘记了0
前面的美元符号。这导致地址 0
的绝对地址模式被 selected,有效地取消引用空指针。要解决此问题,请将缺少的美元符号添加到 select 立即寻址模式。
当我解决这两个问题时,您发布的代码似乎工作正常。