linux - 如何更改 asm x64 中的 errno 值
问题描述
我为一个学校项目编写程序集,但我卡在一个点上,我需要在 asm 中重写读取,所以我明白了,但我需要设置 errno 变量,然后我的读取可以返回 -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;
}
这将照顾平台相关的东西。
推荐阅读
- python - pandas assert_frame_equal 无法比较两个相同的数据帧
- if-statement - Google 表格 - 条件格式 - 多个复选框
- php - PHP Array:从 id 和 parent id 生成 id_path 和 level
- vba - 当它引用与表单不同的表时如何更新组合框
- javascript - 未捕获的错误:java.net connectionexeption.failed to connect to "ip address"
- python - 根据列条件绘制饼图
- vba - 使用 Amazon Workspace 中的文档运行 MailMerge 时出现错误消息
- apache-kafka - Ksql 没有开始。ksql-server-start: 32: exec: //bin/ksql-run-class: 未找到
- python-3.x - python中类的方法内部的方法
- unity3d - Unity:如何升级我的材质以兼容 HDRP?