如何使用致电返回的地址

问题描述

所有人!

我正在尝试使用汇编函数制作一些项目,该函数从c调用。在c中,我使用errno.h。因此,我想编写与errno的系统调用相关的错误,以便能够使用perror等。我知道,如果失败,系统调用将返回rax负值,因此-rax =错误代码。

在我的errno.h错误中描述为extern int * __ error(void)。

我认为,如果我检测到,从syscall返回的值小于零,我需要调用___error,之后我需要编写-rax从___error返回,但是我不知道如何。

我使用macOS和NASM。更确切地说,我的写函数有一个原型:

        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: %d\n",ft_write(15,"wrong file descriptor",3));
    printf("Error code: %d\n",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>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...