如何检查我的系统调用是否在 NASM 中失败

How can I check if my syscall failed in NASM

我想知道是否有人可以解决我的问题。 我正在为学校做一个项目。这个项目是关于创建一个使用系统调用的函数(仅在 NASM 中)(我必须创建 ft_read 来重现实际读取系统调用的行为)。

情况如下:

当一切正常(FD、buff、计数)时,我的功能正常工作。

但是我不知道如何检查系统调用是成功还是失败。

例如:当我使用假 fd(例如 -1)时,系统调用在 rax 中读取 returns 9。 我了解到 9 是变量 Errno 的错误代码。

问题是我不知道如何区分 errno 的错误代码和读取的 return 值(文件中 9 个字符的红色)。

如果有人知道该怎么做,我很乐意知道!

这是我目前的代码:

extern  ___error
SYS_READ_MAC equ 0x2000003
SYS_READ_LINUX equ 3
section .text
    global _ft_read
_ft_read:
    cmp rdi, 0
    jl _error
    cmp rsi, 0
    je _error
    cmp rdx, 0
    jl _error
    mov rax, SYS_READ_MAC
    syscall
    cmp rax, 0
    jl _error
    ret
_error:
    mov r10, rax
    call ___error
    mov qword [rax], r10
    mov rax, -1
    ret

抱歉,如果我的英语不完美,我不是以英语为母语的人。

我找到了答案:

我没有意识到,我也不知道为什么,但我被设置为未签名模式。 所以我看不到rax是否包含负值。

在无符号模式下,如果最后一个操作(或最后一个系统调用?)失败,则进位标志 (CF) 设置为 1。

所以解决方案是:JC _error(如果进位标志设置为 1,则跳转到错误)。

我现在的代码:

extern  ___error
SYS_READ_MAC equ 0x2000003
SYS_READ_LINUX equ 3
section .text
    global _ft_read
_ft_read:
    mov rax, SYS_READ_MAC
    syscall
    jc _error
    ret
_error:
    mov r10, rax
    call ___error
    mov qword [rax], r10
    mov rax, -1
    ret