الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ارجو التصحيح

مغلق
بدأه محمد الطنه في 22 مايو 2004 · 2 رد · 613 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

MOV CX,80

MOV AL,'*'

MOV AH,0

MOV DI,0

MOV BX,0B800H

MOV ES,BX

REP STOSW

اريد ان اعرف ما هي ال 0B800H و ارجو التصحيح ليعمل البرنامج علي ملئ اول سطر بال '*' عن طريق DIRECT VEDIO RAM ACCES

365159135_b0fcd2be76_o.jpg

365163463_a76592857a.jpg
#2

السلام عليكم

مقطع البرنامج يعمل بشكل ولكن بسبب 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

ارجو ان اكون قد قدمت المساعدة المطلوبة

#3

السلام عليكم

لقد وقع خطأ في الرد السابق

أنا اقصد

mov ax,3

int 10h

لتنظيف الشاشة وليس int 21h

وشكرا

هذا الموضوع مغلق.

مواضيع مشابهة