السلام عليكم
أريد إظهار جملة بالأسمبلي 16bit ولكن تكون عملية الإظهار بعد 5 ثواني مثلا
ماهو الأمر الذي يظهر الرسالة بعد 5 ثوان أظنه في لغة باسكال wait
السلام عليكم
أريد إظهار جملة بالأسمبلي 16bit ولكن تكون عملية الإظهار بعد 5 ثواني مثلا
ماهو الأمر الذي يظهر الرسالة بعد 5 ثوان أظنه في لغة باسكال wait
قم بعمل loop يتحقق من مرور 5 ثوان , استخدم خدمات الدوس لمعرفة الوقت :
http://www.uv.tietgen.dk/staff/mlha/PC/Prog/asm/int/21/index.htm#2C
mov eax, dword ptr ds:[0xffdf0308]
jmp dword ptr [eax+0xfc]
بارك الله فيك أخي GamingMasteR لكن لم أفهم كيف تكون التعليمة أرجو التوضيح بارك الله فيك
وكذلك عندي سؤال كيف يمكن إضافة قيمة إلى متغير أي variable كما موضح في المثال
s:=d+5
احصل على الوقت الحالي بمقاطعة 2Ch من 21h وما يهمك فيها هو قيمة DH التي تحدد الثواني الحالية.
اعتبر الرقم الحالي هو s .. لنفرض كانت الثانية 23
عليك ان تدخل في loop تستخدم نفس المقاطعة للحصول على الوقت إلى أن تصل إلى s+5 يعني الثانية 28 وتخرج من الحلقة عندما تصبح s=29
حينها تظهر الرسالة.
انتبه عندما تكون الثواني 55+
بالنسبة للسؤال الثاني, تستطيع وضع قيمة d في أحد المسجلات، الإضافة عليه، ثم حفظه في s
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
السلام عليكم
جزاكم الله خيرا على المساعدة ولكن أخوكم مبتدئ
هل تعني يكون هكذا
mov cx,5;عدد الثواني time: mov ah,2ch int 21 loop time
أما السؤال الثاني نفرض أن
d db 10 mov bl,d add bl,5 mov d,bl;<----هنا الخطأ ولكن لم أفهم كيف يكون الحل الصحيح
لا طبعا لا أقصد هذا
أخي أنظر استخدام المقاطعة, عند تنفيذها فهي تجلب لك وقت الحاسوب نفسه. كأنك تقرأ كم الوقت الآن في جهازك.
لنفرض وقت التنفيذ كانت الساعة 12:54:23 بالشكل hh:mm:ss
يعني قيمة DH ستكون 23 وهي قيمة الثواني.
انت تريد تأخير إظهار الرسالة مدة 5 ثوان إذن يجب أن تنتظر إلى أن تصبح الساعة 12:54:29 حينها يتم عرض الرسالة عدا هذا لا.
التأخير سيكون من خلال حلقة loop.
لنضع تصور للكود الآن:
بالنسبة للسؤال الثاني هل تستخدم نفس المثال الذي أدرجته في الجمع أم بقيم أخرى؟
انتبه إلى ألا تقوم بجمع قيم ناتج جمعها أكبر من 255 بسبب طول المتغير المحجوز.
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
جزاك الله خيرا أخي Xacker على المساعدة
هذا بالنسبة إلى ما فهمته
s db 0 mov ah,2ch int 21h mov s byte ptr,dh;<------ بقي الخطأ هنا add dh,5 mov s byte ptr,dh;<------ بقي الخطأ هنا time: mov ah,2ch int 21h cmp dh,s jl time
s [color= #7f00ff;]db [color= #7f7f7f;]0 [color= #ff007f;]mov [color= #7f7f40;]ah[color= #0000ff;],[color= #ff0000;]2ch [color= #ff007f;]int [color= #ff0000;]21h [color= #ff007f;]add [color= #7f7f40;]dh[color= #0000ff;],[color= #7f7f7f;]5 [color= #ff007f;]mov [color= #aa007f;]byte [color= #7f00ff;]ptr[color= #0000a0; font-weight: bold;][s[color= #0000a0; font-weight: bold;]][color= #0000ff;],[color= #7f7f40;]dh time[color= #0000ff;]: [color= #ff007f;]mov [color= #7f7f40;]ah[color= #0000ff;],[color= #ff0000;]2ch [color= #ff007f;]int [color= #ff0000;]21h [color= #ff007f;]cmp [color= #7f7f40;]dh[color= #0000ff;],s [color= #ff007f;]jl time
Xacker كتب:انتبه عندما تكون الثواني 55+
تم تعديل هذه المشاركة بواسطة GamingMasteR في 13 أغسطس 2008 في 14:38
mov eax, dword ptr ds:[0xffdf0308]
jmp dword ptr [eax+0xfc]
السلام عليكم
جزاكم الله خيرا الكود يعمل جيدا ولكن هنا مشكلة أظنكم تفطنتم لها وهي أحيانا ندخل في حلقة غير منتهية
وذلك عندما يكون الوقت الحالي أي عدد الثواني في dh على سبيل المثال = 60 وعند إضافة 5 يصبح المتغير s= 65
وهنا تكمن الإشكالية المقارنة بين dh و s تكون دائما أقل وهذا يعني عدم الخروج من الحلقة فمالحل لهذه المشكلة؟
pseudocode:
if dh > 55 s = dh + 5 - 55 else s = dh + 5
mov eax, dword ptr ds:[0xffdf0308]
jmp dword ptr [eax+0xfc]
السلام عليكم
آسف عن التأخر بارك الله فيك أخي GamingMasteR
لقد سألت على هذه المقاطعة وذلك لبرمجة شاشة توقف :lol:
ولكن لا أدري أين الخطأ هذا الكود
data segment msg db 'Bonjour$' s db 0 D db 78 c db 70 data ends code segment main proc assume ds:data,cs:code mov ax,data mov ds,ax xx: mov ah,2ch int 21h cmp dh,55 jl xxx add dh,1 sub dh,59 mov byte ptr,dh jmp time xxx: add dh,1 mov byte ptr,dh time: mov ah,2ch int 21h cmp dh,s jl time mov ah,06h mov al,04h mov bh,1ch mov ch,00h ; upper row mov cl,c ; left column mov dh,14h ; lower row mov dl,d ; right column int 10h mov bh,0 ; nombre de pages mov dh,13 ; nombre de ligne mov dl,c ; numéro de la colonne mov ah,02 int 10h lea dx,msg mov ah,9 int 21h dec byte ptr[c] dec byte ptr[d] cmp byte ptr[c],10 jg xx mov ah,4ch int 21h main endp code ends end main
وهذا الملف التنفيذي للنسخة التجريبية version 1.0 beta :lol:
ما المشكلة ؟؟
غير :
sub dh,59
الى
sub dh,55
mov eax, dword ptr ds:[0xffdf0308]
jmp dword ptr [eax+0xfc]
جزاك الله خيرا بالفعل لقد أنقصت في عدد الثواني لتسريع الرسالة في الدوران ولم أنتبه لتغيير قيمة المقارنة ولكن المشكلة التي واجهتني هي عند ظهور النص كل حركة للنص تزيد سطر في الأعلى ! مع العلم أني حددت السطر 13 جرب البرنامج وستلاحظ ذلك . هل هناك خطأ؟
أسف لم الاحظ انك انقصت عدد الثواني !
بالنسبة للرسم فلم اجرب من قبل الرسم من خلال المقاطعات ,, ربما يفيدك شخص اخر .
mov eax, dword ptr ds:[0xffdf0308]
jmp dword ptr [eax+0xfc]
رأيته فقط لا استطيع التعامل مع 16بت حالياً
اتصور عليك ان تقوم بمسح القيمة السابقة على الشاشة قبل رسم الجديدة
لا تنسى ان هذا لن يتم لوحده
حاول وضع البرنامج تحت debugger
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
السلام عليكم.....
أنا لا أمتلك الخبرة في هذه اللغة ولكن اتوقع استخدام الأمر Delay يفي بالغرف؟
Delay موجود في حزمة irvine16 ؟
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
Xacker كتب:اتصور عليك ان تقوم بمسح القيمة السابقة على الشاشة قبل رسم الجديدةلا تنسى ان هذا لن يتم لوحده
السلام عليكم
بارك الله في على ردك أخي Xacker
لقد قمت بالفعل بالتلاعب بالألوان للخلفية حيث لا يظهر الحرف r عند تحرك النص وتم ذلك بنجاح ولكنه أدخلني في مشكل ألا وهو زيادة سطر للأعلى هذا الذي لم أفهمه. قد تلاحظ ذلك عند تجربة الملف التفيذي.
Xacker كتب:حاول وضع البرنامج تحت debugger
هل تعني كتابته وتجريبه في الـ debuger سأحاول ذلك
Mont-x كتب:السلام عليكم.....أنا لا أمتلك الخبرة في هذه اللغة ولكن اتوقع استخدام الأمر Delay يفي بالغرف؟
ماذا تقصد بـ Delay؟
GamingMasteR كتب:بالنسبة للرسم فلم اجرب من قبل الرسم من خلال المقاطعات ,, ربما يفيدك شخص اخر .
هل تعني ما قاله لي الأخ عبد العزيز وذلك حسب نظام العرض حيث تكون الحروف بموضع معين بالذاكرة يمكن التعامل معها مباشرة دون المرور بالمقاطعات
لا لم اعني الرسم عن طريق تحرير الذاكرة بل الرسم عموما في بيئة 16bit ,, لا استخدمها الا في اسياء بسيطة مدمجة مع 32bit خاصة بالنظام .
mov eax, dword ptr ds:[0xffdf0308]
jmp dword ptr [eax+0xfc]
GamingMasteR كتب:لا لم اعني الرسم عن طريق تحرير الذاكرة بل الرسم عموما في بيئة 16bit ,, لا استخدمها الا في اسياء بسيطة مدمجة مع 32bit خاصة بالنظام .
هذا يعني هناك عدة طرق للرسم في بيئة 16bit وأظنه هناك الكثير من الخبايا التي لم أعرفها بعد حاليا مازلت أتصارع مع برنامجي scroll text وبعد الإنتهاء منه إن شاء الله أريدكم أن تعطونا مدخل أو مقدمة حول هذه الطريقة وجزاكم الله خيرا
تم تعديل هذه المشاركة بواسطة hatem في 22 أغسطس 2008 في 14:05
السلام عليكم
الحمد لله لقد تمكنت من النص وهو يعمل بشكل جيد ولكن بقي خطأ في الوقت إذا كان dh=60 هنا يتوقف النص عن الحركة مع العلم ني أجريت جميع المحاولات هل هناك من يجد لي مخرج من هذه الدوامة
data segment msg db 'Bonjour$' s db 0 c db 70 data ends code segment main proc assume ds:data,cs:code mov ax,data mov ds,ax repeat: mov ah,2ch int 21h cmp dh,60 je x add dh,1 mov byte ptr,dh jmp time x: mov byte ptr,1 time: mov ah,2ch int 21h cmp dh,s jl time mov ah,06h mov al,01h mov bh,0eh ;لون الخلفية والنص mov ch,13 ; السطر العلوي mov cl,10 ; العمود الأيمن mov dh,13 ; السطر السفلي mov dl,c ; العمود الأيسر add dl,7 int 10h mov bh,0 ; رقم الصفحة mov dh,13 ; رقم السطر الذي ستظهر فيه الرسالة mov dl,c ; رقم العمود الذي ستظهر فيه الرسالة mov ah,02 int 10h lea dx,msg mov ah,9 int 21h dec byte ptr[c] cmp byte ptr[c],10 jg repeat mov ah,4ch int 21h main endp code ends end main
أنظر إلى الثواني من خلال الساعة وعند وصلها 00 نفذ البرنامج سيعمل جيدا وعند وصول الثواني إلى 60 يتوقف النص هنا المشكلة!!
الطريقة الوحيدة لكي يتوقف النص عن الحركة هي في أن تعلق هنا
repeat: mov ah,2ch int 21h cmp dh,60 je x add dh,1 mov byte ptr,dh jmp time x: mov byte ptr,1 time: mov ah,2ch int 21h cmp dh,s jl time
ولن تعلق في هذا الجزء إلا لو كانت قيمة DH دوماً أصغر من s
أتصور من خلال القراءة وليس التنقيح أنه يجب عليك أن تقوم بتصفير قيمة s تماماً في نهاية كل كتابة للجملة على الشاشة وأقصد بعد هذا
dec byte ptr[c] cmp byte ptr[c],10
أمر آخر
لماذا تقوم بالمقارنة مع 60 ؟
هل يمكن بحال من الأحوال أن تكون قيمة DH = 60 لأنها دقيقة ومن المفترض أن يتم تصفير الثواني بعد قيمة 59 تماماً وزيادة الدقائق.
أمر آخر، من المفيد استخدام التعليقات خصوصاً في شفرات 16بت
تم تعديل هذه المشاركة بواسطة Xacker في 25 أغسطس 2008 في 13:29
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
جزاك الله خيرا أخي Xacker على المساعدة
اقتباسلماذا تقوم بالمقارنة مع 60 ؟
بالفعل الثواني تصل إلى 59 فقط لم أنتبه إلى ذلك
اقتباسأمر آخر، من المفيد استخدام التعليقات خصوصاً في شفرات 16بت
سأحاول في المرات القادمة إن شاء الله وضع التعليقات
لقد فعلت كل ما نبهتني إليه ولكن أتعلم المشكل أصبح الآن هو الخروج من الحلقة قبل أن تكتمل وذلك عند وصول الثواني 59 وكان من المفرض عدم الخروج من الحلقة إلا إذا وصل النص المتحرك إلى العمود 10 ولقد جربت الكود بدون وقت والنص يتحرك من اليمين إلى اليسار حتى يصل إلى العمود 10 ينتهي البرنامج بشكل جيد.
أضفت الوقت وجربت حذفت شرط وصول الثواني إلى 60 هذا الكود الحذوف
cmp dh,59 jl x mov byte ptr,0 jmp time x:
وإنتظرت وصول الثواني إلى 00 وقمت بتنفيذ النص عمل بشكل جيد وبوصول الثواني إلى الشرط المحذوف أي 60 ثانية يتوقف النص ويبقى البرنامج معلق .
وهنا يتضح أن الخطأ من الكود الذي في الأعلى مع العلم أني أراه منطقيا صحيح .أظن أنه لا يوجد حل !!
هذا كود البرنامج كامل على حسب ملاحظاتك Xacker
data segment msg db 'Bonjour$' s db 0 c db 70 data ends code segment main proc assume ds:data,cs:code mov ax,data mov ds,ax ;--------------------- ;هنا تحديد الوقت لتحديد سرعة الرسالة ;-------------------- repeat: mov byte ptr,0;أضفتها ولكن أرى أن لا فائدة منها mov ah,2ch int 21h cmp dh,59 jl x ;---------------------------------------------------------------------------------------------- mov byte ptr,0 ;هذا الجزء هو الذي به الخطأ ولقد حاولت بالشتى الطرق ولكن دون فائدة jmp time ;----------------------------------------------------------------------------------------------- x: add dh,1 mov byte ptr,dh time: mov ah,2ch int 21h cmp dh,s jl time ;--------------------- ; خاص بلون الخلفية ولون النص ;-------------------- mov ah,06h mov al,01h mov bh,0eh ; (0)ولون الخلفية أسود (e0) لون النص أصفر mov ch,13 ; السطر العلوي mov cl,10 ; العمود الأيسر mov dh,13 ; السطر السفلي mov dl,c; العمود الأيمن وقد تم وضع القيمة الإبتدائية 70 add dl,7; r أضفت سبعة وذلك لمس الحرف الأخير من الرسالة السبقة أي حرف int 10h ;--------------------- ;خاص بإحداثيات طباعة الرسالة على الشاشة ;-------------------- mov bh,0; رقم الصفحة mov dh,13; رقم السطر الذي ستظهر فيه الرسالة mov dl,c; رقم العمود الذي ستظهر فيه الرسالة mov ah,02 int 10h lea dx,msg mov ah,9 int 21h ;--------------------- ;هنا للمقارنة إذا وصلت الرسالة إلى العمود 10 ينتهي البرنامج ;-------------------- dec byte ptr[c];الإنقاص من رقم العمود الأيمن cmp byte ptr[c],10; ينتهي البرنامج وإلا الرجوع إلى الوقت وإظهار الرسالة DH=10 إذا وصلت الرسالة المتحركة إلى العمود 10 أي jg repeat mov ah,4ch int 21h main endp code ends end main
وفي الرفقات الملف التنفيذي للكود الذي في الأعلى والذي من الفروض لا يخرج من الحلقة حتى يتحقق الشرط dh=10 أي وصول الرسالة إلى العمود العاشر ولكن يخرج بوصول الثواني 59 ولكم أن تجربوه
تم تعديل هذه المشاركة بواسطة hatem في 25 أغسطس 2008 في 17:29
كنت أفكر بكتابة شئ مثل هذا
لم استطع تجريبه، masm غير موجود لدي الآن
repeat: mov ah,06h mov al,01h mov bh,0eh ; (0)ولون الخلفية أسود (e0) لون النص أصفر mov ch,13 ; السطر العلوي mov cl,10 ; العمود الأيسر mov dh,13 ; السطر السفلي mov dl,c; العمود الأيمن وقد تم وضع القيمة الإبتدائية 70 add dl,7; r أضفت سبعة وذلك لمس الحرف الأخير من الرسالة السبقة أي حرف int 10h mov bh,0; رقم الصفحة mov dh,13; رقم السطر الذي ستظهر فيه الرسالة mov dl,c; رقم العمود الذي ستظهر فيه الرسالة mov ah,02 int 10h mov dx,offset msg mov ah,9 int 21h dec byte ptr[c];الإنقاص من رقم العمود الأيمن cmp byte ptr[c],10 jle exit lo0p: mov ah,2ch int 21h cmp s,0 jne @F cmp dh,59 je critical mov s,dh inc s jmp @F critical: mov s,0 @@: cmp s,dh je lo0p mov s,0 jmp repeat exit: mov ah,4ch int 21h
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
يقوم بإظهار الرسالة في العمود 10 ويخرج من البرنامج وهذا دليل على تنفيذ البرنامج من دون وقت ولذالك لا تتم رؤية التنفيذ.
المشكل مازال موجود!!