Visits: 712
جمع و تفريق بي علامت دستور (ADD)
از اين دستور براي جمع دو داده 8 بيتي استفاده مي شود. براي عمل جمع حتما بايد يكي از داده ها در انباره A باشد و ديگري مي تواند در يكي از ثباتها يا داده فوري باشد.
قالب دستور: ADD A,SOURCE
مثال عدد 10H را با E5 جمع كنيد؟
ابتدا يك از اعداد را به طور دلخواه در انباره ريخته و سپيس عدد ديگر را با انباره جمع مي كنيم
MOV A,#10H 10H
ADD A,#0E0H +E5H =F5H A=F5H
نكته: اگر بعد از علامت پوند # عددي در مبناي هگز باشد كه بايت سنگين آن يكي از حروفهاي A تا F باشد بايد حتما بين اين حروفها و # صفر قرار دهيم تا كامپايلر آن را يك عدد در مبناي هگز بشناسد نه يك حرف انگليسي.
بعد از عمليات جمع نتيجه حاصل جمع در خود انباره قرار مي گيرد.
جمع اعداد 16 بتي دستور ADDC
از اين دستور براي جمع دو داه 16 بيتي استفاده مي شود البته نه اينكه مستقيما داده 16 بيتي را با هم جمع مي كند بلكه ما ابتدا بايد اين داده 16 بتي را به داده 8 بتي تجزيه كردن و با هم جمهع كنيم براي اين كار اگر با 8 بيتي اول عدد اول را با 8 بيت اول عدد دوم جمع كنيم اگر رقم نقلي توليد شود اين دستور به طور اتوماتيك اين رقم نقلي را با بايت دوم عدد اول و دوم جمع مي كند به مثال زير توجه كند!
مثال مي خواهيم عدد 3CE7+3B8D را در مبناي هگز با هم جمع كنيم. براي جمع ابتدا پرچم كري را صفر مي كنيم چون ممكن است از قبل توسط برنامه اي ديگر يك شده باشد. سپس اين داده 16 بيتي را به داده 8 بيتي تجزيه مي كنيم. مي دانيم كه در ميكر همه چيز 8بتي مي باشد پس از جمع دو داده 16 بيتي مطمئنا يك داده 16 بزرگتر توليد مي شود براي همين ما بايت سبك را در R1 قرار مي دهيم و بايت سنگين را در R2 قرار مي دهيم البته اين يك فرض دلخواه مي باشد شما مي توانيد اين داده را در هر ثباتي قرار دهيد و از حاصل اين جمه در جايي ديگر استفاده كنيد.
CLR C
MOV A,#0E7H
ADD A,#8DH
MOV R1,A
MOV A,#3CH
ADDC A,#3BH
MOV R2,A
اصول كار ADDC در اصل اين است كه دو عمل جمع را انجام مي دهد يعني اينكه ابتدا عدد 3C را با عدد 3B جمع كرده و نتيجه اين محاسبه را دوباره با مقدار كري يعني CY=1 جمع مي كند و نتيجه نهايي را در انباره قرار مي دهد.
1
3CE7
+3B8D = 7874H
در اين مثال از جمع E7+8D يك رقم نقلي توليد مي شود كه در نتيجه پرچم كري برابر با 1 خواهد شد كه نشانگر انشار رقم نقلي از بايت پايين به بايت بالا مي باشد كه در خط بعدي برنامه اين رقم نقلي با حاصل جمع بايت هاي سنگين نيز جمع خواهد شد.
دستور DA A
از اين دستور براي جمع BCD استفاده مي شود همانطور كه مي دانيم اعداد ما از 0 تا 9 مي باشد كه در ميكرو بعد از جمع ممكن است اين حاصل جمع BCD نباشد و براي ما قابل فهم نيست يعني اينكه قابل نمايش روي سون سگمنت يا LCD نيست كه براي حل اين مشكل از دستور DA A استفاده مي شود قابل ذكر است كه اين دستور تنها بعد از دستور جمع و با انباره مي تواند كار كند يعني اينكه قبل از DA A بايد از دستور جمع حتما استفاده شود. عددي كه قرار است براي BCD بودن تست شود اول بايد انباره قرار گيرد و سپس از اين دستور استفاده كنيم. اين دستور يك بايت را چك مي كند و در صورت لزوم به نيبل پايين عدد 6 را اضافه مي كند تا اين BCD استاندارد شود و براي نيبل بالا عدد 6 يعني 60 را اضافه مي كند. به مثال هاي زير توجه كنيد!
17H+28H=3FH=00111111B
عدد F يك عدد BCD نمي باشد همانطور كه مي دانيم حداكثر عدد يعني 9 داراي كد 1001 مي باشد كه در نيبل پايين اين عدد 1111 مي باشد براي BCD كردن آن به صورت زير عمل مي كنيم. ابتدا عدد را در انباره قرار داده و سپس از دستور DA A استفاده مي كنيم دستور به طور خودكار عدد 6 را به نيبل پايين اضافه مي كند.
MOV A,#17H 17
ADD A,#28H +28
DA A 3F+06=45H
براي نيبل بالا هم همين مراحل انجام مي گير البته همانطور گفتيم اين دستو خودكار است يعني اينكه اگر خود حاصل جمع BCD بود ديگر عدد 6 را اضافه نمي كند.
تفريق اعداد بي علامت (SUB SUBB)
البته دستور تفريق دو نوع مي باشد يكي SUB و ديگري SUBB تفريق با قرض. در بسيار از ميكرو پروسسورها اين دو نوع دستور وجود دارد حال در8051 فقط SUBB وجود دارد براي تبديل SUBB به SUB كافي است كه قبل از اجراي اين دستور CY=0 گردد.
SUBB با CY=0
8051 و ديگر پردازنده هاي مدرن از روش متمم 2 براي تفريق استفاده مي كنند.
براي مثال عدد 3F-23 را انجام م دهيم:
CLR C CY=0
MOV A,#3FH A=3F
MOV R1,#23H R1=23
SUBB A,R1 A-R1 = 1C
اگر بعد از اجراي SUBB پرچم CY=1 گردد نتيجه عمليات منفي بوده و اگر CY=0 گردد نتيجه عمليات مثبت بوده. حال اگر نتيجه منفي بود CPU آن را به صورت متمم 2 رها ميكند كه بايد خود برنامه نويس با استفاده از دستوات شرطي نتيجه را به كمك دستور CPL (يعني متمم كردن) و دستور INC (يك واحد اضافه كردن) تغيير دهد.
مثال عدد 6E از 4C كم شود و نتيجه تفريق در ثبات R1 قرا گيرد؟
در اين برنامه اگر نتيجه مثيت باشد كه MGH پرش مي كند و حاصل را د R1 قرار مي هد و اگر نتيجه منفي باشد ابتدا محتوا انباره متمم مي شود و سپس يك واحد به آن اضافه مي شود كه در نهايت نتيجه براير خواهد بود با -22
پرچم كري برابر صفر گردد CLR C
عدد 4C در انباه قرار گيرد MOV A,#4CH
عدد 6E از انباره كم شود SUBB A,#6E
اگر پرچم كري صفر است به MGH پرش كن JNC MGH
محتواي انباره را متمم كن CPL A
يك واحد به انباره اضافه كن INC A
محتواي انباره را در R1 كپي كن MGH: MOV R1,A
SUBB با CY=1
از اين دستور براي تفريق اعداد 16 بيتي استفاده مي شود كه از قرض عملوند پايين تر مراقبت مي كند. اگر CY=1 باشد بعد از اجراي دستور SUBB عدد 1 از حاصل تفريق كم خواهد شد. به مثال زير توجه كنيد!
مي خواهيم عدد 2762-1296 را از هم كم كنيم؟ بايت سبك در R1و بايت سنگين در R2
كري برابر با صفر شود CLR C
عدد 62 را در انباره بريز MOV A,#62H
عدد 96 را از انباره كم كن كه از اين كم كردن پرچم كري 1 خواهد شد SUBB A,#96H
نتيجه اين دو بايت را در R1 قرار بده MOV R1,A
عدد 27 را در انباره كپي كن MOV A,#27H
عدد 12 را از انباره كم كن و اين نتيجه را اگر CY=1 است از 1 هم كم كن SUBB A,#12H
نتيجه را در R2 قرار بده MOV R2,A
توضيح برنامه: ما در اول برنامه پرچم كري را به كمك دستور CLR صفر كرديم حال براي تفريق اين عدد 16 بتي را به دو عدد 8 بتي تجزيه كرده و از هم كم مي كنيم از تفريق عدد 96 از 62 پرچم كري ما يك مي شود و اين نشان دهنده منفي بودن عمليات است و در تفريق دو بايت بعدي ميكرو دو بايت سنگين را از هم كم مي كند و سيپس نتيجه هر چه بود به پرچ كري نگاه مي كند مي بيتد كه CY=1 شده بود از قيل، پس اين نتيجه را از 1 كم مي كند و نتيجه را در R2 قرار مي دهد.
قضيه اعدا مثبت و منفي در ديجيتال
در ديجيتال ما بيت آخر را به عنوان علامت مثبت و منفي اعدد استفاده مي كنيم به اين صورت كه اگر بيت آخر كه با رنگ قرمز نشان داده شده صفر بود نشانگر مثبت بودن عدد مي باشد و اگر يك بود يعني اينكه عدد منفي مي باشد پس ما تنها از 7 بيت براي مقدار عدد مي توانيم استفاده كنيم. به محاسبه عدد زير توجه كنيد؟
0
|
1
|
0
|
0
|
0
|
1
|
1
|
0
|
=
|
62H
|
0
|
1
|
1
|
0
|
1
|
0
|
0
|
1
|
=
|
-96H
|
در ميكرو CPU عمل جمع را جمع مي كند و عمل تفريق را هم جمع مي كند چون طراحي مدار تفريق گر در CPU مشكل است از همان جمع كننده استفاده كرده اند اما براي تفريق CPU مراحل زير را انجام مي دهد.
1) ابتدا عدد منفي را متمم كرده (مكمل 1)
2) سپس يك واحد به آن اضافه مي نمايد (مكمل 2)
CPU دو عدد بالا را براي تفريق به صورت زير انجام مي دهد:
با عدد 62 كه خودش مثبت مي باشد كاري ندار و فقط روي عدد منفي به صورت زير كار مي كند.
0
|
1
|
0
|
0
|
0
|
1
|
1
|
0
|
=
|
62H
|
ثابت مي ماند
|
0
|
1
|
1
|
0
|
1
|
0
|
0
|
1
|
=
|
-96H
|
معادل باينري اين عدد
|
1
|
0
|
0
|
1
|
0
|
1
|
1
|
0
|
|
|
متمم كردن فقط عدد 96
|
1
|
|
|
|
|
|
|
|
|
+
|
با عدد 1 جمع مي شود
|
0
|
1
|
0
|
1
|
0
|
1
|
1
|
0
|
=
|
6AH
|
نتيجه بعد از جمع با عدد 1
|
0
|
1
|
0
|
0
|
0
|
1
|
1
|
0
|
=
|
62H
|
|
0
|
1
|
0
|
1
|
0
|
1
|
1
|
0
|
=
|
6AH
|
حال اين نتيجه را با عدد 62 جمع مي كنيم
|
0
|
0
|
1
|
1
|
0
|
0
|
1
|
1
|
=
|
CCH
|
نتيجه نهايي پايان كار CPU
|
براي اينكه نتيجه را به دسيمال تبديل كه بفهميم نتيجه عمليات چند بوده به شكل زير عمل مي كنيم
|
||||||||||
0
|
0
|
1
|
1
|
0
|
0
|
1
|
1
|
=
|
CCH
|
نتيجه نهايي را دوباره متمم مي كنيم
|
1
|
1
|
0
|
0
|
1
|
1
|
0
|
1
|
|
|
البته در ابن مرحله بيت علامت را متمم نمي كنيم
|
1
|
|
|
|
|
|
|
|
+
|
|
|
0
|
0
|
1
|
0
|
1
|
1
|
0
|
1
|
=
|
|
دسيمال عدد همرا با بيت علامت آن
|
4
|
3
|
–
|
=
|
-34H
|
كه -34H معادل -52 دسيمال مي باشد
|
با توجه به جدول بالا كه به وضوحنشان داده شده كه چطوري اعدا منفي از هم تفريق مي شود فهميديم كه اگر عدد ما علامت دار باشد در نتيجه 7 بيت اول مقدار عدد مي شود و بيت آخر علامت عدد مي شود كه اين بيت آخر روي پرچم كري تاثير دارد يعني اينكه اگر اين بيت 1 شود در اصل پرچم كري يك شده و وقتي كري 1 شود CPU متوجه مي شود كه نتجه محاسبه منفي بود.
حال به ادامه حل مثال بر مي گرديم:
عدد 96 از 62 كم شد و پرچم كري هم به علت منفي بودن عمليات 1 شد حال در مرحله بعد CPU عدد 12 را از 27 كم مي كند و نتيجه هر چه CPU به كري نگاه مي كند و متوجه مي شود كه در محاسبه قبلي كري يك شده و الان بايد اين نتيجه (يعني دو عدد آخري) را از يك كم كند و اين كار را انجام مي دهد و در نهايت اين محاسبه را به صوت دقيق انجام داده و نتايج را در ثبات هاي مربوطه قرار مي دهد.
پس 62-96=CCH=R1 و 27-12-1=14H=R2 كه كل نتيجه برابر با 14CCH
دستوررات ضرب و تقسيم
دستور MUL AB
اين دستور كه قالب آن به صورت بالا مي باشد دستور ضرب مي باشد اين دستور تنها با ثبات هاي A,B كار مي كند يعني اينكه ما بايد ابتدا دو داده اي قرار است در هم ضرب شوند را در ثبات هاي A و B قرار داده و سپس از اين دستور استفاده كنيم.
مثال دو عدد 40 و 20 را در هم ضرب كنيد؟
MOV A,#40H
MOV B,#20H
MUL AB
دستور DIV AB
اين دستور كه قالب آن به صورت بالا مي باشد دستور تقسيم مي باشد اين دستور تنها با ثبات هاي A,B كار مي كند يعني اينكه ما بايد ابتدا دو داده اي قرار است بر هم تقسيم شوند را در ثبات هاي A و B قرار داده و سپس از اين دستور استفاده كنيم.
مثال عدد 40 را بر 20 تقسيم كنيد؟
MOV A,#40H
MOV B,#20H
DIV AB
كاربرد دستور تقسيم در مبدل هاي آنالوگ به ديجيتال است كه با تقسيم كردن بر 10 مقدار آنالوگ به دهدهي تبديل مي شود. و موارد ديگر…