我学习汇编程序(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为字符串保留空间,但是如何将整数转换为字符串?或者我必须声明一个整数? 还是我的内核坏了?
答案 0 :(得分:3)
您在一行中有int 80
而不是int 80h
。并且ecx / edx具有其他方面的价值。
打印msg
后,下一个代码应为:
mov eax, 4
mov ebx, 1
mov ecx, time
mov edx, 30
int 80h
(无论如何,它不会这样做,因为sys_time
不返回字符串,所以你不能直接显示它。
检查Internet上的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格式化程序。