2009-09-23 15 views
6

मैं वर्तमान सिस्टम समय के साथ अपने यादृच्छिक संख्या जनरेटर को बीज करने की कोशिश कर रहा हूं। मैं NASM का उपयोग कर सिस्टम समय तक कैसे पहुंच सकता हूं? (मैं लिनक्स का उपयोग कर रहा)मैं NASM का उपयोग कर सिस्टम समय तक कैसे पहुंच सकता हूं?

+0

एक बड़ा संपादन की तरह, लेकिन मैंने सवाल उठाया कि ओपी क्या पूछ रहा था .... –

+0

क्या आप सिस्टम कॉल/'/ dev' फाइल सिस्टम का उपयोग कर सकते हैं? –

+0

वर्किंग क्यूईएमयू 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 

यह एनएएसएम का उपयोग करता है, और here से है।

+1

मैं थोड़ा उलझन में हूं। क्या यह धारणा पर काम कर रहा है कि पोस्टर विंडोज़ का उपयोग कर रहा है? – BigBeagle

+0

x86 पर किसी भी ओएस के लिए काम करना चाहिए जो इसकी सिस्टम दिनांक/समय को बनाए रखता है। –

+0

बस कोशिश की - दुर्भाग्यवश, "आरटीसीएड्रेस, अल बाहर" विशेषाधिकार स्तर के कारण Vista64 पर विफल रहता है। – PhiS

1

मैं कहूंगा कि आप किस प्लेटफ़ॉर्म पर हैं, आपको एक ओएस फ़ंक्शन का उपयोग करना होगा।

विंडोज़ पर, GetSystemTime आज़माएं। लिनक्स पर, gettimeofday आज़माएं - संबंधित प्रश्न here देखें।

6

का उपयोग linux:

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

eax में वर्तमान यूनिक्स समय पॉप जाएगा (बस आप चाहते हैं अगर यह एक और रजिस्टर में पॉप पिछले अनुदेश बदलें)।

यह sys_time (सिस्टम कॉल नंबर 13) के लिए एक सिस्टम कॉल है, और यह समय को ईबीएक्स में स्मृति स्थान में लौटाता है, जो ढेर का शीर्ष है।

0
एनएएसएम साथ

, यदि आप लिनक्स x86-64 लक्षित कर रहे हैं, तो आप बस निम्न कर सकते हैं:

mov rax, 201 
xor rdi, rdi   
syscall 

201sys_time के लिए 64-बिट सिस्टम कॉल संख्या से मेल खाती है (सूचीबद्ध के रूप में here)। rdi को 0 पर सेट किया गया है, इसलिए सिस्टम कॉल करने के बाद वापसी मूल्य rax में संग्रहीत है, लेकिन आप इसे अपने चयन के स्मृति स्थान पर भी इंगित कर सकते हैं। परिणाम युग के बाद से सेकंड में व्यक्त किया जाता है।

इस सिस्टम कॉल के बारे में अधिक जानकारी time man page में मिल सकती है।

संबंधित मुद्दे

 संबंधित मुद्दे