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

تصحيح المقاطع البرمجية

بدأه رامي العلي2 في 28 يناير 2009 · 7 رد · 1,075 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

هذا هو السؤال بالضبط

صحح المقاطع البرمجية التالية إذا وجد فيها خطأ :

-1-

CLD
LEA SI,OFF-SRC
REPMOVS DST,SRC
MOV CX,100
LEA DI,OFF-DST

-2-

MOV AL,[BX]
DAA AL
ADD AL,03h
MOV [BX],AL		
MOV ES,0F01H

-3-

خدمة إظهار محرف

MOV AL,CHARACTER
MOV AH,09
MOV CX,REP
MOV BH,Pag No
MOV BL,ATT
INT 10H

-4-

قراءة محرف

MOV AH,00
INT 21H
CMP AL,00
INT 16H

-5-

MOV CX,200
REPE CMPS DST,SRC
REP MOVS DST,SRC
MOV CX,100

-6-

خدمة معالجة الشاشة BIOS

MOV CL,12
MOV AH,01  
MOV CH,100
INT 10H

-7-

MOV AX,DX
ADD BX
MOV CX,AX
SUB DX 
MOV BX,DX 
MUL BX 
MOV ES,000F

-8-

خدمة طباعة محرف على الطابعة BIOS

MOV DX,100
MOV AL,CHAR	 
MOV AH,03 
INT 17H

-9-

MOV AL,[BX
DAA AL 
ADD AL,03H 
MOV [BX],AL
MOV VS,0F00H

-10-

معالجة لوحة المفاتيح - DOS

MOV CX,20
LEA DX,IN AREA 
MOV BX,00 
MOV AH,3FH 
INT 21H

-11-

خدمة الطباعة

MOV BH,00
ADD AL,char
MOV DX,00	
INT 14H

................................................................................

..............................

أخي العزيز قمت بحل برنامج أرجو منك أن تراه إن كان صحيح أو لا

اكتب برنامجاً بلغة التجميع يقوم بطباعة الجملة التالية على الشاشة ( FIRST CLASS ) وذلك بإستخدام مقاطعات الدوس

Stack	  100H
Data  segment
"Eat1 DB "FIRST CLASS
CrLf DB 0DH,0AH

Data	ENDS
Code	segment 
Assume CS:Code , DS:data 
Start : MOV AX,Data
MOV DS,AX
LEA DX,EAT1
MOV AH,09H
INT 21H
LEA DX,Crlf
MOV AH,09H
INT 21H
MOV AH,4CH
MOV AL,0
INT 21H
Code ENDS 

END

تم تعديل هذه المشاركة بواسطة Xacker في 28 يناير 2009 في 17:45

#2

بالإنتظار إخواني

#3

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

CLD
LEA SI,OFF-SRC
REPMOVS DST,SRC
MOV CX,100
LEA DI,OFF-DST

لك الملاحظات والتصحيح عليك.

في السطر2 سيتم وضع قيمة عددية في SI ناتجة عن طرح عنوان من عنوان، يجب أن تكون القيمة في CX وليس SI لتعمل مع REP

في السطر3 التعليمة REP MOVS تحوي فراغ ويجب على dst و src ان تكون معنونة في registers هي E[sI] و E[DI]

المطلوب وضع طول النص المراد نقله من SI إلى DI في CX وعنونة النص من src في SI و المكان المراد النقل إليه dst في DI ثم استخدام REP MOVS

عليك باستخدام LOOP أيضاً مع REP MOVS لأن REP تقوم بنقل حرف واحد في كل مرة.

MOV AL,[BX]
DAA AL
ADD AL,03h
MOV [BX],AL		
MOV ES,0F01H

DAA يجب أن تأتي بعد ADD وليس قبلها.

لا داع لآخر سطر يستخدم ES.

تم تعديل هذه المشاركة بواسطة Xacker في 29 يناير 2009 في 19:11

Do as I say, not as I do

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

#4
اقتباس
لك الملاحظات والتصحيح عليك.

في السطر2 سيتم وضع قيمة عددية في SI ناتجة عن طرح عنوان من عنوان، يجب أن تكون القيمة في CX وليس SI لتعمل مع REP

في السطر3 التعليمة REP MOVS تحوي فراغ ويجب على dst و src ان تكون معنونة في registers هي E[sI] و E[DI]

المطلوب وضع طول النص المراد نقله من SI إلى DI في CX وعنونة النص من src في SI و المكان المراد النقل إليه dst في DI ثم استخدام REP MOVS

هذا تصحيحي

CLD

LEA SI,OFF-SRC

LEA DI,OFF-DST

MOV CX,100

REP MOVS DST,SRC

#5
MOV AL,CHARACTER
MOV AH,09
MOV CX,REP
MOV BH,Pag No
MOV BL,ATT
INT 10H

السطر الرابع، لا يمكن أن يحوي فراغ بين Pag و No

ممكن أن تكون Pag_No على سبيل التصحيح

راجع بعض المعلومات الأخرى المهمة بخصوص هذه المقاطعة:

http://www.ctyme.com/intr/rb-0099.htm

MOV AH,00
INT 21H
CMP AL,00
INT 16H

احذف السطر الثاني لأنه سيقوم بتنفيذ program termination حسب DOS 1.0

احذف السطر الثالث لا داع لاستخدامه هنا بهذا الشكل لأن البرنامج لا يستلم التنفيذ مرة أخرى إلا بعد إدخال أي حرف من الـ std input بالتالي لن يكون بالقيمة 0

أو يمكن نقل السطر الثالث إلى ما بعد السطر الرابع وتغيير القيمة 00 ليقوم بفحص AL ليقارنها بقيمة ما (حرف أو رقم أو ما شابه).

MOV CX,200
REPE CMPS DST,SRC
REP MOVS DST,SRC
MOV CX,100

src و dst في السطر الثاني يجب أن تكون معنونة بواسطة مسجلات

مثلاً

 

[color= #ff007f;]lea   [color= #7f7f40;]si[color= #0000ff;],src

[color= #ff007f;]lea   [color= #7f7f40;]di[color= #0000ff;],dst

@[color= #7f7f7f;]1[color= #0000ff;]:

[color= #ff007f;]repe [color= #ff007f;]cmps   [color= #0000a0; font-weight: bold;][[color= #7f7f40;]di[color= #0000a0; font-weight: bold;]][color= #0000ff;],[color= #0000a0; font-weight: bold;][[color= #7f7f40;]si[color= #0000a0; font-weight: bold;]]

[color= #ff007f;]loop   @[color= #7f7f7f;]1

"قد" لا يتم تنفيذ السطر الثالث لو تطابقت السلسلة الموجودة في SRC مع السلسلة الموجودة في DST تماماً بكاملها حينها تصبح قيمة CX مساوية للصفر عند الانتهاء من السطر الثاني وبالتالي لا يتم تنفيذ السطر الثالث. يتم تنفيذ السطر الثالث عندما يحدث عدم تطابق في بايت ما بين SRC و DST حينها يتم نقل ما تبقى من SRC إلى DST (بناء على ما تبقى من قيمة CX)

لا أرى داع من استخدام السطر الرابع في هذا المكان بهذا الشكل اللهم إلا إن كان يجب أن يكون يسبق السطر الثالث تماماً وهذا يعني استخدام مختلف لهذا المقطع البرمجي.

MOV CL,12
MOV AH,01  
MOV CH,100
INT 10H

لا أعتقد يوجد فيه خطأ

http://www.ctyme.com/intr/rb-0086.htm

MOV AX,DX
ADD BX
MOV CX,AX
SUB DX 
MOV BX,DX 
MUL BX 
MOV ES,000F

لا داع للسطر الأخير

العمليات صحيحة مع مراعاة القيم الموجودة في المسجلات التي يتم تناقلها.

MOV DX,100
MOV AL,CHAR	 
MOV AH,03 
INT 17H

السطر الثاني لا داع له.

السلسلة النصية التي سيتم طباعتها يجب أن تكون معنونة في DS:SI ويجب أن يتم تحديد طول السلسلة في CX.

http://www.ctyme.com/intr/rb-2105.htm

MOV AL,[BX]
DAA AL 
ADD AL,03H 
MOV [BX],AL
MOV VS,0F00H

شبه مكرر

نفس ما ذكر من ملاحظات حول المقطع البرمجي رقم 2

السطر الأخير يجب أن يكون المتغير VS معنون كـ dw على الأقل حتى لا يحدث خطأ

MOV CX,20
LEA DX,IN AREA 
MOV BX,00 
MOV AH,3FH 
INT 21H

21h لا تحوي خدمة 3Fh للتعامل مع لوحة المفاتيح.

http://www.ctyme.com/intr/int-21.htm

MOV BH,00
ADD AL,char
MOV DX,00	
INT 14H

لم يتم ذكر الخدمة التي سيتم استخدامها مع المقاطعة وحسبما أرى لا يوجد شئ في هذه المقاطعة يتم استخدامه مع الطابعة.

http://www.ctyme.com/intr/int-14.htm

تم تعديل هذه المشاركة بواسطة Xacker في 29 يناير 2009 في 19:13

Do as I say, not as I do

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

#6
رامي العلي2 كتب:

هذا تصحيحي

CLD

LEA SI,OFF-SRC

LEA DI,OFF-DST

MOV CX,100

REP MOVS DST,SRC

اقرأ ملاحظاتي بشكل جيد حتى يكون تصحيحك أكثر دقة.

أعتقد أن التصحيح سيكون بهذا الشكل بناء على الملاحظات

 

[color= #ff007f;]cld

[color= #ff007f;]lea   [color= #7f7f40;]si[color= #0000ff;],src

[color= #ff007f;]lea   [color= #7f7f40;]di[color= #0000ff;],dst

[color= #ff007f;]mov   [color= #7f7f40;]cx[color= #0000ff;],[color= #7f7f7f;]100

[color= #ff007f;]rep [color= #ff007f;]movs   [color= #0000a0; font-weight: bold;][[color= #7f7f40;]di[color= #0000a0; font-weight: bold;]][color= #0000ff;],[color= #0000a0; font-weight: bold;][[color= #7f7f40;]si[color= #0000a0; font-weight: bold;]]

Do as I say, not as I do

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

#7
اقتباس
اقرأ ملاحظاتي بشكل جيد حتى يكون تصحيحك أكثر دقة.

أعتقد أن التصحيح سيكون بهذا الشكل بناء على الملاحظات

أخي العزيز البرنامج هنا ينقل سلسلة المصدر الموجودة في القطاع DS بإنزياح قدره SI إلى القطاع الإضافي ES بإنزياح قدره DI والسلسة بطول 100

فيكون التصحيح هذا أصح

CLD

LEA SI,OFF-SRC تحميل عنوان السلسلة المصدر

LEA DI,OFF-DST تحميل عنوان السلسة الهدف

MOV CX,100 تحميل 100 عدد البايتات إلى CX

REP MOVS DST,SRC نقل البيانات ال100

..................

#8

أمر آخر يرجى الانتباه إليه، LEA تقوم بتحميل عنوان إلى مسجل، أنت هنا تستخدم LEA بالشكل

lea	si, off-src

off تمثل متغير يتم الإشارة إليه في مقطع البيانات "مثلاً"

src تمثل متغير يتم الإشارة إليه في مقطع البيانات.

المتغيرين هذين يملكان عنوانين يتم استخدامهما من خلال العبارتين off و src بالتالي عندما تضع off-src فأنت تطرح عنوانين وتحصل على الفرق بين العنوانين كقيمة كما ذكرت لك وتضعها في SI لأن LEA تتعامل مع أي قيمة باعتبارها صحيحة.

اعتبر أن off تحمل العنوان 1500 و src تحمل العنوان 1400 وأنت تريد نقل السلسلة الموجودة عند src بطول 100 إلى dst التي تحمل العنوان 2000

off-src ستعطيك 100 في SI وعندما تأتي للنقل فإنك تنظر إلى DS:SI أي DS:100 أي السلسلة الموجودة عند الإنزياح 100 وليس 1400.

من ناحية أخرى ذكرت لك أن REP MOVS يجب أن تتعامل فيها مع مسجلات حصراً

راجع هذا:

http://faydoc.tripod.com/cpu/rep.htm

أيضاً أضفت تعديل في الأعلى حول ضرورة استخدام LOOP مع REP.

في النهاية إن كنت غير متأكد من الجواب الصحيح فقم بكتابة برنامج صغير تختبر به ما تقوم بتصحيحه حتى تتأكد من النتيجة بنفسك.

تم تعديل هذه المشاركة بواسطة Xacker في 29 يناير 2009 في 19:17

Do as I say, not as I do

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

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