如何在asm x64中更改errno值

问题描述 投票:0回答:1

我为一个学校项目编写了程序集,但我被困在一个点上,我需要重写asm中的Read,所以我明白了,但是我需要设置errno变量,如果出现以下情况,我的read可以返回-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
linux assembly x86-64 system-calls errno
1个回答
3
投票

这很棘手。您需要在系统中查找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;
}

这将处理与平台相关的工作。

© www.soinside.com 2019 - 2024. All rights reserved.