पीसी BIOS द्वारा रखरखाव और अद्यतन सेगमेंट 0 ऑफसेट 46Ch (या वैकल्पिक रूप से seg 40h, offs 6Ch पर) पर 4-बाइट काउंटर है। यह प्रति सेकेंड 18.2 गुना बढ़ गया है।
mov ax, 0
mov ds, ax
mov cx, 18
mov bx, [46Ch]
WaitForAnotherChange:
NoChange:
mov ax, [46Ch]
cmp ax, bx
je NoChange
mov bx, ax
loop WaitForAnotherChange
दशमलव नंबर आप दशमलव में द्विआधारी संख्या बदलने की आवश्यकता प्रिंट, अलग-अलग अंक मिलता है और उन्हें प्रिंट करने के लिए: सबसे कम बाइट या इस काउंटर के वचन में 18 परिवर्तनों की गणना शायद लगभग एक दूसरे बाहर इंतज़ार कर की सबसे सरल तरीका है । आप संख्या 10 से विभाजित करते हैं और बचे हुए लोगों को इकट्ठा करते हैं। उदाहरण के लिए:
123:
123/10: भागफल 12, शेष 3
12/10: भागफल 1, शेष 2
1/10: भागफल 0, शेष 1
बार-बार 10 से विभाजित करके आप रिवर्स ऑर्डर में रहने वाले लोगों में व्यक्तिगत अंक प्राप्त करते हैं: 3,2,1। फिर आप उन्हें DOS int 21h फ़ंक्शन 2 (लोड 2 में AH
) का उपयोग करके प्रिंट करें, चरित्र के ASCII कोड को DL
में लोड करें, int 21h
निष्पादित करें)।
आपकी समस्या के लिए उपयुक्त एक वैकल्पिक संस्करण, DAA
निर्देश का उपयोग किसी भी रूपांतरण के बिना सीधे दशमलव में संख्या बढ़ाने के लिए किया जाएगा।
यहाँ यह सब कैसे किया जा सकता है:
; file: counter.asm
; assemble: nasm.exe counter.asm -f bin -o counter.com
bits 16
org 0x100
mov ax, 0 ; initial number
mov cx, 256 ; how many numbers
NextNumber:
%if 1 ; change to 0 to use the DAA-based method
push ax
mov dx, 0
div word [ten]
push dx
mov dx, 0
div word [ten]
push dx
mov dx, 0
div word [ten]
push dx
pop dx
call PrintDigit
pop dx
call PrintDigit
pop dx
call PrintDigit
pop ax
call PrintNewLine
call Wait1s
inc ax
%else
mov dl, ah
call PrintDigit
mov dl, al
shr dl, 4
call PrintDigit
mov dl, al
and dl, 0Fh
call PrintDigit
call PrintNewLine
call Wait1s
add al, 1
daa
adc ah, 0
%endif
loop NextNumber
ret
PrintDigit:
pusha
mov ah, 2
add dl, '0'
int 21h
popa
ret
PrintNewLine:
pusha
mov dx, CRLF
mov ah, 9
int 21h
popa
ret
Wait1s:
pusha
push ds
mov ax, 0
mov ds, ax
mov cx, 18
mov bx, [46Ch]
WaitForAnotherChange:
NoChange:
mov ax, [46Ch]
cmp ax, bx
je NoChange
mov bx, ax
loop WaitForAnotherChange
pop ds
popa
ret
ten dw 10
CRLF db 13,10,"$"
आप अग्रणी शून्य या पिछले 1 सेकंड का विलंब पसंद नहीं है, तो आप सशर्त उन्हें छोड़ सकते हैं।
इंटेल और/या एएमडी x86 सीपीयू मैनुअल डाउनलोड करें जो वर्णन करते हैं कि प्रत्येक निर्देश कैसे काम करता है। उन को पढओ। साथ ही, Ralf Brown's Interrupt List
डाउनलोड करें, जो प्रत्येक BIOS और DOS फ़ंक्शन का वर्णन करता है। आपको उनमें से कुछ को I/O करने के लिए जानने की आवश्यकता है। HelpPC
और TechHelp
भी हैं जो आसानी से BIOS Data Area
जैसे कई BIOS और DOS चीजों का वर्णन करते हैं, जहां उपरोक्त काउंटर रहता है।
क्या आप इसे पीसी पर कर रहे हैं? –
@ पवनमंजुनथ हां, मैं इसे एक पीसी पर कर रहा हूं। विंडोज 7, 32 बिट्स। –
विलंब भाग के लिए, आप [इस] (http://www.physicsforums.com/showthread.php?t=150424) थ्रेड में अंतिम पोस्ट देख सकते हैं। घड़ी 100 मेगाहर्ट्ज माना जाता है। लेकिन आपको परीक्षण और त्रुटि के माध्यम से अपनी मशीन पर सटीक मूल्य का पता लगाने की आवश्यकता है। [यह] (http://www.programmersheaven.com/mb/x86_asm/272272/272273/re-sleep- कार्यक्षमता-/?S=B10000) लिंक आपको देरी दाएं पाने में भी मदद कर सकता है –