2009-09-23 12 views
6

Sto provando a seminare il mio generatore di numeri casuali con l'ora corrente del sistema. Come posso accedere all'ora del sistema utilizzando NASM? (Sto usando linux)Come posso accedere all'ora del sistema usando NASM?

+0

Una specie di modifica di grandi dimensioni, ma ho cercato di rendere la domanda approssimativa a quello che pensavo fosse l'OP .... –

+0

È possibile utilizzare il sistema di chiamata di sistema/'/ dev'? –

+0

Utilizzo di QEMU Esempio di modalità reale a 16 bit: https://github.com/cirosantilli/x86-bare-metal-examples/blob/173111e0d0081701512a10d72dc0439f4ab1f55d/in_rtc.S È possibile utilizzare system call// dev filesystem? –

risposta

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 

Questo utilizza NASM, ed è da here.

+1

Sono un po 'confuso. Sta lavorando sul presupposto che il poster stia usando Windows? – BigBeagle

+0

Dovrebbe funzionare per qualsiasi sistema operativo su x86 che mantiene la data/ora del sistema. –

+0

Appena provato - Sfortunatamente, "out RTCaddress, al" non riesce su Vista64 a causa del livello di privilegio. – PhiS

1

Direi che, a seconda della piattaforma su cui ti trovi, dovrai utilizzare una funzione OS.

Su Windows, prova GetSystemTime. Su Linux, prova a gettimeofday - vedi domanda correlata here.

6

usare Linux:

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

apparirà l'ora corrente unix in eax (basta sostituire l'ultima istruzione se si vuole che mi è venuta in un altro registro).

Questa è una chiamata di sistema a sys_time (system call number 13) e restituisce l'ora nella posizione di memoria in ebx, che è la parte superiore della pila.

0

Con NASM, se si prendono di mira Linux x86-64, si può semplicemente effettuare le seguenti operazioni:

mov rax, 201 
xor rdi, rdi   
syscall 

201 corrisponde al numero di chiamata di sistema a 64 bit per sys_time (come elencato here). Il registro rdi è impostato su 0, quindi il valore di ritorno dopo l'esecuzione della chiamata di sistema viene memorizzato in rax, ma è anche possibile fare in modo che punti a una posizione di memoria di propria scelta. Il risultato è espresso in secondi dall'Epoca.

Ulteriori informazioni su questa chiamata di sistema sono disponibili nello time man page.

Problemi correlati