我为一个学校项目编写汇编,但我卡在一个点上,我需要重写 在 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;
}
这将照顾平台依赖的东西。