دورة الأسمبلى - اليوم الخامس

 


سنبدأ بتعليمات وأوامر الأسمبلى ،،،

التعليمات الحسابيه Arithmatic Instructions
-------------------------------------------------------



1 - الجمع :-
--------------


التعليمه : Add
وتأخذ فى الحاله العاديه 2 وسيط ، المصدر و الهدف وهى تكافىء === المصدر = المصدر + الهدف
ADD Source , Destination === Source = Source + Destination

أمثله :

CODE



; A2H + 20H = C2
MOV AX , A2; 1st Number
ADD AX , 20; 2nd Num

 


نأخذ فى إعتبارنا أن العدد كون بالنظام السادس عشر إفتراضيا حالما يتم تغييره إلى عشرى أو ثنائى
بمعنى فى المثال السابق أول خطوه نقوم بتحميل A2 بالنظام السادس عشر إلى المسجل AX
وفى الخطوه الثانيه قمنا بجمع على ما بداخل المسجل الرقم السادس عشر A2


مثال آخر :

CODE

[/u]

; A111 + 2302 + 1203 + 4099 = 116AF
; OF COURCE AX IS 16 BIT RWG. SO IT WILL CONTAINS 16AF AFTER THE OPERATION
MOV AX , A111
ADD AX , 2302
ADD AX , 1203
ADD AX , 4099
; AX = 16AF AND CARRY FLAG IS BEEN SET

 



[u]
مثال آخر ( بإستخدام الذاكره ) :


نضيف محتويات الذاكره بالعنوان [A200] + [3409] >>>>

 

CODE


MOV AX , [A200]
ADD AX , [3409]

 



ملاحظه : يمكن القيام بكل هذه الأمثله على برنامج ال Debug والذى تم شرحه فى الدرس السابق ،،،


-------------------------------------------------------------------------------------------------------------------------



2 - الطرح :-
-------------


التعليمه : SUB

بالظبط نفس تعليمة الجمع

مثال :-

نطرح محتويات المسجل CX من محتويات المسجل SI

 

CODE


SUB SI , CX

 



مثال آخر :

نطرح محتويات المكان فى الذاكره المعنون بالعنوان الموجود فى المسجل BX من FFFF

 

CODE


MOV AX , FFFF
SUB AX , [BX]

 

 


-------------------------------------------------------------------------------------------------------------------------



3 - الضرب :-
---------------


التعليمه : MUL

يتم ضرب أى رقمين فى لغة الأسمبلى فى ثلاث أنظم ألى الآن :-

الأول : ال8-بت (البايت) :-

يتم وضع إحدى قيم الضرب فى AL و الآخر فى أى ريجستر آخر له نفس الحجم أو مكان فى الذاكره بجانب كود الضرب الذى هو فى حالتنا هنا [MUL] للأرقام الغير محددة الإشاره . و [IMUL] للأرقام المحددة الإشاره .وتوضع النتيجه فى ال AX .

مثال :

للحصول على حاصل ضرب 120 * 30 نقوم بالأتى :-


 

CODE

;----------------------------------
MOV CL,30D
MOV AL,120D
MUL CL
MOV [1000H] , AX    ;
لتخزين الناتج فى الذاكره المعنونه ب1000 بالنظام السادس عشر
;----------------------------------




الثانى : ال16-بت (الكلمه) :-

يتم وضع إحدى القيم فى AX و ألآخرفى أى ريجستر آخر له نفس الحجم أو مكان فى الذاكره بجانب كود الضرب و توضع النتيجه فى DX:AX . و هذا معناه أن الجزء ال Low من ناتج القسمه سيخزن فى ال AX و الجزء ال High سيوضع فى ال DX .

مثال :

للحصول على حاصل ضرب 20000 * 2365 سنقوم بالآتى :-


 

CODE

;----------------------------------
MOV CX,2365D
MOV AX,20000D MUL CX
MOV [1000H],AX    ;
تخزين الجزء الأول فى المكان فى الذاكره المعنون ب 1000
MOV [1001H],DX    ;
تخزين الجزء الثانى فى المكان فى الذاكره الذى يلى المكان السابق
;----------------------------------




الثالث : ال32 بت :-

يتم وضع إحدى القيم فى EAX و ألآخرفى أى ريجستر آخر له نفس الحجم أو مكان فى الذاكره بجانب كود الضرب و توضع النتيجه(64 بت) فى EDX:EAX . و هذا معناه أن الجزء ال Low من ناتج القسمه سيخزن فى ال EAX و الجزء ال High سيوضع فى ال EDX .

بالطبع نحن نتعامل كبدايه على الأنظمه إلى ال 16 بت ،،،


-------------------------------------------------------------------------------------------------------------------------



4 - القسمه :-
---------------


التعليمه : DIV

أيضاً تتم فى نفس النظم السابقه والخاصه بالضرب :-

الأول : ال8بت (بايت) :-

يتم و ضع المقسوم فى AX و المقسوم عليه فى أى ريجستر حجمه بايت مثل BL,CL,DL,... أو مكان فى الذاكره لها حجم بايت مثل BYTE PTR [1234H] , BYTE PTR [BX] .و يوضع ناتج القسمه فى AL و باقى القسمه فى AH بإستخدام [DIV] .
لاحظ:- أنه فى حالة قسمة الأرقام المحددة الإشاره بإستخدام [IDIV]تكون إشارة ناتج القسمه هى الإشاره العاديه فى هذه الحالات . وتكون إشارة خارج القسمه Remender دائماً موجبه و صحيحه Integer.

لاحظ:- كل القيم هنا 8-بت إذاً , لابد من تحويل القيمه ال 8-بت للمقسوم إلى 16-بت ليمكن نقلها ألى AX ويتم ذلك فى حالة القيم غير محددة الإشاره بمسح ال AH ليكون كله أصفار و تكون قيمة المقسوم 16-بت . أما فى حالة القيم محددة الإشاره يتم ذلك عن طريق كود [CBW] المسئول عن تحويل البايت(8-بت) إلى كلمه (16-بت) لل AX فقط.

مثال :-

للحصول على ناتج قسمة(+16) على (-5) يمكننا عمل الأتى :-


 

CODE

;----------------------------------
MOV AL,16D
CBW
MOV BL,5D
NEG BL
IDIV BL
MOV PYTE PTR[1000H] , AL
MOV PYTE PTR[2000H] , AH
;----------------------------------



وهنا تم نقل المقسوم إلى AL وتم عمل مد له عن طريق [CBW] . ثم تم نقل قيمة المقسوم عليه إلى BL بعد وضع الإشاره السالبه عن طريق [NEG]. إذا القيم جاهزه لعملية القسمه ويتم حفظ الناتج فى الذاكره بعدها.


--------------------------------------------------------------------------------

باقى النظم كما سبق من الممكن أن تقوم بإستنتاجها .


-------------------------------------------------------------------------------------------------------------------------



ملاحظه أخيره : إستخدمنا التعليمه MOV وهى مسئوله - كما توقعتم - على تحميل المسجلات أو أماكن الذاكره بقيم معينه أو محتويات مسجل أو أى قيم أخرى ،،

 

 

 


Copyright © www.kettaneh.net