هل يمر على قيمة c ويقوم بمقارنتها بشكل صحيح؟
جربه تحت debugger يا حاتم
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
هل يمر على قيمة c ويقوم بمقارنتها بشكل صحيح؟
جربه تحت debugger يا حاتم
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
تتبع باستخدام الأمر p وليس t
نحتاج إلى منقح أفضل من debug.. اتصور vkdebug ممكن يفيد أكثر في هذا الموضوع.
قم بوضع نسخة أخرى من البرنامج لكن استبدل تعليمة انهاء البرنامج بالأمر jmp $ التي تعني قفز في المكان كي لا يتم إغلاق نافذة الدوس بعد الانتهاء من تنفيذه.
أريد أن أرى كيف تتم الطباعة دون ان يتم اغلاق النافذة.
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
لقد إستخدمت p بدلا T ولكن دخلت في الحلقة أي بقيت تعيد نفسها وتعبت من الضغط على P وENTER :blush:
هذا الكود بعد التعديل الذي طلبته
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,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 @@ cmp dh,59 je critical mov byte ptr,dh inc byte ptr jmp @@ critical: mov byte ptr,0 @@: cmp s,dh je lo0p mov byte ptr,0 jmp repeat exit: jmp $ main endp code ends end main
وفي المرفقات الملف التفيذي
اقتباساتصور vkdebug ممكن يفيد أكثر في هذا الموضوع
أردت تحميله ولكن وجده خاص بMASM وأنا أستخدم TASM
أظن أن تعليمة الوقت هذه لا تصلح ربما هناك تعليمة أخرى؟
هذه
cmp s,dh je lo0p
اجعل المقارنة jge
الطريقة الوحيدة ليخرج البرنامج وينتهي هي في أن يكون هناك مشكلة في المقارنة بقيمة c
تأكد من هذين الأمرين.
مشكلة تطبيقات 16بت هي في صعوبة التنقيح.
ابحث عن مكتبة irvine16 ربما يوجد فيها شئ عن موضوع التأخير كما ذكر أحد الأخوة في ردوده.
الملفات irvine16.inc و irvine16.lib حسبما أذكر والله أعلم.
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
اقتباساجعل المقارنة jge
لقد غيرتها وعند وصول الثواني إلى 59 يطبع النص في العمود 10 مباشرة ويخرج من البرنامج
اقتباسالطريقة الوحيدة ليخرج البرنامج وينتهي هي في أن يكون هناك مشكلة في المقارنة بقيمة c
لا توجد مشكلة عند المقارنة بـ C أي رقم العمود. وللتأكد أكثر لقد قمت بحذف الوقت وإستعمال KEYBOARD بدلا منه هكذا
اقتباسdata segmentmsg 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:
;-----------------------------------------
xor ax,ax ;مكان الوقت ويعمل يدوي عن طريق لوحة المفاتيح
int 16h ; وهذا للتحكم بسرعة النص يدويا
;-----------------------------------------
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
وللتأكد لقد وضعت الملف التنفيذي بإسم MSG1 وأريد أن أنوه لن يظهر النص إلا إذا بدأنا الضغط على أي زر من لوحة المفاتيح وستلاحظ أن النص بدأ بالحركة حتى يصل إلى العمود رقم 10.
------------------------------
بعد التأكد من المقارنة بالعمود وظهور النص بشكل جيد نتخلى على التحكم بالنص يدويا ونقوم بإضافة الوقت مع حذف شرط حالة الوصول إلى 59 ثانية فيكون الكود هكذا
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 ;تم حذف عملية المقارنة إذا كان عدد الثواني =59 أم لا 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 ;لون الخلفية والنص 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;لن يخرج من الحلقة حتى يصل النص إلى العمود 10 jg repeat mov ah,4ch int 21h main endp code ends end main
وللتأكد لقد وضعت الملف التنفيذي بإسم MSG2 وسيعمل جيدا مادام عدد الثواني لا يساوي 59 أما إذا كان = 59 فمن المنطقي سيتوقف عن العمل لأن هذا الشرط محذوف ولقد أشرت إلى ذلك سابقا وهذا للتأكد بأنه مادام عدد الثواني أقل من 59 فإن البرنامج يعمل بشكل جيد.
-----------------
والآن نكتب الكود كاملا مع شرط إذا كان dh=59 وسيكون الكود هكذا
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,59 je overflow add dh,1 mov byte ptr,dh jmp time overflow: mov byte ptr,0 ;لقد جربت 0 و 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;لن يخرج من الحلقة حتى يصل النص إلى العمود 10 jg repeat mov ah,4ch int 21h main endp code ends end main
والشيئ الغريب هنا عند الوصول إلى الثانية 59 يخرج من البرنامج ومن المفروض أنه لا يخرج حتى يصل النص إلى العمود رقم 10 !!لتجربة البرنامج هو تحت إسم MSG3 ولا تنسى أن تنظر إلى الثواني للتأكد أكثر
اقتباسمشكلة تطبيقات 16بت هي في صعوبة التنقيح
في هذا البرنامج 100/100 صحيح
اقتباسابحث عن مكتبة irvine16 ربما يوجد فيها شئ عن موضوع التأخير كما ذكر أحد الأخوة في ردوده.
سأحاول إن شاء الله
وجزاك الله خيرا أخي Xacker على المساعدة
السلام عليكم
وأخيرا لقد حصلت على الحل وبطريقة مختصرة وهاهو الكود
mov ah,2ch int 21h mov byte ptr,dh time: mov ah,2ch int 21h cmp dh,s JE time
أردت تعلم الأسمبلي 16 بت لأني أرى أنها الطريقة الأفضل للتتعرف أكثر على كيف تعمل البرامج خوارزميا دون اللجوء إلى أوامر جاهزة أليس هذا أفضل .
اقتباسلا لم اعني الرسم عن طريق تحرير الذاكرة بل الرسم عموما في بيئة 16bit ,, لا استخدمها الا في اسياء بسيطة مدمجة مع 32bit خاصة بالنظام .
أخي GamingMasteR هل من الممكن أن تعطيني مقدمة عن الرسم في بيئة 16bit
اوخ .. صحيح :D
مبروك
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
اقتباسأخي GamingMasteR هل من الممكن أن تعطيني مقدمة عن الرسم في بيئة 16bit
ذكرت أني لم استخدم 16bit asm في الرسم ابداً !!
mov eax, dword ptr ds:[0xffdf0308]
jmp dword ptr [eax+0xfc]
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…