assembly - 在 asm x86_64 中处理 errno
问题描述
所以我正在使用 asm x86_64(intel 语法)中的一个库,我将在 C 文件中使用它。我正在努力write()
。所以基本上我只是在做一个rax
设置为 0 的系统调用。这里没什么难的。
唯一的问题是错误处理。我正在使用该__error_location
函数获取errno的地址,以便在出现错误时设置相应的值。除了尺寸错误外,它工作正常。
例如,如果我放置了一个无效的文件描述符,错误将是“错误地址”,很好。但是,如果我在第三个参数 ( rdx
) 中输入一个负数,那么我会得到“成功”并且写入了错误的字符。如果有人知道,我想了解原因以及如何纠正它。非常感谢
ft_write.s
section .text
global ft_write
extern __errno_location
ft_write:
mov rax, 1
syscall
cmp rax, 0
jl error
ret
error:
neg rax
push rax
pop rbx
call __errno_location
mov [rax], rbx
mov rax, -1
ret
主程序
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
int ft_write(int fd, void *buffer, int buffer_size);
extern int errno ;
int main(int argc, char **argv)
{
ft_write(1, "1", 1);
printf("\n%s\n", strerror(errno));
write(1, "1", 1);
printf("\n%s\n", strerror(errno));
ft_write(-1, "1", 1);
printf("\n%s\n", strerror(errno));
write(-1, "1", 1);
printf("\n%s\n", strerror(errno));
ft_write(1, "1", -1);
printf("\n%s\n", strerror(errno));
write(1, "1", -1);
printf("\n%s\n", strerror(errno));
return (0);
}
我还尝试硬编码一个条件以将 errno 设置为 14 ifrdx < 0
但我无法使其工作。
解决方案
推荐阅读
- javascript - 使用量角器获取所有元素的 id
- jquery - 无法让下拉菜单与引导程序一起使用
- javascript - 从左到右滑动多个div
- python - Python = 每秒重复一次
- tensorflow - Keras "return_sequences" 选项返回 2D 数组而不是 3D
- sql - 更新不同表中相关记录的值
- wordpress - Wordpress 管理员登录在 redirect_to 中包含双 URL
- python - 在 O(1) 中删除 deque 中的散列节点
- coq - 在 then 部分 coq 中使用 if expression = true 的证明
- html - 字体标签的 style="cursor:pointer" 在 Chrome 中有效,但在 IE 或 Edge 中无效