我为一个学校项目编写了程序集,但我被困在一个点上,我需要重写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
这很棘手。您需要在系统中查找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;
}
这将处理与平台相关的工作。