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

时间:2016-09-09 12:22:36

标签: linux ubuntu assembly nasm system-calls

我学习汇编程序(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为字符串保留空间,但是如何将整数转换为字符串?或者我必须声明一个整数? 还是我的内核坏了?

1 个答案:

答案 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格式化程序。