2012-06-15 22 views
5

के साथ गलत क्या है, इसलिए मैं एमएस-डॉस के लिए सी ++ में एक गेम लिख रहा हूं और मैं गति के लिए कुछ इनलाइन असेंबली भी शामिल कर रहा हूं। कोड का यह विशेष ब्लॉक वीडियो मेमोरी (0 ए000 एच) में एक स्टार खींच जाएगा। मेरे कोड के साथ समस्या यह है कि यह केवल एक पिक्सेल खींचता है जो भी रंग डीएच पर सेट होता है। जहां तक ​​मुझे mov dx पता है, 00007h dh से 0 और dl को 7 सेट करने के बराबर है। क्या गलत है?मेरे असेंबली कोड

बराबर सी/सी ++ कोड (या कम से कम मेरा इरादा) प्रत्येक पंक्ति के बगल में टिप्पणी की जाती है। मेरा कंपाइलर टर्बो सी ++ 3.0 है। मैं केवल 8086/8088 निर्देशों का उपयोग करने की कोशिश कर रहा हूं।

यह भी मुझे पता है कि एमएस-डॉस कितना पुराना है मुझे एक नए कंपाइलर/ऑपरेटिंग सिस्टम के लिए कोड लिखने के लिए नहीं बताता है। डॉस के लिए कोड लिखना मेरा शौक है।

pixelOffset = x + (y << 6) + (y << 8); 

_asm { 
    mov ax, WORD PTR pixelOffset 
    mov di, ax 
    mov ax, 0A000h   ;pointer to the video memory 
    mov es, ax 
    mov dx, 00007h   ;indexed color 00 and 07 
    mov cx, 0000Fh   ;indexed color white 0F 
    add ax, 2    ;pixelOffset += 2; 
    mov es:[di], dh  ;videomem[pixelOffset] = BLACK; 
    add ax, 319   ;pixelOffset += 319; 
    mov es:[di], dh  ;videomem[pixelOffset] = BLACK; 
    add ax, 1    ;pixelOffset += 1; 
    mov es:[di], dl  ;videomem[pixelOffset] = LIGHT_GRAY; 
    add ax, 1    ;pixelOffset += 1; 
    mov es:[di], dh  ;videomem[pixelOffset] = BLACK; 
    add ax, 317   ;pixelOffset += 317; 
    mov es:[di], dh  ;videomem[pixelOffset] = BLACK; 
    add ax, 1    ;pixelOffset += 1; 
    mov es:[di], dl  ;videomem[pixelOffset] = LIGHT_GRAY; 
    add ax, 1    ;pixelOffset += 1; 
    mov es:[di], cx  ;videomem[pixelOffset] = WHITE; 
    add ax, 1    ;pixelOffset += 1; 
    mov es:[di], dl  ;videomem[pixelOffset] = LIGHT_GRAY; 
    add ax, 1    ;pixelOffset += 1; 
    mov es:[di], dh  ;videomem[pixelOffset] = BLACK; 
    add ax, 317   ;pixelOffset += 317; 
    mov es:[di], dh  ;videomem[pixelOffset] = BLACK; 
    add ax, 1    ;pixelOffset += 1; 
    mov es:[di], dl  ;videomem[pixelOffset] = LIGHT_GRAY; 
    add ax, 1    ;pixelOffset += 1; 
    mov es:[di], dh  ;videomem[pixelOffset] = BLACK; 
    add ax, 319   ;pixelOffset += 319; 
    mov es:[di], dh  ;videomem[pixelOffset] = BLACK; 
} 
+4

* लिखने * एक ** डॉस ** गेम का उपयोग करने का सुझाव दूंगा? यह बहुत बढ़िया है। एमएस-डॉस गेम नॉस्टल्जीया के लिए –

+0

+1! –

+0

@ जॉन डिबलिंग: हाँ और मैं इसे स्रोत फोर्ज पर रखूंगा जब मैं – PgrAm

उत्तर

5

मुझे लगता है कि आप कुल्हाड़ी को अद्यतन करने

add ax,1 
mov di,ax ;don't forget this line 
mov es:[di],dl 
+0

आपको बहुत धन्यवाद, यह अब काम करता है। मैं विधानसभा में वास्तव में खराब हूं – PgrAm

+1

मैं आमतौर पर केवल 32 बिट में प्रोग्रामिंग कर रहा हूं, लेकिन मुझे लगता है कि 'inc' निर्देश 16-बिट में मौजूद है। क्या आप किसी भी तरह कुल्हाड़ी पर वापस जाने के बिना 'inc di' का उपयोग नहीं कर सकते? मैं वास्तव में नहीं देखता कि आप हर समय सीधे 'di' क्यों संपादित नहीं कर रहे हैं। – Nyerguds

3

यह आप की तरह नहीं दिखता कभी incrementing रहे हैं "डि", यह करता है? शायद आप "movsb" मतलब था?

0

ली अनुदेश भी 16 बिट में मौजूद बाद di अद्यतन करने के लिए भूल गए हैं:

lea di,[di+1] ; substitute for "inc di" and/or "add di,1" , if we do not need a flag 

डिर्क

0

आधार बढ़ाने के लिए कोई ज़रूरत नहीं है ax का उपयोग करके - पहले; वहाँ भी है विस्थापन के साथ को संबोधित मोड केवल (यह भी पूर्ण पते के रूप में माना जाता)

mov es:[1001], dh 
mov es:[1002], dl 
mov es:[1535], cl 

कि और अधिक उपयोगी बनाने के लिए - आप उपयोग कर सकते हैं कि ऑफसेट के साथ है, जो कर सकते थे जैसे। अपने स्टार के केंद्र के रूप में काम करते हैं:

mov es:[di - WIDTH], ... ;; pixel/character above the current cursor 
mov es:[di + WIDTH], ... ;; pixel/char below 
mov es:[di + 1], ...  ;; pixel right to the origin etc. 

खंड ओवरराइड उपसर्ग es: महंगा है का उपयोग करना। इसके बजाय मैं

mov ax, 0a000h 
push ds 
mov ds, ax 
// 
mov [di + offset], cl  ;; this pays off when writing several pixels 
// 
pop ds    ;; restore DS after you have copied your stuff 
संबंधित मुद्दे