如何解决如何使用致电返回的地址
所有人!
我正在尝试使用汇编函数制作一些项目,该函数从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的指针。
因此,您必须执行两个步骤:
- 取消引用指针以获取值
- 返回
-rax
。
取消引用:
mov rax,[rax] ;Nearly equals to rax= (*rax)
否定rax:
neg rax ; rax=-rax
根据您的评论进行编辑: 只需使用:
mov <someFreeRegister>,qword [rax]
neg <someFreeRegister>
mov qword [rax],<someFreeRegister>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。