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

أريد تعليمة تحديد الوقت؟

بدأه hatem في 12 أغسطس 2008 · 33 رد · 6,283 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#26

هل يمر على قيمة c ويقوم بمقارنتها بشكل صحيح؟

جربه تحت debugger يا حاتم

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#27

السلام عليكم

مازلت مبتدئ و لقد حاولت إتباعه تحت debuger ولكن أدخليني في تعليمات لم أفهماها المهم لقد أرفقت لك ملف وورد به تتبعي لجزء من البرنامج وكذلك الملف التنفيذي يمكن تتبعه

debug.rar

#28

تتبع باستخدام الأمر 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

#29

لقد إستخدمت 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

أظن أن تعليمة الوقت هذه لا تصلح ربما هناك تعليمة أخرى؟

MSG1.rar

#30

هذه

	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

#31
اقتباس
اجعل المقارنة jge

لقد غيرتها وعند وصول الثواني إلى 59 يطبع النص في العمود 10 مباشرة ويخرج من البرنامج

اقتباس
الطريقة الوحيدة ليخرج البرنامج وينتهي هي في أن يكون هناك مشكلة في المقارنة بقيمة c

لا توجد مشكلة عند المقارنة بـ C أي رقم العمود. وللتأكد أكثر لقد قمت بحذف الوقت وإستعمال KEYBOARD بدلا منه هكذا

اقتباس
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:

;-----------------------------------------

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 على المساعدة

MSG1.rar

MSG2.rar

MSG3.rar

#32

السلام عليكم

وأخيرا لقد حصلت على الحل وبطريقة مختصرة وهاهو الكود

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

#33

اوخ .. صحيح :D

مبروك

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#34
اقتباس
أخي GamingMasteR هل من الممكن أن تعطيني مقدمة عن الرسم في بيئة 16bit

ذكرت أني لم استخدم 16bit asm في الرسم ابداً !!

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…