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
我用 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