2016-08-19 7 views
6

के रूप में काम नहीं कर रहा है मैं 8086 असेंबली में शुरुआत कर रहा हूं। मैं एक पुरानी 90 वीं किताब की किताब से सीख रहा हूं जो मुझे एक थ्रिफ्ट स्टोर में मिला था। मैंने सोचा कि यह 1992 के कार्यक्रम की तरह मजेदार हो सकता है।'एलईएस' 8086 निर्देश

वैसे भी मुझे पुस्तक के साथ किया गया है और अब मैंने अपने पुराने Win95 लैपटॉप पर कमांड प्रॉम्प्ट पर कुछ प्रोग्राम लिखे हैं।

मुझे इस समस्या के साथ समस्याएं नहीं हैं जो 'लेस' निर्देश का उपयोग करने के लिए स्विच करने के बाद इरादे से काम कर रही हैं। हालांकि यह काम करता था जब मैंने ईएस और डी रजिस्टरों को मैन्युअल रूप से उपयुक्त पते के साथ स्थापित किया था।

;************************************ 
; STACK SEGMENT 
;************************************ 

TheStack SEGMENT STACK  ;STACK specifies the stack segment 

    db 64 dup (THESTACK) ;reserves 512 bytes for the stack 

TheStack ENDS 

;************************************ 
; END STACK SEGMENT 
;************************************ 

;************************************ 
; DATA SEGMENT 
;************************************ 

Data SEGMENT 

BufAddr DD 0b8000000h 

Data ENDS 

;************************************ 
; END DATA SEGMENT 
;************************************ 

;************************************ 
; CODE SEGMENT 
;************************************ 

Code SEGMENT 

assume CS:Code,DS:Data 

MAIN PROC 

Start: ;execution begins 

    ;setup input for stosw 
    les di, DWORD PTR BufAddr 
    mov cx,0f4fh ;cx contains the number of times stosw will loop 
    cld 

    ;draw smileys 
    mov ax,0f01h ;0f is the text attribute for white on black, 01 is the hex code for a smiley 
    rep stosw ;write it all to the buffer 

    ;EXIT 
    mov AH,4CH ;Setup the terminate dos process service 
    mov AL,0 ;ERRORLEVEL takes 0 
    int 21H ;return to dos 

MAIN ENDP 

Code ENDS 

;************************************ 
; END CODE SEGMENT 
;************************************ 

END Start ;Start is the Main procedure 

ठीक है, तो इस कार्यक्रम कमांड प्रॉम्प्ट विंडो में स्माइली ASCII वर्ण का एक समूह आकर्षित करने के लिए माना जाता है, लेकिन यह काम नहीं कर रहा।

यह काम करता है जब मैं कोड की निम्न पंक्तियों के साथ 'एलईएस' रेखा को प्रतिस्थापित करता हूं।

mov bx,0b800h 
mov es,bx 
xor di,di 

जब BufAddr चर के साथ प्रयोग किया कोड के पिछले तीन लाइनों के रूप में इसी कार्य को पूरा नहीं 'लेस' अनुदेश करता है?

जब मैं संकलित एक्सई डीबग करता हूं (मैं कंपाइलर के रूप में एमएएसएम 6.11 का उपयोग कर रहा हूं) मुझे पता है कि ईएस और डी रजिस्टरों को सही मूल्यों से लोड नहीं किया जा रहा है।

+0

सही मूल्यों के बजाय es और di में क्या मूल्य लोड किए जा रहे हैं? – fuz

+6

अपने कोड की शुरुआत में 'mov ax, SEG डेटा' और' mov ds, ax' कथन जोड़ने का प्रयास करें। –

+0

रॉस ने मुझे मार दिया। यद्यपि आपने अपनी असेंबली फ़ाइल में सीएस: कोड, डीएस: डेटा 'मान लिया है, लेकिन यह वास्तव में इन सेगमेंट रजिस्टरों को सेट नहीं करता है। यह संकेत देता है कि उन्हें क्या पकड़ना है। चूंकि असेंबलर डेटा सेगमेंट सेट करने के लिए कोड उत्पन्न नहीं करता है और इसे सेगमेंट 'डेटा' पर इंगित करता है, इसलिए आपको इसे स्वयं करने के लिए मजबूर किया जाता है। रॉस का सुझाव है कि 'mov ax, SEG डेटा' 'mov ds, ax' को काम करना चाहिए। आपके कोड का काम नहीं करने का कारण यह है कि आपके प्रोग्राम की शुरुआत में _DS_ को ठीक से शुरू किए बिना निर्देश 'लेस डी, डीडब्ल्यूओआर पीटीआर बुफएडर' गलत स्मृति स्थान से 'BuffAddr' लोड करेगा। –

उत्तर

7

रैम से सेगमेंट और ऑफ़सेट लोड करने से पहले, आपको DS रजिस्टर को वास्तव में अपने डेटा सेगमेंट पर इंगित करने के लिए सेट करना होगा। डिफ़ॉल्ट रूप से, DS आपके पीएसपी को इंगित करता है, जो वह जगह नहीं है जिसे आप इंगित करना चाहते हैं।

+0

होना चाहिए "यह काम नहीं किया" मतलब क्या है? – fuz

+0

मैं चाहता हूं कि ईएस 0b800h मान रखे, और डी को पकड़ने के लिए 0. बी 800: 0000 डॉस रीफ्रेश बफर का पता है। –

+0

@Proughgrammor सही मूल्यों के बजाय ES और DI में क्या मान लोड किए जाते हैं? आप उल्लेख करते हैं कि आपने गलत मूल्यों को लोड किया है, ये क्या थे? – fuz

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