MOV CX,80
MOV AL,'*'
MOV AH,0
MOV DI,0
MOV BX,0B800H
MOV ES,BX
REP STOSW
اريد ان اعرف ما هي ال 0B800H و ارجو التصحيح ليعمل البرنامج علي ملئ اول سطر بال '*' عن طريق DIRECT VEDIO RAM ACCES
MOV CX,80
MOV AL,'*'
MOV AH,0
MOV DI,0
MOV BX,0B800H
MOV ES,BX
REP STOSW
اريد ان اعرف ما هي ال 0B800H و ارجو التصحيح ليعمل البرنامج علي ملئ اول سطر بال '*' عن طريق DIRECT VEDIO RAM ACCES
السلام عليكم
مقطع البرنامج يعمل بشكل ولكن بسبب mov ah,0 عليك تسجيل مثلا mov ah,7
السبب ان الاولى تظهر لون اسود مكان النجمة اي كانك لم تطلب طباعة النجمة
الحل المقترح
هنا يتم تنظيف الشاشة ووضع المؤشر في بدية الشاشة في الجهة اليسرى العليا
mov ax,3
int 21h
الان يجب ان نبدأ في مكان الذاكرة المخصص للشاشة وهو المجال b800H..bc00H
في هذه المنطقة من الذاكرة يتم تسجيل الرمز المراد طباعته على الشاشة والمواصفات لهذا الرمز. في الخلية التي رقمها زوجي نحفظ الرمز وفي الخلية التي تليها وهي فرديا نحفظ صفات هذا الرمز.
نقصد بالمواصفات مثلا عادي، غامق, غماز , اسود ، فاتح وغيرها
mov bx,0b800h
mov es,bx
mov ah,7
mov al ,'*'
المسجل AL يحتوي على الرمز المطلوب والمسجل ah يحتوي على صفات هذا الرمز
هنا ah=7 اي ان مواصفات الرمز عادية لونه ابيض
الان المسجل cx=80 لان الشاشة بشكل عام تتكون من 80 عمودا و 25 صفا وهنالك امكانيات اخرى
هنا نتعامل مع 80 عمودا
الان نؤشر على الخلية صاحبة العنوان b800:0
mov di,0
الان نرسل فحوى المسجل ax الى الخلية التي يؤشر عليها di والخلية التي تليها فحوى المسجل al نضعه في الخلية b800:0 وفحوى المسجل ah نضعه في الخلية b800:1 ونقوم ايضا بالعملية di=di+2 حتى نضع في الدورة القادمة القيم في زوج الخلايا التالي b800:2..b800:3 ونعمل هذه العملية بقدر القيمة الموجودة في المسجل cx وهي هنا 80 بقدر عدد الاعمدة
rep stosw
ملاحظة: تأكد ان الراية DF=0 ومن الافضل ان نسجل الامر التالي
cld حتى نضمن ان هذه الراية تساوي صفرا وليست واحد
لانه اذا كان DF=1 عندها سوف يعمل di=di-2 بدلا من di=di+2 وهكذا فانه سوف يضع الرمز الاول مع صفاته في المنطقة الصحيحة والباقي سوف يسجلها في المناطق الغير صحيحة اي ان على الشاشة سوف يظهر رمز واحد فقط
الحل النهائي
cld
mov ax,3
int 21h
MOV CX,80
MOV AL,'*'
MOV AH,7
MOV DI,0
MOV BX,0B800H
MOV ES,BX
REP STOSW
ارجو ان اكون قد قدمت المساعدة المطلوبة
السلام عليكم
لقد وقع خطأ في الرد السابق
أنا اقصد
mov ax,3
int 10h
لتنظيف الشاشة وليس int 21h
وشكرا
هذا الموضوع مغلق.