gpt4 book ai didi

assembly - 如何在 Assembly 中返回 errno?

转载 作者:行者123 更新时间:2023-12-01 19:33:46 25 4
gpt4 key购买 nike

我在汇编中返回 errno 时遇到问题。我知道如何找到它,但我无法返回 errno 和返回值。如果我的函数失败,我将返回 errno(由系统调用设置)和 -1。我必须为学校科目做这件事。我必须在汇编中创建一个小库,最后一个函数是“写”。我使用调用系统 write,但我还必须管理 errno。

如果我没记错的话,errno 是一个全局变量。所以我想在汇编中恢复它,并改变它的值,但我还没有成功在我的函数中恢复它......

我的做法是正确的还是完全错误的?

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

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

最佳答案

errno 并不总是一个全局变量。它只需要是一个左值,并且可以是一个隐藏函数调用的宏。来自 the specification :

It is unspecified whether errno is a macro or an identifier declared with external linkage.

事实上,它通常不是全局变量,因为它通常实现为线程局部变量(因此需要调用函数来检索指向 TLS block 的指针)。

最好有一个调用汇编函数并设置 errno 的 C 包装器。


编辑:因为你不能使用 C 函数(在 IMO 中,这是毫无意义的,因为 errno 是一个 C/POSIX 概念),你将不得不实现 errno 收集自己。在errno.h 中找到errno 的定义,并实现汇编中的任何内容。比如我的errno.h定义errno

extern int * __error(void);
#define errno (*__error())

因此,我会调用 __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)
...

您的系统可能会有不同的 errno 实现。

关于assembly - 如何在 Assembly 中返回 errno?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15304829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com