大家好!
我正试图使用汇编函数来制作一些项目,这些函数从c调用。在c中,我使用errno.h。所以我想写一些错误,与系统调用errno相关,以便能够使用perror等。我知道如果系统调用失败,会返回rax负值,所以-rax=错误代码。
在我的errno.h错误中,描述为extern int*__error(void(。
在我看来,如果我检测到syscall的返回小于零,我需要调用__error,之后我需要编写-rax以从__error返回,但我不知道如何。
我使用macOS和NASM。更确切地说,有一个原型my write func:
global _ft_write
extern ___error
_ft_write:
mov rax, 0x2000004
syscall
cmp rax, 0
jl errno
ret
errno:
call ___error
mov rax, [rax]
neg rax
ret
for compile: nasm -fmacho64
这是我的主要:
#include <stdio.h>
#include <errno.h>
int main(void)
{
printf("Write return: %dn", ft_write(15, "wrong file descriptor", 3));
printf("Error code: %dn", errno); return(1);
}
输出:写入返回:9错误代码:0
p。S.我是新来的,如果这个问题很愚蠢,我很抱歉,提前谢谢
__error
返回指向rax
中int的指针。所以你必须做两个步骤:
- 取消引用指针以获取值
- 返回
-rax
取消引用:
mov rax, [rax] ;Nearly equals to rax= (*rax)
阴性rax:
neg rax ; rax=-rax
根据您的评论进行编辑:只需使用:
mov <someFreeRegister>, qword [rax]
neg <someFreeRegister>
mov qword [rax], <someFreeRegister>