c-如何使用从调用返回的地址



大家好!

我正试图使用汇编函数来制作一些项目,这些函数从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的指针。所以你必须做两个步骤:

  1. 取消引用指针以获取值
  2. 返回-rax

取消引用:

mov rax, [rax] ;Nearly equals to rax= (*rax)

阴性rax:

neg rax ; rax=-rax

根据您的评论进行编辑:只需使用:

mov <someFreeRegister>, qword [rax]
neg <someFreeRegister>
mov qword [rax], <someFreeRegister>

相关内容

  • 没有找到相关文章

最新更新