Fat*_*ske 2 x86 assembly errno
我在组装时返回errno时遇到问题。我知道如何找到它,但是我无法返回errno和返回值。如果我的函数失败,我将返回errno(由系统调用设置)和-1。我必须针对学校课程进行此操作。我必须在汇编中创建一个小库,最后一个函数是“写”。我使用呼叫系统写功能,但也必须管理errno。
如果我没记错的话,errno是一个全局变量。因此,我认为可以在汇编中恢复它并更改其值,但是我至今仍无法在函数中恢复它。
我是好方法还是完全错误?
我使用Assembly Intel x86,并使用NASM进行编译。
抱歉语言错误,我不是英语。
errno并不总是一个全局变量。它只需要是一个左值,并且可以是一个隐藏函数调用的宏。从规格:
不确定errno是宏还是使用外部链接声明的标识符。
实际上,它通常不是全局变量,因为通常将其实现为线程局部的(因此需要调用函数来检索指向TLS块的指针)。
最好有一个C语言包装程序来调用汇编函数和set errno。
编辑:由于您不能使用C函数(IMO,这是毫无意义的,因为errno它确实是C / POSIX概念),因此您必须自己实现errno收集。在中找到errnoin 的定义errno.h,并实现汇编中存在的所有内容。例如,我errno.h定义errno为
extern int * __error(void);
#define errno (*__error())
Run Code Online (Sandbox Code Playgroud)
因此,我将调用该__error函数(返回int *),然后存储到返回的地址。例如,这是我的系统为设置而生成的程序集errno:
$ gcc -xc - -o- -S <<EOF
#include <errno.h>
main() { errno = 3; return 0; }
EOF
.section __TEXT,__text,regular,pure_instructions
.globl _main
.align 4, 0x90
_main:
Leh_func_begin1:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
subq $16, %rsp
Ltmp2:
callq ___error
movl $3, (%rax)
...
Run Code Online (Sandbox Code Playgroud)
您的系统可能会使用的其他实现errno。