尝试使用 NASM 设置 Errno
Trying to set up Errno using NASM
我正在做一个学校的项目并尝试使用 NASM 设置变量 Errno。
我的练习是仅使用 NASM 复制函数 write。根本不会用C语言。如果出现错误(例如,写入长度 < 0),我的函数必须允许 C 文件读取 Errno 的值。
我尝试使用调用 ___error(文件 header 中的“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
对不起,如果我无法理解,我不是以英语为母语的人。
终于明白了:
使用“call ___error”允许 return 一个指向变量 Errno 的 int*。
所以解决方案是在使用call ___error.
后修改Rax指向的字节
我正在做一个学校的项目并尝试使用 NASM 设置变量 Errno。
我的练习是仅使用 NASM 复制函数 write。根本不会用C语言。如果出现错误(例如,写入长度 < 0),我的函数必须允许 C 文件读取 Errno 的值。
我尝试使用调用 ___error(文件 header 中的“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
对不起,如果我无法理解,我不是以英语为母语的人。
终于明白了:
使用“call ___error”允许 return 一个指向变量 Errno 的 int*。 所以解决方案是在使用call ___error.
后修改Rax指向的字节