如何在 asm x64 中更改错误值



我为一个学校项目编写汇编,但我卡在一个点上,我需要重写 在 asm 中读取,所以我得到了它,但我需要设置 errno 变量,然后我的读取可以在出现错误时返回 -1,例如将 errno 的值设置为 9。而且我没有找到如何改变这个著名的错误:(这是我的实际代码:

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

这将照顾平台依赖的东西。

相关内容

最新更新