如何在组装中返回errno?

Fat*_*ske 2 x86 assembly errno

我在组装时返回errno时遇到问题。我知道如何找到它,但是我无法返回errno和返回值。如果我的函数失败,我将返回errno(由系统调用设置)和-1。我必须针对学校课程进行此操作。我必须在汇编中创建一个小库,最后一个函数是“写”。我使用呼叫系统写功能,但也必须管理errno。

如果我没记错的话,errno是一个全局变量。因此,我认为可以在汇编中恢复它并更改其值,但是我至今仍无法在函数中恢复它。

我是好方法还是完全错误?

我使用Assembly Intel x86,并使用NASM进行编译。

抱歉语言错误,我不是英语。

nne*_*neo 5

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。