gpt4 book ai didi

linux - 汇编程序 sysTime 在执行时给出错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:06:34 25 4
gpt4 key购买 nike

我正在学习汇编程序(Nasm、Linux、Ubuntu 16.4、x86_64)并在使用 sys_time 调用时出现问题 (mov eax, 13)。

section .bss
time: resb 30;

section .data
msg: db "The Time is:";
msgLen: equ $-msg;
blank: db 0x0a;
blankLen: equ $-blank;

section .text
global _start:
_start:

mov eax, 13;
mov ebx, time;
int 80h;

mov eax, 4;
mov ebx, 1;
mov ecx, msg;
mov edx, msgLen;
int 80h;

mov eax, 4;
mov ebx, 1;
mov edx, time;
mov ecx, 30;
int 80;

mov eax, 4;
mov ebx, 1;
mov ecx, blank;
mov edx, blankLen;
int 80h;

mov eax, 1;
mov ebx, 0;
int 80h;

错误信息是(用谷歌翻译)(Written dump)segfaulting如果有人在这里懂德语,德语错误消息Speicherzugriffsfehler(Speicherabzug geschrieben)

我的想法:也许 resb 为字符串保留空间,但我如何将整数转换为字符串?还是我必须声明一个整数?还是我的内核坏了?

最佳答案

您在一行中有 int 80 而不是 int 80h。而 ecx/edx 具有其他方式的值。

打印msg后,下一个代码应该是:

mov eax, 4
mov ebx, 1
mov ecx, time
mov edx, 30
int 80h

(无论如何,它不会像你期望的那样,因为 sys_time 不返回字符串,所以你不能直接显示它)。


检查互联网上的 sys_time 文档...您应该使用 xor ebx,ebx(NULL 缓冲区指针)调用它,并使用返回的 eax 值。给它缓冲区指针现在是过时的调用方式。这是自纪元 (1970-01-01 00:00:00 +0000 (UTC)) 以来的秒数。

所以在代码的开头你可以这样做:

mov eax, 13
xor ebx,ebx
int 80h
mov [time],eax

它仍然没有解决如何显示它(我什至不会尝试,取决于您真正想要实现的目标,是否仅链接到 clib 就足够了,然后使用 C 函数格式化时间,或者您想要自己从头开始创建 seconds_number->time_string 格式化程序)。

关于linux - 汇编程序 sysTime 在执行时给出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39411505/

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