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