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

كيف أستخدم مقاطعة الDOS في إحضار الزمن وإخراجه على الشاشة ؟؟

مغلق
بدأه n3rd في 26 يونيو 2007 · 5 رد · 1,288 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم اللهـ الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

AH = 2Ch - GET SYSTEM TIME

المقاطعة int 21h والتي يمكننا من خلالها إحضار الوقت وذلك بإسناد القيمة 2Ch إلى المسجل AH ولكن واجهتني بعض المشاكل التي بتجاوزي لها سأخطو خطوات عملاقة في هذه اللغة القوية...

هذا رابط الصفحة:

http://spike.scu.edu.au/~barry/interrupts.html#ah2c

وهذه محاولتي:

.model small
.code

mov ah,2ch
int 21h
mov dx,cl
mov ah,2
int 21h

mov ah,4ch
int 21h
end

وأنا أجزم إنه هناك خطأ .. أتمنى تصحيحه وشرح السبب لي .. طبعا بالإعتماد على صفحة المقطاعات (بالأعلى).

تحيتي لكم ,,,

#2

السلام عليكم

هذا النوع من الاسئلة تكرر كثيراً فى المنتدي, الامر الذي تريد القيام به هو تحويل رقم إلى حرف, وتستطيع عمل ذلك بإضافة الرقم 31h لمحتوى cl لكي تحصل على الرقم بصيغة محارف وتستطيع بذلك طباعته..

المشكلة الثانية هى انك تحاول تحميل محتوى cl وهو من نوع بايت إلى المسجل dx وهو من نوع word وهذا لا يجوز, الحل السريع هو ان تفرغ محتوى المسجل dx ثم تقوم بتحميل cl للمسجل dl.

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#3

طيب ممكن أشوف برنامجك (لو سمحت) ... لإنه حاولت مثل ماقلت وماطلع الوقت كما هو

وهذا هو برنامجي:

.model small
.code

mov ah,2ch
int 21h
mov dh,31h
mov dl,dh
mov ah,2
int 21h

mov ah,4ch
int 21h
end

can you help me plz !!

#4

لا أعلم عن هذه المقاطعة ، لكن الأخ أحمد ذكر :

اقتباس
وتستطيع عمل ذلك بإضافة الرقم 31h لمحتوى cl لكي تحصل على الرقم بصيغة محارف

وانت قمت هنا بالنقل وليس بالاضافه . استعمل:

ADD CL,31H

اقتباس
الحل السريع هو ان تفرغ محتوى المسجل dx ثم تقوم بتحميل cl للمسجل dl.

XOR DX,DX

MOV DL,CL

(كما ذكرت ، لا أعلم عنها شيئا ، ولكنها مجرد لقافه :) ) .

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#5
 .MODEL SMALL
 .STACK 100H

 .DATA
   PROMPT  DB  'Current System Time is : $'	 
   TIME	DB  '00:00:00$'	   ; time format hr:min:sec

 .CODE
   MAIN PROC
	 MOV AX, @DATA			   ; initialize DS
	 MOV DS, AX

	 LEA BX, TIME				; BX=offset address of string TIME

	 CALL GET_TIME			   ; call the procedure GET_TIME

	 LEA DX, PROMPT			  ; DX=offset address of string PROMPT
	 MOV AH, 09H				 ; print the string PROMPT
	 INT 21H					  

	 LEA DX, TIME				; DX=offset address of string TIME
	 MOV AH, 09H				 ; print the string TIME
	 INT 21H					  

	 MOV AH, 4CH				 ; return control to DOS
	 INT 21H
   MAIN ENDP

;**************************************************************************;
;**************************************************************************;
;-------------------------  Procedure Definitions  ------------------------;
;**************************************************************************;
;**************************************************************************;

;**************************************************************************;
;------------------------------  GET_TIME  --------------------------------;
;**************************************************************************;

   GET_TIME PROC
   ; this procedure will get the current system time 
   ; input : BX=offset address of the string TIME
   ; output : BX=current time

	PUSH AX					  ; PUSH AX onto the STACK
	PUSH CX					  ; PUSH CX onto the STACK 

	MOV AH, 2CH				  ; get the current system time
	INT 21H					   

	MOV AL, CH				   ; set AL=CH , CH=hours
	CALL CONVERT				 ; call the procedure CONVERT
	MOV [BX], AX				 ; set [BX]=hr  , [BX] is pointing to hr
								 ; in the string TIME

	MOV AL, CL				   ; set AL=CL , CL=minutes
	CALL CONVERT				 ; call the procedure CONVERT
	MOV [BX+3], AX			   ; set [BX+3]=min  , [BX] is pointing to min
								 ; in the string TIME

	MOV AL, DH				   ; set AL=DH , DH=seconds
	CALL CONVERT				 ; call the procedure CONVERT
	MOV [BX+6], AX			   ; set [BX+6]=min  , [BX] is pointing to sec
								 ; in the string TIME

	POP CX					   ; POP a value from STACK into CX
	POP AX					   ; POP a value from STACK into AX

	RET						  ; return control to the calling procedure
   GET_TIME ENDP				 ; end of procedure GET_TIME

;**************************************************************************;
;-------------------------------  CONVERT  --------------------------------;
;**************************************************************************;

   CONVERT PROC 
   ; this procedure will convert the given binary code into ASCII code
   ; input : AL=binary code
   ; output : AX=ASCII code

	PUSH DX					  ; PUSH DX onto the STACK 

	MOV AH, 0					; set AH=0
	MOV DL, 10				   ; set DL=10
	DIV DL					   ; set AX=AX/DL
	OR AX, 3030H				 ; convert the binary code in AX into ASCII

	POP DX					   ; POP a value from STACK into DX 

	RET						  ; return control to the calling procedure
   CONVERT ENDP				  ; end of procedure CONVERT

;**************************************************************************;
;--------------------------------------------------------------------------;
;**************************************************************************;

 END MAIN

:)

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#6

شكرا جزيلا للأخ أحمد غريب والأخ رومنسي

سوف أقوم بمحاولاتي وسأقوم بتعقيب ردي هنا

:)

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

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

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

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

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

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