文件描述符不打印

File descriptor not printing

我对 ASM 还很陌生。我正在调用 sys_open 并尝试打印该系统调用的 return 值(我想查看 fd 或错误)。但是,我的代码不起作用。非常感谢在正确方向上提供的任何帮助。谢谢!

生成文件

asm: test.o
    ld -o asm test.o

test.o: test.asm
    nasm -f elf64 -g test.asm

test.asm

SECTION .text
    GLOBAL _start

    _start: mov rax, 2  ; sys_open
        mov rdi, file   ; get file name address
        mov rsi, 0  ; read only
        syscall
        
        sub al, '0'     ; load fd
        mov byte [buf], al  ; move fd to buf
        mov rsi, buf        ; set address of buf
        mov rdx, 64     ; set length of buf QWORD
        call print

    .exit:  mov rax, 60 ; sys_exit
        mov rdi, 0  ; exit success
        syscall



    ; rsi address of buffer
    ; rdx length of buffer
    print:  push rax
        push rdi
        mov rax, 1  ; sys_write
        mov rdi, 1  ; stdout
        syscall
        pop rdi
        pop rax
        ret

SECTION .data
    file DB `test.asm[=11=]`

SECTION .bss
    buf RESQ 1

跟踪输出

execve("./asm", ["./asm"], [/* 26 vars */]) = 0
open("test.asm", O_RDONLY)              = 3
write(1, "3[=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=]"..., 64Ó) = 64
exit(0)                                 = ?
+++ exited with 0 +++

调试符号需要 -g -F 选项

nasm -f elf64 -g -F 刺 test.asm

此块不正确:

sub al, '0'     ; load fd
mov byte [buf], al  ; move fd to buf
mov rsi, buf        ; set address of buf
mov rdx, 64     ; set length of buf QWORD
call print

因为 sys_open returns 和 int,应该使用 eax 而不是 al。此外,当将 int 转换为等效的 ASCII 字符时,sub 应该是 add(在此示例中,可以假设 fd < 10)。最后,mov rdx, 64 应该是 mov rdx, 8,移动 8 个字节,64 位。

这是修改后的块:

add eax, '0'     ; load fd
mov dword [buf], eax  ; move fd to buf
mov rsi, buf        ; set address of buf
mov rdx, 8     ; set length of buf QWORD
call print

这会打印 sys_open 返回的 fd:

$ ./a.out
3$