के रूप में काम नहीं कर रहा है मैं 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 का उपयोग कर रहा हूं) मुझे पता है कि ईएस और डी रजिस्टरों को सही मूल्यों से लोड नहीं किया जा रहा है।
सही मूल्यों के बजाय es और di में क्या मूल्य लोड किए जा रहे हैं? – fuz
अपने कोड की शुरुआत में 'mov ax, SEG डेटा' और' mov ds, ax' कथन जोड़ने का प्रयास करें। –
रॉस ने मुझे मार दिया। यद्यपि आपने अपनी असेंबली फ़ाइल में सीएस: कोड, डीएस: डेटा 'मान लिया है, लेकिन यह वास्तव में इन सेगमेंट रजिस्टरों को सेट नहीं करता है। यह संकेत देता है कि उन्हें क्या पकड़ना है। चूंकि असेंबलर डेटा सेगमेंट सेट करने के लिए कोड उत्पन्न नहीं करता है और इसे सेगमेंट 'डेटा' पर इंगित करता है, इसलिए आपको इसे स्वयं करने के लिए मजबूर किया जाता है। रॉस का सुझाव है कि 'mov ax, SEG डेटा' 'mov ds, ax' को काम करना चाहिए। आपके कोड का काम नहीं करने का कारण यह है कि आपके प्रोग्राम की शुरुआत में _DS_ को ठीक से शुरू किए बिना निर्देश 'लेस डी, डीडब्ल्यूओआर पीटीआर बुफएडर' गलत स्मृति स्थान से 'BuffAddr' लोड करेगा। –