如何更改 asm x64 中的 errno 值

How to change errno value in asm x64

我为一个学校项目写程序集,我卡在了一个点上,我需要重新写 Read in asm,所以我明白了,但是我需要设置 errno 变量,然后我的 read 可以 return -1 在发生错误的情况下,例如将 errno 的值设置为 9。而且我没有找到如何更改这个著名的 errno :( 这是我的实际代码 :

global my_write

section .text
my_write:
    mov rax, 1  ; sys_write
    syscall     ; call write
    cmp rax, 0
    jl error
    ret
error:
    mov rax, -1
    ret

ps :我发现某个地方需要使用 __error 但我没有找到任何关于此的文档 :(

非常感谢 :D

编辑:

谢谢你们的帮助! __errno_location 我做的工作 :

extern __ernno_location
global my_write

section .text
my_write:
    mov rax, 1  ; sys_write
    syscall     ; call write
    cmp rax, 0
    jl error
    ret
error:
    neg rax    ; get absolute value of syscall return
    mov rdi, rax
    call __ernno_location
    mov [rax], rdi  ; set the value of errno
    mov rax, -1
    ret

这是一件棘手的事情。您需要在您的系统中查找 errno 的定义。它可能会通过像

这样的辅助函数
/* Function to get address of global `errno' variable.  */
extern int *__errno_location (void) __THROW __attribute__ ((__const__));
/* When using threads, errno is a per-thread value.  */
#   define errno (*__errno_location ())

因此您可以从程序集中调用该函数,然后通过返回的指针设置值。更便携的方法是用 C 编写一个辅助函数,比如:

#include <errno.h>
void set_errno(int value)
{
    errno = value;
}

这会处理平台相关的东西。