2009-09-23 10 views
6

乱数ジェネレータに現在のシステム時刻を設定しようとしています。 NASMを使用してシステム時刻にアクセスするにはどうすればよいですか? (私はLinuxを使用しています)NASMを使用してシステム時刻にアクセスするにはどうすればよいですか?

+0

種類が大きく編集されましたが、私はOPが尋ねていたものとおおよその質問をしました.... –

+0

システムコール/ '/ dev'ファイルシステムを使用できますか? –

+0

作業QEMU 16ビットリアルモードの例:https://github.com/cirosantilli/x86-bare-metal-examples/blob/173111e0d0081701512a10d72dc0439f4ab1f55d/in_rtc.Sシステムコール/ devファイルシステムを使用できますか? –

答えて

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からです。

+1

私は少し混乱しています。これは、ポスターが窓を使用しているという前提で動作していますか? – BigBeagle

+0

システム日付/時刻を維持するx86上のOSで動作するはずです。 –

+0

ちょうど試みました - 残念ながら、 "out RTCaddress、al"は特権レベルのためVista64で失敗します。 – PhiS

1

私は、どのプラットフォームを使用しているかによって、OS機能を使用する必要があると言います。

ウィンドウでは、GetSystemTimeを試してください。 Linuxでは、gettimeofdayを試してください - 関連する質問hereを参照してください。 Linuxを使用して

6

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

は(あなたはそれが別のレジスタにポップしたい場合は、単に最後の命令を置き換える)EAXに現在のUNIX時間をポップアップ表示されます。

これはsys_time(システムコール番号13)へのシステムコールで、スタックの最上部であるebxのメモリ位置に時刻を返します。 NASMで

0

、あなたは、Linux x86-64のをターゲットにしている場合、あなたは、単に次の操作を実行できます。(hereが記載されているとして)

mov rax, 201 
xor rdi, rdi   
syscall 

201sys_timeための64ビットのシステムコール番号に対応しています。レジスタrdiは0に設定され、システムコール実行後の戻り値はraxに格納されますが、選択したメモリ位置を指すようにすることもできます。結果は、エポックから秒単位で表されます。

このシステムコールの詳細については、time man pageを参照してください。

関連する問題