خلاصه آموزشی از درس اسمبلی
جلسه اول
مبانی کامپیوتر
1. مبنای 10 Decimal : (0 تا 10)
2. مبنای 2 Binary : (0 و 1)
3. مبنای 8 Octal : (0 تا 7)
4. مبنای 16 Hexa Decimal : (0 to 9 , A,B,C,D,E)
1. برای تبدیل مبنای 10 به کلیه مبناها از تصمیمات متوالی بر پایه مبنای مقصد استفاده می کنیم..
1. در عملیات زیر باقیمانده های عدد را بر مبنای 2 بدست می آوریم.
a. 341%2=1
b. 170%2=0 عدد 170 نتیجه تقسیم 341 بر 2 است.
c. 85%2=1 عدد 85 نتیجه تقسیم 170 بر 2 است.
d. 42%2=0 ....
e. 21%2= 1 ....
f. 10%2= 0 ...
g. 5%2=1 ....
h. 2%2=0 ....
1 (عدد یک خارج قسمت آخرین تقسیم مورد نظر است.یعنی نتیجه تقسیم 2 بر 2)
حالا از پایین به بالا شروع به نوشتن جواب ها می کنیم.
(341)10 = (1,0101,0101)2
2. در عملیات زیر نشان می دهیم چگونه مبنای 8 عدد 341 را بدست می آوریم.
a.341 % 8 = 5
b. 42 % 8 = 2 عدد 42 از تقسیم 341 بر 8 بدست اومده
c. 5 (عدد پنج خارج قسمت تقسیم 42 بر 8 است.)
حالا از پایین به بالا اعداد را می نویسیم.
(341)10 = (525)8
3. در عملیات زیر نشان می دهیم چگونه مبانی 16 عدد 341 را بدست می آوریم.
a.341%16 = 5
b. 21%16 = 5 عدد 21 خارج قسمت تقسیم 341 بر 16 هست.
c. 1 ( خارج قسمت تقسیم 21 بر 16 ، 1 می شود. )
حالا از پایین به بالا اعداد را می نویسیم. عددی که بدست می آید بر مبنای 2 خواهد بود.
(341)10 = (155)16
2. تبدیل کلیه مبانا ها به مبنای 10
(an … a2 a1 a0 )r = ( T )10
T = an * rn + an-1 * rn-1 + … + a2 * r2 + a1 * r1 + a0 * r0
Ex : ( 11010100 )2 = ( 212 )10
(1 * 27 ) + ( 1 * 26 ) + ( 0 * 25 ) + ( 1 * 24 ) +( 0 * 23 ) + ( 1 * 22 ) + ( 0 * 21 ) + ( 0 * 20 ) = 128 + 64 + 16 +4 = 212
Ex : ( 324 )8 = (212)10
3 * 82 + 2 * 81 + 4 * 80 = 192 + 16 + 4 = 212
Ex : ( D4 )16 = (212)10
D * 161 + 4 * 160 = ( 13 * 16 ) + 4 = 208 + 4 = 212
3. تبدیل مبنای 2 به 8 و بالعکس
مبنای 2 |
مبنای 8 |
111 |
7 |
110 |
6 |
101 |
5 |
100 |
4 |
011 |
3 |
010 |
2 |
001 |
1 |
000 |
0 |
Ex : ( 730546 )8 = ( 111, 011 , 000 , 101 , 100 , 110 )2
Ex : ( 001 , 011 , 001 , 001 , 001 , 111 , 001 , 000 , 001 )2 = ( 131117101 )8
4. تبدیل مبنای 2 به 16 و بالعکس
مبنای 2 |
مبنای 16 |
1111 |
15 – F |
1110 |
14 – E |
1101 |
13 – D |
1100 |
12 – C |
1011 |
11 – B |
1010 |
10 – A |
1001 |
9 |
… |
… |
0000 |
0 |
Ex : ( 7E5FA9 )16 = ( 0111 , 1110 , 0101, 1111 , 1010 , 1001 )2
Ex : ( 0110 , 0100 , 0011 , 1010 , 1000 , 1110, 1101 )2 = ( 643A8ED )16
شکل تبدیل مبنا ها به یکدیگر
5. تبدیل اعداد اعشاری مبنای 10 به مبنای 2
برای تبدیل اعداد اعشاری مبنای 10 به مبنای 2 قسمت صحیح مثل تبدیل مبنای 10 به 2 هست. اما برای قسمت اعشاری باید مقدار اعشاری را در 2 ضرب کنیم. سپس قسمت صحیح جواب را می نویسیم ( 0 یا 1 ) . دوباره قسمت اعشاری ( جدید ) را در 2 ضرب می کنیم . در جواب بدست اومده قسمت صحیح ( 0 یا 1 ) را جدا می کنیم و برای جواب می نویسیم. این کار تا وقتی که قسمت اعشاری ، صفر شود ، ادامه می دهیم. ( البته اینجا خیلی مهم نیست و تا بعد از بدست آوردن 4 یا 5 رقم اعشار ضرب کردن را ادامه نمی دهیم. )
· در مثال زیر قسمت های صحیح را از بالا به پایین می نویسیم.
· اگر عددی در مراحل ضرب تکرار شود آن عدد را گرد می کنیم.
( 35.247 )10 = ( 10,0011 . 0011 )2
0.247 * 2 = 0.494 , اینجا جواب می شود : صفر، قسمت اعشاری که 494 هست را در 2 ضرب می کنیم.
0.494 * 2 = 0.988 , جواب صفر می شود ، قسمت اعشاری که 988 است را در 2 ضرب می کنیم.
0.988 * 2 = 1.976 , جواب یک می شود، قسمت اعشاری را جدا می کنیم و در 2 ضرب می کنیم.
0.976 * 2 = 1.952 ,جواب یک می شود، قسمت اعشاری را جدا می کنیم و در 2 ضرب می کنیم.
6. اعداد اعشاری مبنای 2 به مبنای 10
برای تبدیل اعداد اعشاری مبنای 2 به مبنای 10 قسمت صحیح مثل تبدیل مبنای 2 به 10 هست. اما برای قسمت اعشاری باید مقدار اعشاری را از سمت چپ به راست با توان منفی شماره گذاری کنیم. ( در قسمت صحیح از سمت راست به چپ با توان مثبت بود ).
( 1011011 . 01001 )2 = ( 91 . 28 )10
قسمت اعشاری : ( 0 * 2-1 ) + ( 1 * 2-2 ) + ( 0 * 2-3 ) + ( 0 * 2-4 ) + ( 1 * 2-5 ) = 0.28
قسمت صحیح : (1 * 26 ) + (0 * 25 ) + (1 * 24 ) + (1 * 23 ) + (0 * 22 ) + (1 * 21 ) + (1 * 20 ) = 91
تعداد بیت ها
هر بیت دارای 2 حالت ( 0 یا 1 ) هست. پس تعداد حالات در n بیت می شود : 2n.
مثال : 28 : 256 ( 0 تا 255 )
نکته : هر 8 بیت 1 بایت است.
مثال : عدد 50735 نیازمند چند بایت حافظه برای ذخیره سازی است؟
50735 / 256 = 198 ( باقیمانده می شود 47 )
عدد 50735 نیازمند 198 + 1 ( 1بایت برای این هست چون که 47 بیت باقیمانده وجود دارد) بایت برای ذخیره سازی بر روی حافظه هست.
حافظه
1. اصلی
a. ROM - Random Only Memory - حافظه فقط خواندی
i. Post : تست سخت افزار
ii. Bios : اطلاعات ورودی و خروجی
iii. Loader : بارگذارنده سیستم عامل
b. RAM - Random Access Memory - حافظه با دسترسی تصادفی
i. هر برنامه ای جهت اجرا به درون این حافظه منتقل می شود.
ii. با قطع جریان برق پاک می شود.
c. Register - ثبات : درونCPU قرار دارد.
2. جانبی
ماندگاری اطلاعات دارد.
نکته: هر زبانی که به زبان انسان نزدیکتر باشد زبان سطح بالاتر و هر چه به زبان ماشین نزدیکتر باشد سطح پایین تر نام دارد.
ثبات : حافظه های 2 بایتی درون CPU
1. ثبات سگمنت
1. ثبات سگمنت پشته SS : حاوی آدرس شروع سگمنت پشته
2. ثبات سگمنت دادهDS : حاوی آدرس شروع سگمنت داده
3. ثبات سگمنت کد CS : حاوی آدرس شروع سگمنت کد
4. ثبات سگمنت اضافی ES : حاوی آدرس شروع سگمنت اضافی
2. ثبات عمومی
شماره |
ثبات عمومی |
>>> |
|
|
توضیحات |
1 |
Ax |
>>> |
Ah |
Al |
Ax به دوقسمت ah (قسمت با ارزش)و al (قسمت کم ارزش) تقسیم می شود. |
2 |
Bx |
>>> |
Bh |
Bl |
Bx به دوقسمت bh (قسمت با ارزش) و bl (قسمت کم ارز.ش) تقسیم می شود. |
3 |
Cx |
>>> |
Ch |
Cl |
Cx به دو قسمت ch (قسمت با ارزش) و cl (قسمت کم ارزش) تقسیم می شود. |
4 |
Dx |
>>> |
Dh |
Dl |
Dx به دو قسمت dh (قسمت با ارزش) و dl (قسمت کم ارزش) تقسیم می شود. |
نکته : به جای x در ثبات های عمومی h به معنی high و l به معنی low است. فرق h و l در ارزش مقداری آنهاست. ارزش h (256 * ah) و ارزش L (1 * al) است. همچنین L و h هر کدام 1بایت حافظه را اشغال می کنند.
مثال در مورد ثبات عمومی : ارزش ثبات ax چقدر است؟
Al |
Ah |
7 |
3 |
3 * 256 + 7 = 775
3. کنترل - IP : این ثبات همواره حاوی offset دستور اجرایی بعدی در سگمنت کد است.
4. وضعیت - Flags
1. Carry - C : به معنی رقم نقلی است و این بیت حاوی رقم نقلی از آخرین بیت در انجام محاسبات و یا شیفت است.
2. Parity-P : به معنی توازن است و این بیت برای کنترل صحت اطلاعات به کار می رود.
3. Auxiliary - A : به معنی رقم نقلی کمکی است. چنانچه در محاسبات 8 بیتی رقم نقلی در بیت شماره 3 ایجاد شود این بیت برابر 1 خواهد شد .
4. Zero - Z : به معنی صفر است و چنانچه نتیجه اعمال محاسباتی یا مقایسه برابر صفر باشد این بیت برابر 1 خواهد بود.
5. Sign - S : به معنی علامت است . اگر نتیجه عملیات منفی باشد این بیت برابر 1 خواهد شد و در صورتی که مثبت شود این بیت برابر صفر خواهد شد.
6. Trap - T : به معنی قدم به قدم است . چنانچه این بیت برابر با یک باشد اجرای برنامه به صورت دستور به دستور انجام می شود.
7. Interrupt - I : به معنی وقته است . اگر این بیت 1 باشد سیستم به وقفه ها پاسخ می دهد.
8. Direction-D : به معنی جهت است. و این بیت برای کنترل اعمال رشته ای مانند مقایسه یا انتقال رشته ای که بیش از یک کلمه اند به کار می رود . اگر این بیت برابر با یک باشد عمل مقایسه یا شیفت از سمت راست به چپ و گرنه عمل مقایسه یا شیفت از چپ به راست انجام می شود.
9. Overflow - O : به معنی سرریز است . چنانچه در انجام محاسبات آخرین بیت به دلیل سرریز شدن از بین برود این بیت برابر با 1 خواهد شد.
Segment : به ناحیه های 64KB از حافظه های RAM که برای اهداف خاص مورد استفاده قرار می گیرد - ناحیه ای از حافظه است که آدرس شروع آن بر 16 قابل قسمت است.
1. پشته(stack) : این سگمنت حاوی آدرس برگشت از توابع و زیر برنامه ها است و به طور کلی هر نوع اطلاعاتی که برای فراخوانی زیر برنامه ها لازم است در این سگمنت قرار می گیرد.
2. داده(Data) : برای تعریف داده ها و متغیر ها و ناحیه های کار برنامه از این ناحیه استفاده می شود.
3. کد(Code) : دستورالعمل های زبان ماشین که باید اجرا شوند در این سگمنت قرار می گیرد.
4. اضافی(extra) : برای انجام عملیات خاص همچون کار بر روی رشته ها و ... .
نکته : افست :آدرس مکان مورد نظر از ابتدای ناحیه سگمنت را آفست می گویند.
نکته : سگمنت در RAM و ثبات در CPU قرار می گیرد.
نکته : ثبات های IP و CS برای تعیین آدرس دستور بعدی به کار می روند.
سگمنت :
1. پشته
2. داده
3. کد
4. اضافه
ثبات:
1. عمومی
a. Ax
b. BX
c. CX
d. DX
2. سگمنت
a. SS : حاوی آدرس شروع سگمنت پشته است.
b. DS : /////////////////////////////////////// دیتا ///////////.
c. CS : ///////////////////////////////////////////کد ////////////.
d. ES : //////////////////////////////////////////// اضافه ///////.
3. ایندکس
a. BP : این ثبات حاوی offset ای از سگمنت S است.
b. SP : این ثبات حاوی offset بالای پشته است.
c. SI : این ثبات برای عملیات رشته ای مورد استفاده قرار می گیرد.
d. DI : این ثبات آدرس رشته مقدار را در عملیات رشته ای نگهداری می کند.
مقدمات زبان برنامه نویسی اسمبلی
قالب اصلی برنامه اسمبلی
a. تعریف سگمنت پشته
b. تعریف سگمنت داده
c. تعریف سگمنت کد
شیوه های تعریف سگمنت
a. روش اول
تعریف سگمنت پشته
....
تعریف سگمنت داده
.....
تعریف سگمنت کد
End نام زیر برنامه
نام سگمنت |
Segment |
*پارامترها |
..... |
.... |
.... |
محتویات سگمنت |
|
|
.... |
|
|
نام سگمنت |
Ends |
|
*پارامتر ها
1. پارامتر تنظیم( align ) : مرزی که سگمنت باید از آنجا شروع شود و مشخص می کند.
a. Byte یعنی بر یک بخش پذیر هستند. آدرس سگمنت می تواند از هر بایتی شروع شود.
b. Word یعنی بر دو بخش پذیر هستند. آدرس سگمنت می تواند از هر آدرسی که زوج باشد شروع شود.
c. PARAیعنی بر 16 بخش پذیر هستند. آدرس سگمنت می تواند از هر جایی که بر 16 قابل قسمت باشد شروع شود.
d. PAGE یعنی بر 256 بخش پذیر هستند.آدرس سگمنت می تواند از هر جایی که بر 256 قابل قسمت باشد شروع شود.
نکته : اگر در تعریف سگمنتی پارامتر تنظیم مشخص نشود سیستم به پیش فرض مقدار PARA را در نظر می گیرد.
2. پارامتر ترکیب( combine ) : اگر بخواهیم پس از پیوند برنامه ها سگمنت ها با هم ترکیب شوند می توانیم از این پارامتر استفاده کنیم.
a. NONE یعنی کسی حق استفاده ندارد. سگمنت ها به صورت منطقی از همدیگر جدا هستند.
b. Public یعنی همه حق استفاده دارند. سگمنت های مشابه به طور متوالی در حافظه قرار می گیرند.
c. Common : سگمنت های مشابه از یک ناحیه به طور اشتراکی استفاده می کنند.
d. Stack یعنی فقط پشته حق استفاده دارد. پشته به صورت عمومی در نظر گرفته می شود.
3. پارامتر کلاس : برای تعریف کلاس سگمنت از این پارامتر استفاده می شود.
a. 'Stack' : برای تعریف کلاس سگمنت پشته استفاده می شود.
b. 'data' : برای تعریف کلاس سگمنت دیتا استفاده می شود.
c. 'code' : برای تعریف کلاس سگمنت کد استفاده می شود.
d. 'Extra.' : برای تعریف کلاس سگمنت اضافی استفاده میشود.
پارامتر به شکل زیر تعریف میشود
مثال :
StackS |
SEGMENT |
Byte |
NONE |
'STACK' |
DataS |
SEGMENT |
Word |
Public |
'Data' |
مثال:
برنامه ای بنویسید که به متغیرهای p و S مقادیر 10 و 15 را انتساب داده و با استفاده از دستورات برنامه نویسی مقادیر دو متغیر را عوض کند.
Stack segment para public 'stack'
Db 128 dup(' ')
Stack end s
Data segment public 'data'
P db 10
S db 15
Data end s
CD Segment public 'code'
Mp proc far
Assume DS: data , cs : cd, ss : stk
Mov ax, data ;انتقال آدرس سگمنت داده به ثبات سگمنت داده
Mov ds, ax
Mov ah, p
Mov cl, s
Mov s, ah
Mov p, cl
Mov ah, 4ch
Int 21h
Mp endp
Cd ends
End mp
تعریف روال زیر برنامه - procedure
نام زیر برنامه proc far ( یا near)
.........
.........
نام زیر برنامه endp
Assume SS:نام سگمنت پشته , DS:نام سگمنت داده , CS:نام سنگمنت کد, ES:نام سگمنت اضافی
برای مرتبط نمودن سگمنت های تعریفی با ثباتهای متناظر آنها استفاده می شود.
مثال: برنامه ای بنویسید که دو عدد یک رفمی را از ورودی بگیرد و حاصل جمع آنها را در متغیر حافظه قررا دهد.
Stk segment public 'stack'
Db 128 dup(' ')
Stack ends
Data segment public 'data'
M db ?
Data ends
Code segment public 'code'
Mp proc far
Assume ds: data, cs: cd, ss: stk
Mov ax, data
Mov ds, ax
Mov ah, 01h
Int 21h
Mov dh, al
Mov ah, 01h
Int 21h
Mov cl, al
Sub dl, 48
Sun cl, 48
Add dh, cl
Mov m , cl
Mov ah, 4ch
Int 21h
Mp ends
Cd ends
End mp
d
a. روش دوم(توی کلاس از این روش استفاده می کنیم)
تعریف سگمنت به روش استفاده از مدل های حافظه
.model نوع مدل (small)
.stack میزان حافظه مورد نیاز( بر حسب بایت)
.data
….
تعریف متغیر ها
….
.code
نام برنامه اصلی |
Proc |
Far |
کدهای برنامه
نام زیر برنامه اصلی |
Endp |
…..
End نامر زیر برنامه اصلی
نکته : تعریف سگمنت پشته و داده می تواند جابجا انجام شود، اما تعریف سگمنت کد حتما باید بعد از این دو سگمنت باشد.
تعریف زیر برنامه
تعریف زیر برنامه |
proc |
پارامتر |
|
.... ما بقی کدها ... |
|
|
|
نام زیر برنامه |
endp |
|
|
پارامتر
Far |
این زیر برنامه می تواند توسط زیربرنامه ای موجود در سگمنت هایی دیگر فراخوانی شوند. |
Near |
این زیر برنامه توسط زیربرنامه ای که در همین سگمنت قرار دارد فراخوانی شود. |
نکته : زیر برنامه اصلی برنامه از نوع far می باشد. این زیر برنامه توسط سیستم عامل فراخوانی می شود.
انواع متغیر ها در اسمبلی
1. DB(برای متغیر های یک بایتی)
2. DW(برای متغیر های 2 بایت)
3. DD(برای متغیر های چهار بایتی)
تعریف متغیر ها در اسمبل
نام |
نوع |
مقدار اولیه |
A |
Db |
15 |
A |
Db |
? |
A |
Dw |
? |
تعریف رشته ها
نکته : علامت '$' نشان گر پایان یافتن رشته مورد نظر است.
نکته : رشته ها را فقط با db تعریف می کنیم.
Dup = duplicate = تکثیر کردن
نام |
نوع |
ادامه |
|
S |
Db |
'reshte' +'$' |
برای تعیریف رشته فقط باید از db استفاده کنیم. |
S |
Db |
'*************' +'$' |
یک رشته که چندتا '*'چاپ می کند |
S |
Db |
20 dup ('*') + '$' |
عمگر dup برای چاپ یک تعداد خاص از یک کاراکتر خاص استفاده می شود. |
P |
Equ |
3.14 |
برای تعریف مقدار های ثابت |
سوال : هر کاراکتر به یک بایت حافظه نیاز دارد. پس چطور ممکنه که رشته ای مثل چند ستاره ذخیره شود؟
جواب : در واقع فقط کاراکتر اول ذخیره می شود .
جلسه چهارم
تعریف دستورات :
Mov |
عملوند 1 |
عملوند 2 |
عملوند 2 را درون عملوند 1 می ریزد |
شرایط عملنوندها برای عملگر های 2 عملوندی
متغیر حافظه |
متغیر حافظه |
ثبات |
ثبات |
ثبات |
عملوند 1 |
مقدار ثابت |
ثبات |
مقدار ثابت |
متغیر حافظه |
ثبات |
عملوند 2 |
مثال:
p db 5
S db 112
---------------
Mov |
Al, ch |
ص |
Mov |
Bl, p |
ص |
Mov |
s, dl |
ص |
Mov |
p,s |
غ - دو متغیر حافظه |
Mov |
Cx,s |
غ- متغیر یک بایتی را نمیتوان درون متغیر دو بایتی ریخت. |
Mov |
7,p |
غ - نمی توان متغیر را درون مقدار ثابت ریخت |
Mov |
15, al |
غ |
نکته :
مثال : برنامه ای بنویسید که مقدار 5 را به p و مقدار 112 را به متغیر s انتصاب دهد و به وسیله ی برنامه نویس مقادیر S و P را تعویض کنید.
.model small
.stack 128
.data
s db 112
P db 5
.code
MP proc far
Mov ax, @data - این خط و خط زیرین برای قرار دادن ادرس سگمنت داده در ثبات سگمنت بکار می رود
Mov ds, ax
Mov bl,s
Mov dh, p
Mov s, dh
Mov p, bl
Mov ah,4ch
Int 21h - برای خاتمه برنامه و انتقال کنترل به سیستم عامل
MP endp
End MP
Mov ah, 10 - عدد 10 بر مبنای دهدهی
Mov ah, 10b - عدد 10 بر مبنای 2
Mov ah,10o - عدد 10 بر مبنای اکتال است.
Mov ah, 10h - عدد 10 بر مبنای شانزده دهی
Mov ah,ceh - این اشتباه است زیرا کامپایلر سی.ای.اچ را متغیر در نظر می گیرد . برای این که این متغیر را به شانزده دهی تبدیل کنیم باید قبل از سی.ای.اچ یک صفر بگزاریم.
Mov ah, 0ceh
تعدادی از دستورات مهم
Inc |
عملوند 1 |
· |
مقدار یک را به عملوند اضافه می کند |
Dec |
عملوند 1 |
· |
مقدار یک را از عملوند کم می کند |
add |
عملوند 1 |
عملوند2 |
عملوند 2 را به عملوند 1 اضافه می کند و نتیجه را درون عملوند 1 می ریزد |
Sub |
عملوند 1 |
عملوند2 |
عملوند 1 را از عملوند 2 کم می کند و نتیجه را درون عملوند 1 می ریزد(عملوند2- عملوند1) |
Neg |
عملوند |
|
مقدار عملوند را در منفی 1 ضرب می کند و نتیجه را در عملوند می ریزد. |
Not |
عملوند |
|
تمامی یک های مبنی 2 عملوند را به صفر و تمامی صفر ها را به یک تبدیل می کند. |
نکته : هر جا عملوند را استفاده می کنیم ، این عملوند می تواند متغیر حافظه یا ثبات باشد .
کاراکتر |
کد |
0 |
48 |
1 |
49 |
2 |
50 |
3 |
51 |
4 |
52 |
5 |
53 |
6 |
54 |
7 |
55 |
8 |
56 |
9 |
57 |
Enter |
13 |
نکته : به هنگام اجرای برنامه وقتی که کاربر یک عدد را وارد می کند، کامپیوتر کد اسکی کد را می گیرد نه خود عدد را. پس ما مجبوریم معادل عدد مورد نظر را بدست بیاوریم. برای این کار کد کاراکتر را منهای 48 می کنیم. و بعد از اجرای عملیات بر عدد مورد نظر ، برای چاپ عدد مورد نظر باید آن عدد را با عدد 48 جمع کنیم.
48 - کدکاراکتر رقم <<< معادل عددی رقم
48 + معدل عددی رقم <<< کد کاراکتر رقم
مثال :برنامه بنویسید که دو مقدار دلخواه را به ثبات های al و cl نسبت دهد. و بدون استفاده از هر گونه متغیر حافظه و یا ثبات دیگر مقدار این دو ثبات رو جابجا کند.(برای ظرف کمکی استفاده نکنیم)
الگوریتم:
1. a<<<5
2. b<<<12
3. a<<< a + b
4. b<<< a - b
5. a <<< a - b
.model small
.stack 128
;data - توی اسمبلی سمی کالن نشانه کامنت است.
.code
MP proc far
Mov al, 5
Mov cl,12
Add al,cl
Mov ah,al
Sub al,cl
Mov cl,al
Mov al,ah
Sub al,cl
Mov ah,4ch
Int 21h
MP endp
End MP
جلسه پنجم
وقفه ها Interrupt
روند اجرای یک وقفه
وقفه |
تابع: |
هدف: |
ورودی : |
خروجی: |
21h |
4ch |
خاتمه برنامه و انتقال کنترل به سیستم عامل |
4ch : ah |
ندارد |
21h |
01h |
دریافت کاراکتر به همراه چاپ کاراکتر |
01h : ah |
Al : کد کاراکتر خوانده شده |
21h |
02h |
چاپ کاراکتر |
02h : ah - dl : کد کاراکتر مورد نظر |
ندارد |
21h |
08h |
دریافت کاراکتر بدون چاپ کاراکتر دریافتی |
Ah : 08h |
|
1. برنامه ای بنویسید یک کاراکتر را بگیرد و 3 بار آن را چاپ کند.
.model small
.stack 64
.data
.code
fashooMP proce far
Mov ah, 01h
Int 21h
Mov ah, 02h
Mov dl, ah
Int 21h
Int 21h
Int 21h
Mov ah, 4ch
Int 21h
fashooMP endp
End fashooMP
2. برنامه ای بنویسید که یک کاراکتر را از ورودی بگیرد و کاراکتر قبلی ، کاراکتر بعدی و کاراکتر قبلی آن را چاپ کند.
.model small
.stack 64
.data
.code
fashooMP proc far
Mov ah, 08h
Int 21h
Mov dl, al
Dec dl
Mov ah, 02h
Int 21h
Inc dl
Int 21h
Inc dl
Int 21h
Mov ah,4ch
Int 21h
fashooMP endP
End fashooMP
جلسه ششم
نکته : سطر های مانیتور 0 تا 24 است. و تعداد ستون ها 0 تا 79 هست. (شماره ستون ، شماره سطر)
چند وقفه :
وقفه |
تابع: |
هدف: |
ورودی : |
خروجی: |
10h |
02h |
انتقال مکان نما |
Ah : 02h Bh : شماره صفحه(صفر) Dh : شماره سطر Dl : شماره ستون |
ندارد |
21h |
09h |
چاپ رشته |
Ah : 09h DX : آدرس متغیرهای رشته
|
ندارد |
21h |
0Ah |
دریافت رشته |
Ah : 0Ah DX : آدرس لیست پارامتر |
|
10h |
06h |
پاک کردن صفحه نمایش |
Ah : 06h Al : تعداد خطوط Ch : شماره سطر گوشه بالا سمت چپ Cl : شماره ستون گوشه بالا سمت چپ Dh : شماره سطر گوشه پایین سمت راست Dl : شماره ستون گوشه پایین سمت راست Bh : صفت محدوده |
ندارد |
بدست آوردن آدرس متغیر
2 راه دارد :
Mov |
ثبات 2 بایتی |
Offset متغیر |
LEA |
ثبات 2بایتی |
متغیر |
تعریف لیست پارامتر در سگمنت داده
نام لیست پارامتر |
Label |
Byte |
نام متغیر حاوی حداکثر طول |
Db |
حداکثر طول |
نام متغیر حاوی طول واقعی |
Db |
? |
نام متغیر حاوی رشته |
Db |
حداکثر طول dup(' ') + '$' یا حداکثر طول dup(?) + '$' |
سوال 1 : برنامه ای بنویسید که پیام in the name of GOD در مختصات (2, 30) چاپ نماید. سپس از مختصات (5,20) رشته ای حد اکثر به طول 17کاراکتر دریافت نموده و در مختصات (10, 50) پیام "your text is: " چاپ نماید و بعد از آن رشته دریافتی را چاپ کند. و برای پایان منتظر دریافت کلیدی شود .
الگوریتم حل مسئله :
1. انتقال مکان نما به (30و 2)
2. چاپ رشته in the ...
3. انتقال مکان نما به (20و 5)
4. دریافت رشته حداکثر 17کاراکتری
5. انتقال مکان نما(50و 10)
6. چاپ رشته your ...
7. چاپ رشته دریافتی
8. دریافت کاراکتر
نکته :
.model small
.stack 128
.data
Msg1 db 'in The name of GOD' + '$'
; tartibe list parameter
List1 label byte
Max db 17
Len db ?
Reshte db 17 dup(' ') + '$'
Msg2 db 'your text is:$'
.code
Main proc far
Mov ax, @data
Mov ds, ax
Mov ah, 02h
Mov bh, 0
Mov dh, 2
Mov dl, 30
Int 10h
Mov ah, 09h
Lea DX, msg1
Int 21h
Mov ah, 02h
Mov bh, 0
Mov dh, 5
Mov dl, 20
Int 10h
Mov ah, 0ah
Lea dx, list1
Int 21h
Mov ah, 02h
Mov bh, 0
Mov dh, 10
Mov dl, 50
Int 10h
Mov ah, 09h
Mov dx, offset msg2
Int 21h
Mov ah, 09h
Lea dx, reshte
Int 21h
Mov ah, 08h
Int 21h
Mov ah,4ch
Int 21h
Main endp
End main
جلسه هفتم
وقفه |
تابع: |
هدف: |
ورودی : |
خروجی |
10h |
06h |
پاک کردن صفحه نمایش |
Ah : 06h Al : تعداد خطوط Ch : شماره سطر گوشه بالا سمت چپ Cl : شماره ستون گوشه بالا سمت چپ Dh : شماره سطر گوشه پایین سمت راست Dl : شماره ستون گوشه پایین سمت راست Bh : صفت محدوده |
ندارد |
Bh یک بایت هست. هر بایت از 8 بیت تشکیل شده. در وقفه بالایی هر کدام از این بیت ها نقشی دارند که پایین تو ضیح داده شده است :
مثال : عدد زیر یک بایت هست. این عدد را به bh به صورت باینری ، اکتال ، شاندزده دهی و دسیمال انتصاب کنید.
10100111
Mov bh, 10100111b ; باینری
Mov bh, 247o ; اکتال، برای نوشتن اکتال باید 3 تا 3تا از سمت راست جدا کنیم.
Mov bh, 0a7h ; هگزا، در هگزا 4عدد 4عدد از سمت راست جدا می کنیم.
Mov bh, 167 ; دسیمال
نکته : چشمک زن و شدت نور را تا وقتی که توی مسئله گفته نشده را نباید چاپ کنید.
مثال : برنامه ای بنویسید که پرچم ایران را چاپ کند.
.model small
.stack 128
.data
.code
fashooMP proc far
mov ah, 06h
mov al, 8
mov bh, 10101000b
mov ch, 0
mov cl, 0
mov dh, 7
mov dl, 79
int 10h
mov ah, 06h
mov al, 8
mov bh, 11111000b
mov ch, 8
mov cl, 0
mov dh, 15
mov dl, 79
int 10h
mov ah, 06h
mov al, 8
mov bh, 11001000b
mov ch, 16
mov cl, 0
mov dh, 24
mov dl, 79
int 10h
mov ah,08h
int 21h
mov ah, 4ch
int 21h
fashooMP endp
end fashooMP
مثال : برنامه ای بنویسید که صفحه نمایش را به صورت کامل با رنگ پیش فرض پاک کند. سپس پیام )اسم و فامیل خود ) را در مختصات (3, 25) چاپ کند. سپس صفحه مختصات را در ( 4و 10) تا ( 70و 20) پاک کند.(زمینه سبز، قلم قرمز، چشمک زن) . سپس در مختصات ( 20و 10) پیام Enter your text: را چاپ کند. سپس رشته ای حدکثر به طول 30 کاراکتر را دریاف نماید. سپس در مختصات (50و 15) رشته your text is: را چاپ کند و پس از آن رشته دریافت شده را چاپ کند و بعد از آن یک کاراکتر رادریافت کند که چاپ نشود.
توضیحات دستورات Mul و Div
ضرب: در این دستور ابتدا باید به al مقدار که قصد ضرب کردن آن را داریم بنویسیم. سپس برنامه عملوند2 را د al ضرب می کند و نتیجه را درون ax می گزارد.
Mov al, عملوند1
Mul عملوند2
تقسیم: در این دستور باید ابتدا مقسوم رل درون ax بگزاریم سپس باید بر عدد مورد نظر تقسیم کنیم. خارج قسمت جواب به al ریخته می شود و باقیمانده تقسیم به ah ریخته می شود.
Mov ax, مقسوم
DIV عملوند(مقسوم علیه)
نکته : برای تبدیل مقدار یک بایتی al به دوبایتی ax از دستور CBW استفاده می کنیم.
مثال : برنامه ای بنویسید که دو عدد یک رقمی بگیرد سپس جواب را درون متغیر حافظه بریزد.
.model small
.stack 64
.data
S dw ?
.code
Main proc far
Mov ax, @data
Mov ds, ax
Mov ah, 01h
Int 21h
Sub al, 48
Mov bh, al
Int 21h
Sub al, 48
CBW
Mul bh
Mov s, ax
Mov ah, 4ch
Int 21h
Main endp
End main
جلسه هفتم
دستورات پرش در اسمبلی
1- jmp
اسم پرش |
اسم متغیر |
توضیحات |
Jmp |
برچسب |
برای انتقال کنترل اجرا به محل برچسب |
تعریف برچسب
برچسب: "علامت : بعد از برچسب حتما باید نوشته شود."
نکته :
برچسب را نباید درون دیتا تعریف کنیم. نباید با عدد شروع شود. نباید از ثبات برای اسم برچسب استفاده شود.
مثال:
......
برچسب:
…..
….
….
Jmp برچسب
2- CMP
اسم پرش |
عملوند 1 |
عملوند 2 |
توضیحات |
CMP |
عملوند 1 |
عملوند2 |
برای مقایسه عملوند 1 و عملوند 2 است. |
نکته : عملوند 1 منهای عملوند 2 می شود. و تاثیرات نتیجه به ثبات پرچم ریخته می شود.
نتیجه مقایسه عملوند ها به دو ثبات پرچم ریخته می شود.
1- SF : اگر نتیجه مقایسه مثبت باشد ، SF صفر میشود. اگر نتیجه مقایسه منفی باشد ، SF یک می شود.
2- ZF : اگر نتیجه محاسبه صفر نباشد ، ZF می شود صفر. اگر نتیجه محاسبه صفر نباشد ، ZF می شود یک.
مثال :
Jmp |
برچسب |
توضیحات |
Js |
برچسب |
پرش به محل برچسب در صورتیکه ، sf= 1 باشد. یعنی نتیجه محاسبه منفی است. یعنی عدد اول از عدد دوم کوچکتر است. |
Jns |
برچسب |
پرش به محل برچسب در صورتیکه ، sf = 0 باشد. یعنی نتیجه محاسبه مثبت است. یعنی عدد اول از عدد دوم بزرگتر یا مساوی است. |
Jz |
برچسب |
پرش به محل برچسب در صورتیکه ، zf = 1 باشد. یعنی نتیجه محاسبه صفر است. یعنی عدد اول با عدد دوم برابر است. |
Jnz |
برچسب |
پرش به محل برچسب در صورتیکه ، zf = 0 باشد. یعنی نتیجه محاسبه صفر نیست. یعینی عدد اول با عدد دوم برابر نیست. |
مثال : برنامه ای بنویسید که دو عدد 1 رقمی را بگیرد و عدد بزرگتر را چاپ کند.
.model small
.stack 64
.code
Main proc far
Mov ah, 01h
Int 21h
Mov bl, al
Int 21h
CMP bl, al
Js l1 "پرش به محل ال.یک در صورتی که اس.دو برابر یک باشد. یعنی نتیجه منفی است. یعنی بی.ال از آ.ال کوچکتر است."
;در صورتی که پرش بالا انجام نشد یعنی شرط بالا غلط است. یعنی بی.ال از آ.ال بزرگتر یا کوچکتر است.
Mov ah, 02h
Int 21h
Jmp l2
L1:
Mov ah, 02h
Mov dl, al
Int 21h
L2:
Mov ah, 4ch
Int 21h
Main enp
End main
مثال : برنامه ای بنویسید که اعداد 0 تا 9 را چاپ کند.
.model small
.stack 64
.code
Main proc far
Mov dl, 48
L1:
Mov ah,02h
Int 21h
Inc dl
Cmp dl, 58
Js l1
Mov ah, 4ch
Int 21h
Main endp
End main
جلسه هشتم
حلقه :
CX |
تعداد دفعات تکرار |
برچسب: |
|
....... بدنه حلقه ........ |
|
Loop |
|
نکته : حلقه loop به صورت اوتوماتیک دستورات زیر را اجرا می کند.
برچسب : dec CX
cmp cx,0
jnz برچسب
مثال : برنامه ای بنوسید که 10 عدد یک رقمی را بگیرد و معدل آنها را چاپ کند.
الگوریتم :
a. شروع
b. 0 <<<< S
c. اعمال زیر را 10 بار انجام شود.
1. A را بگیر
2. S <<<< S + A
d. A <<<< S/10
e. A را چاپ کند.
.model small
.stack 128
.code
Main proc far
Mov bh, 0 ;بی.اچ را برای جمع مجموع اعداد بکار می بریم.
Mov cx, 10
L1:
Mov ah, 01h
Int 21h
Sub al , 48
ADD bh, al
Loop l1
Mov al, bh
CBW
Mov cl, 10
Div cl
Mov ah, 02h
Mov dl, al
Add dl, 48
Int 21h
Mov ah, 4ch
Int 21h
Main endp
End main
مثال : برنامه ای بنوسید که دو عدد را بگیرد و خارج قسمت حاصل تقسیم عدد بزرگتر بر عدد کوچک را چاپ کند.
مثال : برنامه ای بنوسید که تعدادی عدد را دریافت نماید و معدل آنها را چاپ نمیاید. شرط پایان ورود عدد صفر است.
.model small
.stack 64
.code
Main proc far
Mov bh, 0
Mov bl, 0
ls:
Mov ah, 01h
Int 21h
Cmp al,48
Jz lc
Sun al, 48
Add bh, al
Inc bl
Jmp ls
lc:
Mov al, bh
Cbw
Div bl
Add al, 48
Mov dl , al
Mov ah, 02h
Int 21h
Mov ah,4ch
Int 21h
Main endp
End main
مثال : برنامه ای بنوسید که تعدادی عدد مثبت غیر صفر را دریافت نماید و بزرگترین عدد دریافتی را چاپ کند.
.model small
.stack 64
.code
Main proc far
Mov ah, 01h
Int 21h
Mov bh, al
l2:
Mov ah, 01h
Int 21h
Cmp al, 48
Jz l1
Cmp al, bh
Js l2
Mov bh, al
Jmp l2
l1:
Mov ah, 02h
Mov dl,bh
Int 21h
Mov ah, 4ch
Int 21h
Main endp
End main
مثال ها :
a. برنامه ای بنویسید که یک عدد بگیرد و مقسوم علیه های آن را چاپ کند.
.model small
.stack 64
.code
Main proc far
Mov ah, 01h
Int 21h
Sun al,48
Mov bh, al
Mov cl, al
Mov ch, 0
l1:
Mov al, bh
Cbw
Div cl
Jnz l2
Mov dl, cl
Add dl,48
Mov ah, 02h
Int 21h
l2:
Loop l1
Mov ah, 4ch
Int 21h
Main endp
b. End main
c. برنامه ای بنویسید که یک عدد بگیرد و مقسوم علیه های مشترک آن را چاپ کند.
d. برنامه ای بنویسید که یک عدد بگیرد و فاکتوریل آن را در یک متغیر حافظه قرار دهد.
e. برنامه ای بنویسید که عددی را بگیرد که مشخص کند که عدد اول است یا نه؟
f. برنامه ای بنوسید که یکی عدد را بگیرد و مشخص کند که عدد دریافتی عدد کامل است یا خیر؟
مطالب مشابه :
تبدیل مبناها به یکدیگر
تبدیل مبناهای 2 به 8 ، 10 ، 16 تبدیل مبنای 8 به 2 ، 10 ، 16 تبدیل مبنای 10 به 2 ، 8 ، 16 ، و بالاخره تبدیل
آموزش تبدیل مبنا ها
تبدیل مبنای ۱۰ به 16. یعنی عدد مبنای ۸ را ۳ بیت ۳بیت به مبنای ۲ برده سپس ۴ بیت ۴ بیت
اصول تبدیل اعداد
تبدیل از مبنای 2 به 16: برای تبدیل از مبنای 2 به مبنای 16 از ممیزبطرف راست وچپ اعداد را چهار
تبديل مبناها (مبانی سال دوم کامپیوتر)
تبديل مبناي 16 به 10 : 16=>10::: (9d7a)=(10*16^0)+(7*16^1)+(13*16^2)+(9*16^3)=40314
تبديل اعداد مبناي 16 به مبناي 2 در ديباگ
برای تبدیل اعداد مبنای 16 به مبنای 2 در دیباگ به یادگیری چند مورد نیاز داریم . استفاده از فلاگ
برنامه تبدیل مبنای 10 به مبنای 2 (++C & C)
برنامه تبدیل مبنای 10 به مبنای 2 برنامه تبدیل مبنای 10 به مبنای 2 (++c & c) برنامه زبان c:
خلاصه آموزشی از درس اسمبلی
تبدیل مبنای 2 به 16 و اعداد اعشاری مبنای 2 به مبنای 10. برای تبدیل اعداد اعشاری
برچسب :
تبدیل مبنای 16 به 10