在 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);
}

输出:

the output

我还尝试硬编码条件以将 errno 设置为 14 if rdx < 0,但我无法使其正常工作。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...