首页 > 解决方案 > 尝试使用 NASM 设置 Errno

问题描述

我正在做一个学校的项目,并尝试使用 NASM 设置变量 Errno。

我的练习是仅使用 NASM 复制函数 write。我根本不会使用C语言。如果出现错误(例如写入长度 < 0),我的函数必须允许 C 文件读取 Errno 的值。

我尝试使用 call ___error(文件头中的“extern ___error”),但我不确定应该如何使用它。

我的理解是 Errno 没有链接到特定的寄存器。

所以我的问题是:我应该如何在不使用 C 语言的情况下为 Errno 分配好的价值?

这是我目前的代码:

extern  ___error
SYS_WRITE_MAC equ 0x2000004
SYS_WRITE_LINUX equ 4
section .text
    global _ft_write
_ft_write:
    cmp rdx, 0
    jl _end
    cmp rdi, 0
    jl _end
    mov rax, SYS_WRITE_MAC
    syscall
    mov rdi, rax
    mov r15, rax
    call ___error
    mov rax, r15
    ret
_end:
    call ___error
    mov rax, -1
    ret

对不起,如果我不能理解,我不是以英语为母语的人。

标签: assemblynasmsystem-callserrno

解决方案


我终于明白了:

使用“call ___error”可以返回一个 int* 变量 Errno 上的那个点。所以解决方法是在调用___error后修改Rax指向的字节。


推荐阅读