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

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

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

السلام عليكم

أريد إظهار جملة بالأسمبلي 16bit ولكن تكون عملية الإظهار بعد 5 ثواني مثلا

ماهو الأمر الذي يظهر الرسالة بعد 5 ثوان أظنه في لغة باسكال wait

#2

قم بعمل 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]

#3

بارك الله فيك أخي GamingMasteR لكن لم أفهم كيف تكون التعليمة أرجو التوضيح بارك الله فيك

وكذلك عندي سؤال كيف يمكن إضافة قيمة إلى متغير أي variable كما موضح في المثال

s:=d+5

#4

احصل على الوقت الحالي بمقاطعة 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

#5

السلام عليكم

جزاكم الله خيرا على المساعدة ولكن أخوكم مبتدئ

هل تعني يكون هكذا

mov cx,5;عدد الثواني  
time:
mov ah,2ch
int 21
loop time

أما السؤال الثاني نفرض أن

d   db  10


mov bl,d
add bl,5
mov d,bl;<----هنا الخطأ ولكن لم أفهم كيف يكون الحل الصحيح
#6

لا طبعا لا أقصد هذا

أخي أنظر استخدام المقاطعة, عند تنفيذها فهي تجلب لك وقت الحاسوب نفسه. كأنك تقرأ كم الوقت الآن في جهازك.

لنفرض وقت التنفيذ كانت الساعة 12:54:23 بالشكل hh:mm:ss

يعني قيمة DH ستكون 23 وهي قيمة الثواني.

انت تريد تأخير إظهار الرسالة مدة 5 ثوان إذن يجب أن تنتظر إلى أن تصبح الساعة 12:54:29 حينها يتم عرض الرسالة عدا هذا لا.

التأخير سيكون من خلال حلقة loop.

لنضع تصور للكود الآن:

  1. تنفيذ المقاطعة وقراءة الوقت الحالي
  2. حفظ قيمة DH جانباً
  3. زيادة القيمة المحفوظة بمقدار 5 وحفظها مرة أخرى
  4. شرط الحلقة أن تكون قيمة DH الجديدة أصغر تماماً من القيمة المحفوظة سابقاً
  5. الدخول في الحلقة
  6. قراءة الوقت الحالي باستخدام المقاطعة مرة أخرى
  7. العودة إلى بداية الحلقة عند (4)
  8. الخروج من الحلقة بانتفاء الشرط وإظهار الرسالة.

بالنسبة للسؤال الثاني هل تستخدم نفس المثال الذي أدرجته في الجمع أم بقيم أخرى؟

انتبه إلى ألا تقوم بجمع قيم ناتج جمعها أكبر من 255 بسبب طول المتغير المحجوز.

Do as I say, not as I do

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

#7

جزاك الله خيرا أخي 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
#8
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]

#9

السلام عليكم

جزاكم الله خيرا الكود يعمل جيدا ولكن هنا مشكلة أظنكم تفطنتم لها وهي أحيانا ندخل في حلقة غير منتهية

وذلك عندما يكون الوقت الحالي أي عدد الثواني في dh على سبيل المثال = 60 وعند إضافة 5 يصبح المتغير s= 65

وهنا تكمن الإشكالية المقارنة بين dh و s تكون دائما أقل وهذا يعني عدم الخروج من الحلقة فمالحل لهذه المشكلة؟

#10

pseudocode:

if dh > 55
	s = dh + 5 - 55
else
	s = dh + 5

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#11

السلام عليكم

آسف عن التأخر بارك الله فيك أخي 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:

MSG.rar

#12

ما المشكلة ؟؟

غير :

sub dh,59

الى

sub dh,55

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#13

جزاك الله خيرا بالفعل لقد أنقصت في عدد الثواني لتسريع الرسالة في الدوران ولم أنتبه لتغيير قيمة المقارنة ولكن المشكلة التي واجهتني هي عند ظهور النص كل حركة للنص تزيد سطر في الأعلى ! مع العلم أني حددت السطر 13 جرب البرنامج وستلاحظ ذلك . هل هناك خطأ؟

#14

أسف لم الاحظ انك انقصت عدد الثواني !

بالنسبة للرسم فلم اجرب من قبل الرسم من خلال المقاطعات ,, ربما يفيدك شخص اخر .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#15

رأيته فقط لا استطيع التعامل مع 16بت حالياً

اتصور عليك ان تقوم بمسح القيمة السابقة على الشاشة قبل رسم الجديدة

لا تنسى ان هذا لن يتم لوحده

حاول وضع البرنامج تحت debugger

Do as I say, not as I do

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

#16

السلام عليكم.....

أنا لا أمتلك الخبرة في هذه اللغة ولكن اتوقع استخدام الأمر Delay يفي بالغرف؟

#17

Delay موجود في حزمة irvine16 ؟

Do as I say, not as I do

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

#18
Xacker كتب:
اتصور عليك ان تقوم بمسح القيمة السابقة على الشاشة قبل رسم الجديدة

لا تنسى ان هذا لن يتم لوحده

السلام عليكم

بارك الله في على ردك أخي Xacker

لقد قمت بالفعل بالتلاعب بالألوان للخلفية حيث لا يظهر الحرف r عند تحرك النص وتم ذلك بنجاح ولكنه أدخلني في مشكل ألا وهو زيادة سطر للأعلى هذا الذي لم أفهمه. قد تلاحظ ذلك عند تجربة الملف التفيذي.

Xacker كتب:
حاول وضع البرنامج تحت debugger

هل تعني كتابته وتجريبه في الـ debuger سأحاول ذلك

Mont-x كتب:
السلام عليكم.....

أنا لا أمتلك الخبرة في هذه اللغة ولكن اتوقع استخدام الأمر Delay يفي بالغرف؟

ماذا تقصد بـ Delay؟

GamingMasteR كتب:
بالنسبة للرسم فلم اجرب من قبل الرسم من خلال المقاطعات ,, ربما يفيدك شخص اخر .

هل تعني ما قاله لي الأخ عبد العزيز وذلك حسب نظام العرض حيث تكون الحروف بموضع معين بالذاكرة يمكن التعامل معها مباشرة دون المرور بالمقاطعات

في هذه المشاركة

#19

لا لم اعني الرسم عن طريق تحرير الذاكرة بل الرسم عموما في بيئة 16bit ,, لا استخدمها الا في اسياء بسيطة مدمجة مع 32bit خاصة بالنظام .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#20
GamingMasteR كتب:
لا لم اعني الرسم عن طريق تحرير الذاكرة بل الرسم عموما في بيئة 16bit ,, لا استخدمها الا في اسياء بسيطة مدمجة مع 32bit خاصة بالنظام .

هذا يعني هناك عدة طرق للرسم في بيئة 16bit وأظنه هناك الكثير من الخبايا التي لم أعرفها بعد حاليا مازلت أتصارع مع برنامجي scroll text وبعد الإنتهاء منه إن شاء الله أريدكم أن تعطونا مدخل أو مقدمة حول هذه الطريقة وجزاكم الله خيرا

تم تعديل هذه المشاركة بواسطة hatem في 22 أغسطس 2008 في 14:05

#21

السلام عليكم

الحمد لله لقد تمكنت من النص وهو يعمل بشكل جيد ولكن بقي خطأ في الوقت إذا كان 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 يتوقف النص هنا المشكلة!!

MSG.rar

#22

الطريقة الوحيدة لكي يتوقف النص عن الحركة هي في أن تعلق هنا

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

#23

جزاك الله خيرا أخي 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 ولكم أن تجربوه

MSG.rar

تم تعديل هذه المشاركة بواسطة hatem في 25 أغسطس 2008 في 17:29

#24

كنت أفكر بكتابة شئ مثل هذا

لم استطع تجريبه، 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

#25

يقوم بإظهار الرسالة في العمود 10 ويخرج من البرنامج وهذا دليل على تنفيذ البرنامج من دون وقت ولذالك لا تتم رؤية التنفيذ.

المشكل مازال موجود!!

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