NASM 通过命令行 arg 提供的程序集读取文件

NASM assembly reading file provided via command line arg

我用 NASM 汇编语言编写了这段代码。我想打开一个通过命令行参数提供的文件。然后我想阅读内容。不幸的是 sys_open 失败了(rax 寄存器中的 file_descriptor 连接为 0xffffffffffffffffe)。当我在 .data 部分对文件名进行硬编码时,程序运行良好。当我通过命令行参数读取文件名时失败。感谢提示

代码:

SYS_READ    equ 0
SYS_OPEN    equ 2
SYS_CLOSE   equ 3
SYS_EXIT    equ 60
O_RDONLY    equ 0

section .bss
    argc resb 1
    filename resb 10
    array resb  256
    number resb 1
    fd resb 8 

section .text
    global _start

_start:
    pop rax              ; pop argc value - should be 2
    cmp rax, 0x2    
    jne _sys_exit_1
    pop rax              ; pop addres pointing to "./prog"
    pop rax              ; pop addres pointing to filename
    mov [filename], rax
    call _sys_open
    mov [fd], rax        ; store file descriptor

_read_seq_loop: 
    call _sys_read

    xor rbx, rbx
    mov bl, byte [number] ; store read number in bl register
    cmp bl, 0
    mov byte [array + rbx], 1 ;save it to array 
    jne _read_seq_loop

    jmp _sys_exit_0


_sys_open:
    mov rax, SYS_OPEN
    mov rdi, filename
    mov rsi, O_RDONLY
    mov rdx, 0
    syscall
    ret

_sys_read:
    mov rax, SYS_READ
    mov rdi, [fd]
    mov rsi, number
    mov rdx, 1
    syscall
    ret

_sys_exit_1:
    mov rax, SYS_EXIT
    mov rdi, 1
    syscall

_sys_exit_0:
    mov rax, SYS_EXIT
    mov rdi, 0
    syscall

进行这两项更改,我想您马上就会看到,您传递的不是指向字符串的指针,而是指向指向字符串的指针的指针。

        pop     rax              ; pop argc value - should be 2
        cmp     rax, 0x2    
        jne     _sys_exit_1
        pop    rax              ; pop addres pointing to "./prog"
        pop    rdi              ; pop address of ARG0
       call    _sys_open
        mov   [fd], rax        ; store file descriptor

由于RDI已经设置好,可以脱离常规

_sys_open:
        mov    rax, SYS_OPEN
        mov    rsi, O_RDONLY
        mov    rdx, 0
        syscall
        ret