مدونة علم البرمجة والحاسوب
من حقك ان تتعلم اكثر

دورة الاسمبلي : الدرس الخامس

 
 
سنبدأ بتعليمات وأوامر الأسمبلى ،،،
التعليمات الحسابيه 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 وهى مسئوله - كما توقعتم - على تحميل المسجلات أو أماكن الذاكره بقيم معينه أو محتويات مسجل أوأى قيم أخرى ،،

من انا ؟