How can I access system time using NASM?

2019-01-19 02:42发布

问题:

I am trying to seed my random number generator with current system time. How can I access the system time using NASM? (I am using linux)

回答1:

%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

This uses NASM, and is from here.



回答2:

Using linux:

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

Will pop the current unix time into eax (just replace the last instruction if you want it popped into another register).

This is a system call to sys_time (system call number 13), and it returns the time into the memory location in ebx, which is the top of the stack.



回答3:

I'd say, depending on what platform you're on, you'll have to use an OS function.

On windows, try GetSystemTime. On linux, try gettimeofday - see related question here.



回答4:

With NASM, if you are targeting Linux x86-64, you can simply do the following:

mov rax, 201
xor rdi, rdi        
syscall

201 corresponds to the 64-bit system call number for sys_time (as listed here). Register rdi is set to 0 so the return value after performing the system call is stored in rax, but you could also make it point to a memory location of your choosing. The result is expressed in seconds since the Epoch.

More information about this system call can be found in the time man page.



标签: assembly nasm