在 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 立即寻址模式。

当我解决这两个问题时,您发布的代码似乎工作正常。