2009-09-23 21 views
6

Estoy intentando sembrar mi generador de números aleatorios con la hora actual del sistema. ¿Cómo puedo acceder a la hora del sistema usando NASM? (Estoy usando Linux)¿Cómo puedo acceder a la hora del sistema usando NASM?

+0

Una gran edición, pero traté de hacer la pregunta aproximada de lo que pensaba que estaba haciendo el OP ... –

+0

¿Se puede usar el sistema de archivos system/'/ dev' system? –

+0

Ejemplo de QEMU en modo real de trabajo de 16 bits: https://github.com/cirosantilli/x86-bare-metal-examples/blob/173111e0d0081701512a10d72dc0439f4ab1f55d/in_rtc.S ¿Se puede utilizar la llamada al sistema///sistema de archivos dev? –

Respuesta

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 

Esto utiliza NASM, y es de here.

+1

Estoy un poco confundido. ¿Funciona esto suponiendo que el póster usa ventanas? – BigBeagle

+0

Debería funcionar para cualquier sistema operativo en x86 que mantenga la fecha/hora del sistema. –

+0

Acabo de probar - Desafortunadamente, "RTCaddress, al" falla en Vista64 debido al nivel de privilegio. – PhiS

1

Yo diría que, dependiendo de la plataforma en la que se encuentre, tendrá que usar una función de sistema operativo.

En Windows, intente GetSystemTime. En Linux, intente gettimeofday. Consulte la pregunta relacionada here.

6

el uso de Linux:

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

aparecerá la hora actual en UNIX EAX (basta con sustituir la última instrucción si usted quiere que surgió en otro registro).

Esta es una llamada al sistema sys_time (número de llamada del sistema 13) y devuelve la hora en la ubicación de la memoria en ebx, que es la parte superior de la pila.

0

Con NASM, si se dirigen a Linux x86-64, sólo tiene que hacer lo siguiente:

mov rax, 201 
xor rdi, rdi   
syscall 

201 corresponde al número de llamadas al sistema de 64 bits para sys_time (que se enumeran here). El registro rdi se configura en 0 por lo que el valor de retorno después de realizar la llamada al sistema se almacena en rax, pero también puede hacer que apunte a la ubicación de memoria que elija. El resultado se expresa en segundos desde la Época.

Más información sobre esta llamada al sistema se puede encontrar en el time man page.

Cuestiones relacionadas