首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用调用返回的入口

如何使用调用返回的入口
EN

Stack Overflow用户
提问于 2020-08-11 09:33:37
回答 1查看 347关注 0票数 2

各位!

我试图使用程序集函数来做一些项目,在c.中,我使用errno.h调用。所以我想写一些与syscalls相关的错误,为了能够使用perror等等,我知道syscall在失败时返回到rax负值,所以-rax = error代码。

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

在我看来,如果我发现syscall的返回值小于零,我需要调用___error,然后我需要编写-rax才能从___error返回,但我不知道怎么回事。

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

代码语言:javascript
代码运行次数:0
运行
复制
        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

这是我的主要:

代码语言:javascript
代码运行次数:0
运行
复制
#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

我是新装配的,如果问题是愚蠢的,请提前感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-11 09:38:58

__error返回指向rax中的int的指针。所以你必须做两个步骤:

获取值的

  1. 解除引用指针
  2. 返回

德雷克:

代码语言:javascript
代码运行次数:0
运行
复制
mov rax, [rax] ;Nearly equals to rax= (*rax)

否定rax:

代码语言:javascript
代码运行次数:0
运行
复制
neg rax ; rax=-rax

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

代码语言:javascript
代码运行次数:0
运行
复制
mov <someFreeRegister>, qword [rax]
neg <someFreeRegister>
mov qword [rax], <someFreeRegister>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63355469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档