【问题标题】:NASM get curent date and timeNASM 获取当前日期和时间
【发布时间】:2015-03-30 07:50:54
【问题描述】:

我想以某种可用的格式获取 NASM 中的当前日期和时间。 我知道如何获取时间戳(使用系统调用 sys_time),但是要从时间戳获取可用的日期和时间还有很多工作要做。 您需要计算每年、每月、每天并考虑每个闰年、闰秒(到目前为止有多少?我无法预测未来的闰秒),所以我认为,应该有一种操作系统可以处理的方法这个。

所以我的问题是:有没有办法以可用的方式获取当前日期和时间,所以我不必从时间戳计算它?

我正在使用的操作系统:CentOS 7

根据某些人的说法,我的问题与以下内容相同:How can I access system time using NASM? 好吧,这不是真的。我的问题更具体(我不想要时间戳),上面的答案对我没有帮助,因为要么给我时间戳,要么根本不工作。最受好评的答案计数在指令 OUT 上,这会导致我的系统出现 Sefmentation 错误。

【问题讨论】:

  • 如果操作系统有办法处理它,我们应该知道你的,请告诉我们。
  • 我编辑了问题并添加了操作系统版本
  • 好吧,从那里得到一个答案会给你时间戳(这是我不想要的),另一个依靠 OUT 指令导致分段错误(使用 sudo 它只是结束程序而没有错误和退出代码 139)

标签: nasm


【解决方案1】:

您可以使用 libc 中的 timelocaltime 函数来获取 tm struct,然后对该结构中的字段执行任何操作。

这是一个示例,说明您将如何做到这一点(它采用 GAS/AT&T 语法,因为这是我碰巧可用的工具):

.equ tm_sec, 0
.equ tm_min, 4
.equ tm_hour, 8
.equ tm_mday, 12
.equ tm_mon, 16
.equ tm_year, 20
.equ tm_wday, 24
.equ tm_yday, 28
.equ tm_isdst, 32

.bss
now: .space 4

.data
fmt:     .ascii  "%d-%02d-%02d"
.byte 0

.text
.global _main
_main: 

    # Get current time (see 'man time(2)')
    pushl   $now
    call    _time 
    addl    $4,%esp

    # Convert to a tm struct (see 'man localtime(3)')
    pushl   $now
    call    _localtime
    addl    $4,%esp

    # Print the year, month, and day of month fields
    pushl   tm_mday(%eax)
    movl    tm_mon(%eax),%ebx
    incl    %ebx
    pushl   %ebx
    movl    tm_year(%eax),%ebx
    addl    $1900,%ebx
    pushl   %ebx
    pushl   $fmt
    call    _printf
    addl    $16,%esp

    call    _exit

【讨论】:

  • 我对语法很不熟悉(我是汇编程序新手)。还有你从哪里得到_time,_localtime?我收到符号未定义的错误。
  • 这些函数在libc 中。我正在使用gcc -o test -lc test.s
  • .equ 就像%define.space 就像 resbpushl tm_mday(%eax) 就像 push dword [eax + tm_mday]。哦,操作数的顺序是颠倒的(在 AT&T 语法中,你写 src, dest 而不是 dest, src)。
猜你喜欢
  • 2012-12-04
  • 2015-01-18
  • 1970-01-01
  • 2015-03-22
  • 2011-01-01
  • 2011-10-18
  • 2018-09-26
  • 2012-04-29
相关资源
最近更新 更多