首页 > 解决方案 > 在 asm x86_64 中处理 errno

问题描述

所以我正在使用 asm x86_64(intel 语法)中的一个库,我将在 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

主程序

#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, "1", 1); 
    printf("\n%s\n", strerror(errno));

    ft_write(-1, "1", 1); 
    printf("\n%s\n", strerror(errno));
    write(-1, "1", 1); 
    printf("\n%s\n", strerror(errno));

    ft_write(1, "1", -1);
    printf("\n%s\n", strerror(errno));
    write(1, "1", -1);
    printf("\n%s\n", strerror(errno));
    return (0);
}

输出 : 输出

我还尝试硬编码一个条件以将 errno 设置为 14 ifrdx < 0但我无法使其工作。

标签: assemblyx86-64errno

解决方案


推荐阅读