如何解决在 asm x86_64 中处理 errno
所以我正在使用 asm x86_64(英特尔语法)中的一个库,我将在 C 文件中使用它。我正在处理 write()
。
所以基本上我只是在 rax
设置为 0 的情况下进行系统调用。这里没有什么困难。
唯一的问题在于错误处理。我正在使用 __error_location
函数来获取 errno 的地址,以便在出现错误时设置相应的值。除了尺寸错误外,它工作正常。
例如,如果我放了一个无效的文件描述符,错误将是“地址错误”,很好。但是,如果我在第三个参数 (rdx
) 中设置一个负大小,那么我会得到“成功”并写入错误的字符。我想了解原因,以及如果有人知道如何纠正它。非常感谢
ft_write.s
section .text
global ft_write
extern __errno_location
ft_write:
mov rax,1
syscall
cmp rax,0
jl error
ret
error:
neg rax
push rax
pop rbx
call __errno_location
mov [rax],rbx
mov rax,-1
ret
main.c
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
int ft_write(int fd,void *buffer,int buffer_size);
extern int errno ;
int main(int argc,char **argv)
{
ft_write(1,"1",1);
printf("\n%s\n",strerror(errno));
write(1,strerror(errno));
ft_write(-1,strerror(errno));
write(-1,strerror(errno));
ft_write(1,-1);
printf("\n%s\n",strerror(errno));
return (0);
}
我还尝试硬编码条件以将 errno 设置为 14 if rdx < 0
,但我无法使其正常工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。