【问题标题】:How can I check if my syscall failed in NASM如何检查我的系统调用是否在 NASM 中失败
【发布时间】:2020-11-04 17:44:35
【问题描述】:

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

情况如下:

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

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

例如:当我使用假 fd(例如 -1)时,系统调用 read 在 rax 中返回 9。 我知道 9 是变量 Errno 的错误代码。

问题是我不知道如何区分 errno 的错误代码和 read 的返回值(文件中的 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

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

【问题讨论】:

  • 它甚至不汇编:file.asm:15: 错误:解析器:预期指令(我将cmpq 更改为cmp
  • 是的,对不起。我没有意识到我分享了我修改后的文件(我测试了一些东西,因为我在互联网上看到 cmpq 可能是一个解决方案,但我没有成功使其工作)

标签: macos assembly x86-64 system-calls errno


【解决方案1】:

我找到了答案:

我没有意识到这一点,我也不知道具体原因,但我被设置为无符号模式。 所以我看不到 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

【讨论】:

  • 我不知道为什么我处于未签名模式。我用命令编译:nasm -f macho64 -o 如果有人有答案,我很高兴知道。找到我的主要问题的答案后,我将在两天后结束这个话题。
  • 只有 MacOS 将 CF 设置为错误指示。 Linux 通过返回 RAX = -4095 .. -1 来返回带内错误。即作为无符号比较,cmp rax, -4095 / jae 由 glibc 使用:What are the return values of system calls in Assembly?
猜你喜欢
  • 2011-12-02
  • 2018-12-07
  • 2011-04-19
  • 2023-03-31
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
相关资源
最近更新 更多