如何使用NASM访问系统时间?

时间:2009-09-23 13:14:41

标签: assembly nasm

我正在尝试使用当前系统时间为随机数生成器播种。如何使用NASM访问系统时间? (我正在使用linux)

5 个答案:

答案 0 :(得分:6)

使用linux:

mov eax, 13
push eax
mov ebx, esp
int 0x80
pop eax

将当前的unix时间弹出到eax中(如果你想将它弹出到另一个寄存器中,只需替换最后一条指令)。

这是对sys_time的系统调用(系统调用号13),它将时间返回到ebx中的内存位置,这是堆栈的顶部。

答案 1 :(得分:5)

%define RTCaddress  0x70
%define RTCdata     0x71

;Get time and date from RTC

.l1:    mov al,10           ;Get RTC register A
    out RTCaddress,al
    in al,RTCdata
    test al,0x80            ;Is update in progress?
    jne .l1             ; yes, wait

    mov al,0            ;Get seconds (00 to 59)
    out RTCaddress,al
    in al,RTCdata
    mov [RTCtimeSecond],al

    mov al,0x02         ;Get minutes (00 to 59)
    out RTCaddress,al
    in al,RTCdata
    mov [RTCtimeMinute],al

    mov al,0x04         ;Get hours (see notes)
    out RTCaddress,al
    in al,RTCdata
    mov [RTCtimeHour],al

    mov al,0x07         ;Get day of month (01 to 31)
    out RTCaddress,al
    in al,RTCdata
    mov [RTCtimeDay],al

    mov al,0x08         ;Get month (01 to 12)
    out RTCaddress,al
    in al,RTCdata
    mov [RTCtimeMonth],al

    mov al,0x09         ;Get year (00 to 99)
    out RTCaddress,al
    in al,RTCdata
    mov [RTCtimeYear],al

    ret

这使用NASM,来自here

答案 2 :(得分:2)

作为上述 Pyves 答案的附录(使用 x86-64/NASM/Linux),如果您想获得比一秒更好的时钟分辨率,您可以使用 228 而不是 201 进行系统调用以在 64 秒内获得秒数 -位变量和另一个 64 位变量中的额外纳秒(超过秒)。

default rel
section .bss
    time: resq 2   ; 2 qwords for seconds and nanoseconds

section .text
    mov rax, 228   ; 228 is system call for sys_clock_gettime
    xor edi, edi   ; 0 for system clock (preferred over "mov rdi, 0")
    lea rsi, [time]
    syscall        ; [time] contains number of seconds
                   ; [time + 8] contains number of nanoseconds

man page,系统调用是
int clock_gettime(clockid_t clock_id, struct timespec *tp);
x86-64 上的 struct timespec 是一对无符号 64 位整数,低地址为秒,高地址为 nanos。

答案 3 :(得分:1)

我会说,根据您所使用的平台,您必须使用操作系统功能。

在Windows上,尝试GetSystemTime。在linux上,尝试gettimeofday - 请参阅相关问题here

答案 4 :(得分:0)

使用NASM,如果您的目标是Linux x86-64,则可以执行以下操作:

mov rax, 201
xor rdi, rdi        
syscall

201对应sys_time的64位系统调用号(如列出的here)。注册rdi设置为0,因此执行系统调用后的返回值存储在rax中,但您也可以将其指向您选择的内存位置。结果以Epoch表示的秒数表示。

有关此系统调用的更多信息,请参阅time man page