2012-11-03 68 views
9

मेरे जानकारी here से आ रही है। काम एक प्रोग्राम है जो कोई 20 से अधिक वर्ण में पढ़ता है, अपर केस को उन अक्षरों को बदल देता है, और उसके बाद राजधानियों के रूप में इनपुट प्रिंट लिए पूछता है।मुझे समझ नहीं आता इंटरप्ट 21 उपयोग करने के लिए कैसे, एएच = 0ah

मैं कैसे int21/एएच = 0ah से इनपुट का उपयोग करने की कोई अंदाज़ा नहीं है। मैं वास्तव में एक और सटीक सवाल नहीं पूछ सकता जब तक कि मैं समझता हूं कि ऊपर क्या जोड़ा गया है। क्या कोई समझा सकता है? इसके अलावा, अगर मैं कोई फर्क पड़ता हूं तो मैं टीएएसएम का उपयोग कर रहा हूं। इसके अलावा, मैं इसे स्वतंत्रता पर परीक्षण कर रहा हूं।

Update1:

ठीक है, आपकी मदद के लिए धन्यवाद, मेरा मानना ​​है कि मैं समझता हूँ कि कैसे बाधा की स्थापना की जरूरत है और व्यवहार करता है।

सेटअप: मैं एक डी एस नामित करने के लिए है: dx जहां मैं इस बफर का अस्तित्व

मैं डी एस सेट करने के लिए करना चाहते हैं: 20 dx (जो पात्रों बफर पकड़ सकता है की अधिकतम संख्या निर्धारित करता है)

मैं डी एस सेट करने के लिए: dx + 1 0

असल int21 फोन/एएच = 0ah, जो डी एस के लिए जाना जाएगा (जो मैं किसी भी तरह में पढ़ने के लिए वर्णों की एक न्यूनतम संख्या निर्धारित लगता है) करने के लिए: dx और प्रीसेट बाइट्स की व्याख्या करें। यह कार्यक्रम को रोकती है, जबकि यह इनपुट के लिए इंतजार कर रहा है

int21/एएच = 0ah डी एस से भर जाएगा: dx + 2 + मेरा इनपुट

(जहां n सहित वर्ण डालने की संख्या '\ आर' है) के साथ n

मेरा सवाल अब है, मैं यह कैसे कर सकता हूं। मैंने अभी x86 असेंबली भाषा संदर्भ को फिर से देखा है, लेकिन अभी तक कुछ भी उपयोगी नहीं मिला है।

कोड मैं अब तक

  assume   cs:code,ds:code 
code  segment 
start: 

      mov ax,code ;moves code segment into reg AX 
      mov ds,ax ;makes ds point to code segment 

      mov ah,0ah 
      int 21h 
      mov ax,1234h ;breakpoint 

      mov ah,9 
      mov dx,offset message 
      int 21h 

endNow: 
      ;;;;;;;;;;ends program;;;;;;;;;; 
      mov ah,0 ;terminate program 
      int 21h ;program ends 

message db 'Hello world!!!',13,10,'$' 
code  ends 
      end start 

उत्तर

6

डॉस समारोह उपयोगकर्ता इनपुट के साथ एक बफर को पुन: प्राप्त यही कारण है कि मिल गया है। यह table देखें। ऐसा लगता है कि प्रोग्राम उस कॉल का उपयोग कर निष्पादन को रोकने के लिए उपयोगकर्ता को प्रोग्राम को फिर से शुरू करने के लिए प्रतीक्षा कर रहा है।

संपादित करें: मैं सिर्फ सवाल पुन: पढ़ने। मैंने सोचा था कि आप केवल पूछ रहे थे कि आपके दिए गए स्रोत में फ़ंक्शन कॉल क्या किया गया था। यदि आप 20 से अधिक वर्णों के इनपुट को पढ़ना नहीं चाहते हैं, तो आपको इसे संग्रहीत करने के लिए पहले स्मृति की आवश्यकता है। कुछ इस तरह करें:

bufferSize db 21 ; 20 char + RETURN 
inputLength db 0 ; number of read characters 
buffer  db 21 DUP(0) ; actual buffer 

फिर बफर भरें:

mov ax, cs 
mov ds, ax ; ensure cs == ds 
mov dx, offset bufferSize ; load our pointer to the beginning of the structure 
mov ah, 0Ah ; GetLine function 
int 21h 

कैसे को अपरकेस में पाठक के लिए छोड़ दिया जाता है परिवर्तित करने के लिए।

+0

फिर यह int21/AH = 1h जैसा व्यवहार करता है जो एक वर्ण में पढ़ता है। मुझे पता है कि उस बाधा ने चरित्र को AL में डाल दिया है। मैं कैसे पता लगाऊंगा कि पात्रों का बफर कहाँ होगा? –

+0

इसके अलावा, मुझे अभी एहसास हुआ। ऑफ़सेट तालिका का अर्थ है कि वास्तविक वर्ण डेटा दो बिट्स या बाइट्स (संभवतः बाइट्स) से शुरू होता है जहां से रिटर्न डेटा स्मृति में मौजूद होता है। विचार? –

+0

हां, वास्तविक इनपुट डीएस: डीएक्स + 2 से शुरू होता है। हालांकि, यह फ़ाइल उस इनपुट को अनदेखा करती है और निष्पादन को रोकने के लिए केवल उस फ़ंक्शन का उपयोग करती है। –

1

वर्णन कहते हैं कि तुम बाधा कॉल करने से पहले ds:dx में एक बफर के पते डाल दिया। अंतराल तब उस बफर को वर्णित वर्णों के साथ भर देगा।

इंटरप्ट को कॉल करने से पहले, बफर का पहला बाइट यह है कि बफर कितने पात्र हो सकता है, या आपके मामले में 20। मैं बफर (व्यवधान के लिए इनपुट पर) का दूसरा बाइट का वर्णन समझ में नहीं आता है, तो मैं इसे शून्य पर सेट होगा। बदले में, वह बाइट आपको बताएगा कि इनपुट के कितने अक्षर पढ़े गए थे और बफर में रखा गया था।

+0

तो मैं आपकी व्याख्या कैसे समझता हूं, पता जहां मैं बफर पा सकता हूं वह रजिस्ट्रार डीएस और डीएक्स में विभाजित है। –

+0

मूल सवाल, मुझे ऊपर के बारे में सोचने के लिए एक मिनट दें। –

+0

(फिक्सिंग टाइपो) का क्रमबद्ध करें। 'डीएस 'सेगमेंट रजिस्टर है; 'dx' ऑफ़सेट है। और आप बफर को "ढूंढ" नहीं पाते हैं; आप बाधा को आह्वान करने से पहले इसे इंगित करने के लिए 'ds' और' dx' सेट करके बफर _provide_ करें। (आपको बाधा के पहले दो बाइट्स को बाधा डालने से पहले भी सेट करना होगा। बफर - और इसके पहले दो बाइट्स - इंटरप्ट में इनपुट हैं।) - निमो 11 मिनट पहले – Nemo

0
.model small 
.stack 100h 
.data 
    N db ? 
    msg db 10,13,09,"Enter number of arrays---->$" 
.code 
.startup 
    mov ax,@data 
    mov ds,ax 
    call read_N;read N from console 




    mov ah,4ch 
    int 21h 

Read_N proc 
    ;get number of arrays from user 

    push ax 
    push dx 

readAgain: 

    mov ax,03h ;Clear screen 
    int 10h 

    mov dx,offset msg 
    mov ah,09h 
    int 21h 

    call ReadNumber 

    ;Inuput number must be in 2<=N<=10 bounery 
    cmp al,2 
    js readAgain ;input out of boundary read again 
    cmp al,10 
    jg readAgain 
    mov N,al 
    pop dx 
    pop ax 
    ret 
Read_N endp 

ReadNumber proc 
    ;read decimal number 0-99 using 
    ;character by character in askii and conver in to decimal 
    ;return result in al 
    xor ax,ax 
    xor bx,bx 
    xor dx,dx 

    mov ah,01h 
    int 21h 

    sub al,'0' ;conver in to decimal 
    mov bl,al 

    mov ah,01h 
    int 21h 
    cmp al,0dh ;Exit if enter pressed 
    jnz cont 
    mov al,bl 
    jmp exit 
    cont: 
    sub al,'0' ;conver in to decimal 
    mov dl,al 

    xor al,al 
    xor bh,bh 
    mov cx,bx 
    addnum:  
    add al,10 
loop addnum 

    add al,dl 
    exit: 
    ret 
ReadNumber endp 

end