如何更改 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;
}
这会处理平台相关的东西。
我为一个学校项目写程序集,我卡在了一个点上,我需要重新写 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;
}
这会处理平台相关的东西。