【问题标题】:Assembler sysTime giving error on executing汇编程序 sysTime 在执行时出错
【发布时间】:2016-09-09 12:22:36
【问题描述】:

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

【问题讨论】:

  • 使用export LANG=Cexport LANG=en_US.UTF-8 获取英文错误消息以在SO 上发布。
  • 如果我必须在终端中运行它,我已经完成了 :)

标签: linux ubuntu assembly nasm system-calls


【解决方案1】:

您在一行中有 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(空缓冲区指针)调用它,并使用返回的 eax 值。给它缓冲区指针现在是过时的调用方式。它是自 Epoch (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 格式化程序)。

【讨论】:

  • @TheFrenchPlaysHdMicraftn stackoverflow.com/a/2538212/4271923 ">返回值在%eax中。"man pages中的sys_time描述。 "> 成功时,返回自 Epoch 以来的时间值(以秒为单位)。"
  • @TheFrenchPlaysHdMicraftn:见What are the return values of system calls in Assembly?。我解释了在 asm 中进行系统调用的含义,以及如何理解文档。另请参阅 SO Docs 上的 x86 Linux Hello World example。让我知道它是否有帮助;我写了它,但没有听到任何不知道这些东西的人的反馈。
  • 所以基本上 sys_time 将返回的值存储在 eax 中?
  • 是的,您可以在手册页中查看:sys_time C 原型为time_t time(time_t *tloc);,与 int 80h ABI 一起表示在eax 中返回的值。旧版 32b linux 系统的 time_t 看起来是 32b int,而在 64b linux 中则是 64b int。请注意,整个 int 80h API 已过时且不稳定,无法对其进行编程。为了超级正确,您应该与 clib 动态链接,并通过最新的 OS clib 库调用 sys 调用(实际上,您使用 int 80h 创建的当前 asm 二进制文件可能工作数十年,无需恐慌)。
  • @TheFrenchPlaysHdMicraftn 我只是确保你明白你正在学习一些非常不切实际的东西(int 80h API)。而是专注于 x86 机器代码本身,我会混合 ASM + C++,ASM 用于高级编程,C++ 调用所有 OS 低级东西。我的意思是,即使是 x86 ASM 知识也会随着时间的推移而过时(随着每一代 x86 的出现,它也在大规模扩展),但恕我直言,从长远来看,它具有更好的可用性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多