2012-04-02 34 views
5

मैं NASM 16 बिट्स का उपयोग कर रहा हूं। मैं एक साधारण असेंबली कोड करने की कोशिश कर रहा हूं जो संख्याओं को 0 से 255 तक प्रत्येक नंबर के बीच 1 सेकंड अंतराल के साथ प्रिंट करता है।स्क्रीन पर एक संख्या कैसे प्रदर्शित करें और डीओएस x86 असेंबली के साथ एक सेकंड के लिए सोएं?

[bits 16] 

mov ax,cs 
mov ds,ax 
mov cx,255 
mov ax,0 

myloop: 
    ;print in screen ax value 
    ;wait 1 second 
    inc ax 

loop myloop 

मुझे यकीन है कि कैसे स्क्रीन में कुल्हाड़ी के मूल्य मुद्रित करने के लिए, और 1 सेकंड (कोड में एक टिप्पणी में उन्हें रखा) प्रतीक्षा करने के लिए कैसे नहीं कर रहा हूँ: यह क्या मैं अब तक है।

+0

क्या आप इसे पीसी पर कर रहे हैं? –

+0

@ पवनमंजुनथ हां, मैं इसे एक पीसी पर कर रहा हूं। विंडोज 7, 32 बिट्स। –

+0

विलंब भाग के लिए, आप [इस] (http://www.physicsforums.com/showthread.php?t=150424) थ्रेड में अंतिम पोस्ट देख सकते हैं। घड़ी 100 मेगाहर्ट्ज माना जाता है। लेकिन आपको परीक्षण और त्रुटि के माध्यम से अपनी मशीन पर सटीक मूल्य का पता लगाने की आवश्यकता है। [यह] (http://www.programmersheaven.com/mb/x86_asm/272272/272273/re-sleep- कार्यक्षमता-/?S=B10000) लिंक आपको देरी दाएं पाने में भी मदद कर सकता है –

उत्तर

6

पीसी 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 चीजों का वर्णन करते हैं, जहां उपरोक्त काउंटर रहता है।

+0

यह टिप्पणी @Alex के लिए है यह सही काम करता है, आपकी उदार मदद के लिए बहुत बहुत धन्यवाद। मैं उपर्युक्त टिप्पणी में जो कुछ भी कहा है उसे पढ़ना सुनिश्चित कर दूंगा। सिर्फ एक प्रश्न, क्या प्रक्रिया को पीछे की ओर जाने के लिए आपके द्वारा पोस्ट किए गए कोड को संशोधित करना मुश्किल है? (255 से 0 तक)। –

+0

मैंने यह किया, आपकी मदद के लिए धन्यवाद @ एलेक्स –

+0

यह div-based और daa- आधारित दोनों मामलों में मामूली/आसान है। –