Académique Documents
Professionnel Documents
Culture Documents
Editor
asm. ذخیره با نامی با پسوند
Test.asm مثل
R = Rexrved U = Undefined
OF = Overflow ZF = Zero Flag
DF = Direction Flag SF = Sign Flag
IF = Interrupt Flag AF = Auxiliary Carry Flag
TF = Trap Flag PF = Parity Flag
CF = Carry Flag
( :Carry Flagبیت انتقال) معمول ،از محاسبات تاثیر می پذیرد.
برای اعمال جمع و تفریق ازاین بیت ،برای عدد انتقال (رقم نقلی)
استفاده می گردد .در اعمالی مانند Shiftدادن بیتها ،آخرین بیت
Shiftداده شده ،در این بیت قرار می گیرد.
:Parity Flagاز این بیت ،معمول برای اشکال زدایی در انتقال
اطلعات استفاده می شود .به عبارت دیگر ،برای کنترل صحت
اطلعات به کار میرود.
:Auxiliary Carry Flagاز این بیت ،به عنوان بیت جانشین
بیت Carryاستفاده می شود.
:Zero Flagدر صورتی که نتیجه عمل محاسباتی 0شده باشد،
مقدار این بیت 1 ،می شود .در غیر این صورت 0خواهد بود.
:Sign Flagبه معنی علمت و برای بررسی نتیجه عملیات محاسباتی
بکار می رود .یعنی اگر نتیجه عملیات منفی باشد این بیت یا ثبات برابر
با 1وگرنه 0می شود .
:Trap Flagبرای اجرای دستور به دستور برنامه ،از این بیت استفاده
می وشد .اگر این بیت 1 ،باشد ،برنامه به صورت دستور به دستور اجرا
می گردد.
:Interrupt Flagبا استفاده از این بیت ،می توانیم کاری کنیم که وقفه
ها ،فعال یا غیر فعال گردند.
IF=0 وقفه ها غیر فعال IF=1 وقفه ها فعال
:Direct Flagاز این بیت ،معمول برای اعمال رشته ای استفاده می
شود .جهت مقایسه یا انتقال رشته ها را نیز مشخص می کند.
DF=1 Right to Left DF=0 Left to Right
:Overflowدر صورتی که عمل محاسباتی دارای سرریز باشد،
مقدار این بیت 1 ،در غیر این صورت 0خواهد بود.
Dos Bios
وقفه های نرم افزاری:
وقفه هایی اند که در موقع فراخوانی یک برنامه زبان ماشین اجرا
می گردند.
دستور :Int
این دستور ،برای اجرا کردن یک وقفه استفاده می شود .شکل کلی
این دستور به صورت زیر است.
Int شماره وقفه
نکته بسیار مهم:
قبل از اینکه خواسته باشیم از دستور Intاستفاده کنیم بایستی یک
سری از مقادیر اولیه را به بعضی از ثباتها بدهیم ،مخصوصا
ثبات ahکه شماره سرویس وقفه در آن قرار می گیرد.
سرویس ها
00فعال کردن mouse 00
01نشان دادن mouse مثال 01
02 33H 02 وقفه
03 03
… …
(در صورت نیاز دادن مقادیر اولیه به بعضی از ثباتها) =Ah .1شماره سرویس
شماره وقفه = int .2استفاده از دستور
مثال
برنامه ای بنویسید که نام خانوادگی تان را روی صفحه نمایش نشان
دهد( .با ساختار com.در Assemblerنوشته شود)
.Model Tiny,c,os-dos
.286 نکات:
.code
.startup • وقفه ،21hمربوط به صفحه
Jmp l1 نمایش است.
’Str1 db “sharifi”,’$ • آدرس رشته ای که قرار است
L1: چاپ شود در dxقرار می گیرد.
mov dx,offset str1
mov ah,09h • سرویس 09hاز وقفه 21hبرای
int 21h چاپ رشته بکار می رود.
.exit
end • بازگشت به ( dosاگر نباشد
برنامه پس از اجرا قفل می کند).
برنامه اشکال زدایی Debug
وسیله ای است برای اشکال زدایی برنامه ها و یا ایجاد کردن برنامه
هایی به زبان ماشین و همچنین ،اجرای وقفه ها و تغییر دادن ثباتها
در کامپیوترهایی با سیستم عامل Dosیا Windowsکار می کنند.
برای اجرای این برنامه بایستی کلمه Debugرا در جلوی اعلن
سیستم عامل تایپ کنیم .در صورتی که بخواهیم فایلی را اشکال
زدایی نماییم ،نام فایل را در جلوی این دستور نیز ذکر می کنیم.
Debugفقط برای اشکال زدایی فایلهای exe, .com.کاربرد دارد.
پس از ورود به ،Debugخط تیره (_) پایین صفحه نشان دهنده
آمادگی Debugبرای دستورات می باشد.
دستورات مربوط به Debug
:)R )Registerبا استفاده از این دستود ،محتویات ثباتها را به
همراه ؟ بیتهای ثبات Flagمی توان بر روی صفحه نمایش مشاهده
نمود .اما اگر در جلوی این دستور ،نام یک ثبات تایپ شود ،ضمن
نشان دادن محتویات آن ،امکان دادن مقدار جدید را به ما خوهد داد.
-R مثال 1
…… ax = 0000 bx = 0010
…… ds = 4cf2
-R cx مثال 2
مقدار فعلی cx :
:)H )Hex Arithmeticدر صورتی که دو عدد در مبنای هگزاد
دس یمال در جلوی دس تور ذک ر کنی م ،مجموع و اختلف آنها را
عدد دوم عدد اول -H . کند می چاپ و محاسبه
:)L )Loadپس از مشخص کردن نام فایل ،با استفاده از این دستور
می توان فایل را از روی دیسک خوانده و آن را آماده اشکال زدایی
نماییم.
:)Q )Quitازاین دستور ،برای خروج از ،Debugبدون ثبت تغییرات
اعمال شده استفاده می شود.
:)W )Writeبرای ذخیره کردن فایلی که قبل نام آن را مشخص
کرده ایم ،از این دستور استفاده می نماییم .این دستور ،به تعداد بایتی
که تعداد آن در ثبات Cxقرار دارد ،از ابتدای محل برنامه موجود
در Debugبر روی دیسک ذخیره می کنیم.
:0100
دستورات برنامه
-R cx نمایش محتویات ثبات cxو امکان
01F2 تعویض مقدار آن
gتعداد بایت :N
-N test.exe
-W
:)U )Unassembleبا استفاده از این دستور ،می توانیم لیستی (به
زبان اسمبلی) از دستورات موجود در حافظه را مشاهده نماییم( .اگر
برنامهای در حافظه موجود باشد یعنی قبل Loadشده باشد) .شکل
کلی این دستور به صورت زیر است:
-
:)G )Goازاین دستور برای اجرای برنامه ،ازآدرس مشخص شده
استفاده می شود .شکل کلی این دستور به صورت زیرمی باشد:
C:\>Debug
-N Reset.com
-l
-U 100 112 > <=Start address> <=Stop adress
-G = 100 اجرای دستورات از آدرس 100تا
-G = 100 112 آخرین دستور موجود در حافظه.
اجرای دستورات از آدرس 100تا
آدرس .112
:)T )Trapاز این دستور ،برای اجرا کردن و دیدن خط به خط ثباتها
و نواحی استفاده می شود .شکل کلی این دستور به صورت زیر است:
شده10.F10 dw 12.
(?)Dup
F9آرایه ای بطول 4کلمه با مقداراولیه داده
11.F11 db 1,2,3
F7آرایه ای بطول 12کلمه بدون هیچ مقداراولیه ای.
db 4,5,6
:مثال
Mov bx,4f2h
Mov al,25
:دسترسي توسط ثبات 3-
در این نوع دسترسي ،نام یك ثبات را در دستور زبان اسمبلي
ذكر مي كنیم و منظور ما از ذكر نام ثبات ،مقداري است كه
.در آن ثبات قرار دارد
:مثال
Mov ax,dataseg
Mov ds,ax
:دسترسي غیر مستقیم توسط ثبات شاخص یا پایه 4-
...........
……… اگر زير برنامه داشته باشیم در اين قسمت تعريف مي شود
L1:
……..
…….. دستورات اصلي برنامه
.exit0
end
تعریف PSP ))programs segment prefix
( قطعه پیشوند برنامه):
در موقع اجراي یك فایل com.سیستم عامل byte 256،به
عنوان قطعه پیشوند برنامه در نظر مي گیرد و دستورات
مربوط به فایل com.را پس از این قرار مي دهد .
این ناحیه ،اطلعات اساسي در مورد برنامه شامل :حجم
برنامه ،دستورات بازگشت به سیستم عامل ، dos
پارامترهاي همراه برنامه و اطلعات دیگر را در بر دارد .
بنابراین ،تمامي آدرسها در یك فایل com.باید بعد از این
ناحیه قرار بگیرد .
براي اینكه برنامه اسمبلي را ار آدرس 256به بعد شروع كنیم
و 258byteاول را به pspاختصاص دهیم ،در debug
با استفاده از دستور – aو در macro assemblerبا
استفاده از ، org 100hاین 256byteرا براي قطعه
برنامه ذخیره مي كنیم .
اگر یك برنامه اسمبلي را با این ساختار نوشته و به یك فایل
com.تبدیل كنیم ،پس از اتمام برنامه و رسیدن به دستور
، retبرنامه به طور خودكار به pspمراجعه كرده و int
20hرا در ابتداي آن قرار داده ،براي بازگشت به سیستم
عامل dosبه كار مي برد و آن را اجرا مي كند
:تمرین
برنامه اي بنویسید با ساختار com.كه صفحه نمایش را پاك
نموده و در وسط صفحه نمایش
ساختار فایل Exe.:
در ساختار فایل exe.هر یك از segmentها بصورت مجزا
تعریف مي شوند شكل كلي یك برنامه با ساختار exe.
بصورت زیر است:
Stseg segment
( ? ) db 64 dup
( ? )Or dw 32 dup
Stseg ends
(;……………)comments
Dtseg segment
…………..
…………..
Dtseg ends
;…………….. محل تعريف داده هاي مورد نیاز برنامه
Cdseg segment
main proc near
assume
s:cdseg,ds:dtseg,ss:stseg,es:nothing
mov ax,dtseg
mov ds,ax
……………
…………… محل نوشتن دستورات برنامه
……………
mov ah,4ch
Int 21h
main endp
……………
…………... محل نوشتن روالها و زير برنامه ها
cdseg ends
end main
مفهوم دستور :ptr ))pointer
این دستور براي اشاره كردن به محلي از حافظه و مقدار دادن
و یا مقدار گرفتن از آن قسمت مي باشد كه مي تواند انواع
byte,word,dword,qwordرا آدرس دهي كند.
مثال:
D1 db 32h,7fh,99h,932h
D2 dw 67f1h
D3 dd 22229999h
1. Mov ax,wordptr d1
ax=7f23
3. Mov bx,wordptr d1+2
bx=9299
5. Mov al,byteptr d2
D1 db 32h,7fh,99h,932h
al=f1h D2 dw 67f1h
7. Mov ax,wordptr d3 D3 dd 22229999h
ax=9999h
9. Mov ax,wordptr d2
ax=67f1h
11. Mov bx,wordptr d3+2
bx=2222h
دستور: add
از این دستور براي جمع كردن یك مقدار با یك ثبات استفاده مي
شود .شكل كلي این دستور بصورت زیر است :
Add op1,op2
opi=opi+op2
نكته:
Bitهاي ثبات وضعیت زیر با انجام این دستور ،تغییر خواهند
كرد:
O S Z A P C
دستور: adc ))add with carry
با انجام این دستور بیت carryدر عملیات جمع ،شركت
خواهد نمود .
تمرین:
مقدار ثباتهاي al,ahو نشانه هاي sf,cf,of,zfرا پس از
انجام دستورات زیر مشخص كنید :
Mov al,a3h 1 1 Sf=0 zf=0
a 3 Cf=1 of=1
Mov bl,8eh +8 E
Add al,bl al=al+bl 3 1
0011 0001
دستور: sub
از این دستور براي كم كردن یك مقدار از یك ثبات استفاده مي
:شود .شكا كلي این دستور بصورت زیر است
Sub op1,op2 op1=op1-op2
:نكته
با انجام این دستور bitهاي ثبات وضعیت بصورت زیر تغییر
مي كنند:
O S Z A P C
دستور :sbb ))sub with barron
براي تفریق كردن به همراه بیت انتقال از این دستور استفاده
مي شود كه مانند دستور adcعمل مي كند (یك عدد را از
عدد دیگر كم مي كند ) كه در این محاسبه ،بیت انتقال نیز
شركت مي كند .
این دستور براي تفریق كردن متغیرهاي غیر هم طول و یا با
طول بیش از یك كلمه استفاده مي شود .
دستور :Mul , Imul
از این دستور براي عمل ضرب در زبان اسمبلي استفاده مي
.شود .این دو دستور ،فقط داراي یك عملوند مي باشند
، Mulبراي ضرب بدون علمت و ، Imulبراي ضرب با
علمت استفاده مي شود .
این دو دستور ،عملوند را در ثبات alیا ثبات axضرب مي
كنند.
:اگر عملوند یك بایتي باشد
آن را در ثبات alضرب كرده و حاصل را در ثبات axقرار
مي دهد.
اگر عملوند دو بایتي باشد:
آن را در ثبات axضرب كرده و حاصل را در ثبات ax,dx
قرار میدهد .
دو بایت سمت چپ را در dxو دو بایت سمت راست را در
ثبات axقرار مي دهد
شكل كلي این دستور بصورت زیر است:
Mul operand
Or
Imul operand
با انجام این دستور bitهاي زیر از ثبات وضعیت ،تغییر مي
كنند:
O S Z A P C
2(X dw 2051h
Mov ax,f201h
Mul x dx:ax
=ax دو بایت كم ارزش
=dx دو بایت با ارزش
3)Mov ah=00h
Mov al,3bh
Mov bl,ffh
Mul bl dx:ax
=ax دو بايت كم ارزش
=dx دو بايت با ارزش
:نمونه سوال امتحان
اگر xیك متغییر از حافظه به طول 1بایت و yیك متغییر از
حافظه به طول 1wordباشد رابطه زیر را به زبان اسمبلي
شبیه سازي كنید .
Y=x^3-3x^2+7
Mov ax , 00h or sub ax,ax
Mov al,x
Mul x ax=x^2
Mov bx,ax
Mul x ax=x^3
Mov y,ax
Mov ax,bx
Mul 3 ax=3x^2
Mov bx,y
Sub bx,ax bx=x^3-3x^2
Add bx,7 bx=x^3-3x^2+7
Mov y,bx y=x^3-3x^2+7
:تمرین
.ضرب دو عدد 4بایتي به تفكیك متغییرهاي 2بایتي
باقیمانده=R
خارج قسمت=Q
جواب:
Mov al,x
Mov ah,0
Div y
Mov r,ah
Mov q,al
:نمونه سؤال امتحان
اگر c,fدو مكان از حافظه ،هر كدام بطول 1wordباشند ،
عبارت زیر را با دستورات زبان اسمبلي ،شبیه سازي
نمایید.
)C=)5/9(*)f-32
جواب:
C dw ?
F dw -10
Mov ah,5
Idiv 9
Mov bx,f
Sub bx,32
Imul bx ax=(5/9)*(f-
32)
Mov c,ax c=(5/9)*(f-
32)
دستور :inc
یك واحد به متغییر كه ممكن است ثبات باشد یا حافظه اضافه
مي كند .شكل كلي این دستور بصورت زیر است:
Inc mem/reg
دستور :dec
یك واحد از متغییر كه ممكن است ثبات یا حافظه باشد كم مي
كند .شكا كاي این دستور بصورت زیر است:
Dec mem/reg
مثال:
X db 10
Inc x x=11
نكته:
بیتهاي زیر از ثبات وضعیت با انجام دستورات incوdec
تغییر میكنند:
O S Z A P C
دستور : neg
بر روي یك ثبات یا حافظه استفاده مي شود .این دستور
علمت را عوض مي كند .در صورت مثبت بودن آن را
منفي و در غیر اینصورت آن را مثبت مي كند .شكل كلي
این دستور بصورت زیر است:
Neg mem/reg
نكته:
بیتهاي زیر از ثبات وضعیت با انجام دستورات negتغییر
میكنند:
O S Z A P C
دستور :xchg ))xchang
از این دستور براي تعویض نمودن دو ثبات و یا یك ثبات و ناحیه اي از
حافظه ،مورد استفاده قرار مي گیرد .
بایستي توجه داشته باشیم كه طول متغییرها یا ثبات ها باید یكي باشد .
شكل كلي این دستور بصورت زیر است :
Xchg reg , reg/mem
مثال:
X dw 2fe0h
Mov ax , 3f25h
Xchg ax , x ax=2fe0h
x=3f25
دستور :jmp
از این دستور براي انتقال كنترل برنامه به دستور خاصي
استفاده مي شود .در صورتي كه كنترل و اجراي برنامه از
دستوري كه برچسب آن در جلوي این دستور مشخص شده ،
ادامه پیدا مي كند.
برچسب جلوي این دستور ،مي تواند قبل یا بعد از این دستور
قرار گیرد.
نكته:
، Lableنباید همنام باشد.
، Lableنباید خیلي بزرگ باشد.
شكل كلي اين دستور بصورت زير است:
Jmp lable
مثال:
……….
Loop lable
:مثال
فرض كنید رشته هاي s1,s2را با طول مشخص داریم(5
بایت)،قسمت برنامه اي بنویسید كه رشته s1را در رشته s2
كپي كند .
“S1 db “abcde
)?(S2 db 5 dup
نكته:
bx,si,diبعنوان شمارنده و براي آدرس دهي بكار مي روند.
جواب:
Mov cx,5
L1:
mov si,cx
dec si
mov
al,s1[si]
mov
s2[si],al
Loop l1
:نمونه سؤال امتحان
معادل قسمت برنامه زیر كه به زبان pascalمي باشد را به
زبان اسمبلي تبدیل نما ئید(.هر عضو A،1بایت است)
;Sum:=0
For i:=1 to 10 do
]sum:=sum + a[i
جواب:
A db 20,31,…,
84,32
Sum dw 0
…………
…………
Mov cx,10
Sub ax,ax
L1:
mov si,cx
dec si
add ax,a[si]
Loop l1
Mov sum,ax
دستور: cmp ))compare
براي مقایسه دو عملوند از این دستور استفاده مي شود دو
عملوند ،مي توانند هر دو ثبات باشند.
در صورتي كه عملوند اول آدرس حافظه باشد ،عملوند دوم
باید دادهاي بلفصل باشد.
بسته به نوع مقایسه این دستور ،در ثبات flagتاثیر مي گذارد.
این دستور معمول همراه دستور انتقال شرطي مورد استفاده
قرار مي گیرد.
:شكل كلي این دستور بصورت زیر است
Cmp op1,op2
:مثال
Cmp ax,bx
متغییرCmp ax,
Cmp f1,10
:دستورانتقال شرطي
دستورات jxبعداز دستور cmpمي آیند كه درجلوي آنها یك بر
چسب وجود دارد.
به جاي xرشته اي قرار مي گیرد كه مشخص كننده ي نتیجه ي
مقایسه ویا مقدار ثبات Flagمي باشد.
اگررابطه ي متناظربا این رشته صحیح باشد كنترل برنامه به
برچسب موردنظر انتقال پیدا مي كند.
CMP OP1,OP2 شكل كلي این دستور به صورت زیراست :
JX LABLE
JMP
: JX جدول حالت
بدون علمتOP1,OP2 با علمتOP1,OP2 تغییرات ثبات وضعیت
OP1>OP2 JG JC CARRY
JA FLAG=1
OP1>=OP2 JGE JNC
JAE CARRYFLAG=0
OP1=OP2 JE JS
JE SIGNFLAG=1
OP1<>OP2 JNE JNS
JNE SIGNFLAG=0
OP1<OP2 JL JZ
JB ZEROFLAG=1
OP1<=OP2 JLE JNZ
JBE ZEROFLAG=0
A=ABOVE G=GREATER JP
PARITYFLAG=1
B=BELOW L=LESS JNP
شبیهاسمبليزبانبهزيرراپاسكالدستوراتمعادل
كنیدسازي
SHL AL,1 0 1 0 0 1 1 0 0
SHIFTحسابي :
:شكل كلي اين دستوربه صورت زير است
SAL mem/reg , n
SAR mem/reg , n
Nتعداد دفعات عمل SHIFTرا مشخص مي كند .
ازاين دو دستور براي SHIFTبه چپ ياراست به صورت
حسابي استفاده مي شود .
منظوراز حسابي نگهداشتن بیت علمت است .
1 0 0 0 1 1 1 0
SAR AL,1 1 1 0 0 0 1 1 1
CF= 0
0 0 1 0 0 1 1 0
SAL AL,1
0 1 0 0 1 1 0 0
CF= 0
:دستورچرخشي بیتي
:شكل كلي اين دستوربه صورت زير است
ROR mem/reg , n
ROL mem/reg , n
Nتعداد دفعات عمل SHIFTرا مشخص مي كند .
ازاين دو دستور براي Rotateكردن بیتها استفاده مي شود .
مقدار Rotateشده ابتدا در CFقرارمي گیرد وپس ازآن به
آخرين بیتي كه منتقل شده است انتقال پیدا مي كند.
1 1 0 0 0 1 1 0
ROR AL,1 1 0 0 0 1 1 0 1
CF= 1
مثال:
برنامه اي بنويسید كه يك كاراكتراز صفحه كلید دريافت كند وآن
را به صورت مبناي دو نشان دهد .
:تمرين
اطلعات مربوط به 15كارمند در 15كلمه ي متوالي قرار
دارد )براي هر كارمند يك كلمه وهركلمه 16بیت است(
اولین بیت سمت راست كدجنسیت كارمند مي باشد براي
مرد يك وبراي زن صفراست قسمت برنامه اي بنويسید كه
تعداد كارمندان مرد را مشخص كند .
M DB 0 JNC L2
AREA DW 2048H ,…, 3000AH INC M
: L2:
MOV SI , 0 ADD SI , 2
MOV CX , 15 LOOP L1
L1:
]MOV AX , AREA [SI
SHL AX , 1
عملگرهاي منطقي )Test,And,Or,Not,Xor(:
ازاين عملگرها براي انجام اعمال منطقي روي بیتها استفاده
مي شود .باانجام اين عملگرها بیتهاي ثبات وضعیت تغییر
مي كند نكته ي قابل توجه ديگراين است كه نتیجه ي كاردر
.ثباتي كه درابتدا تعريف شده قرار مي گیرد
:نكته
عملگر Testمانند Andاستفاده مي شود درثبات وضعیت
تغییراتي ايجاد مي كند ولي درعملگرهاي مربوط هیچ
تغییري ايجاد نمي كند .
شكل كلي هريك از اين دستورات بصورت زير است:
0 1 1 0 0 1 1
1 0 1 0 0 1 0
1 1 0 1 1 1 0
:نكته
-1وقتي بخواهیم بیتي را صفر كنیم آن بیت را صفر وبقیه ي
بیتها را يك وازعملگر ANDاستفاده مي كنیم .
OR AL , 10000001B
AND AL , 1011101B
XOR AL , 00100100B
تمرين : 2
AXقسمت برنامه اي بنويسید كه سمت راست ترين بیت ثبات
را بیت شماره ي صفروسمت چپ ترين بیت رابیت شماره ي
15درنظربگیريد .
دنباله دستوراتي بنويسیدكه بیتهاي صفرويك رابابیتهاي 14
و15
عوض نمايد بیتهاي 7,8را دست نخورده باقي بگذارد .بیتهاي
2,3,4را متمم كند .بیتهاي 5,6را يك كند .
پورت هاي : PC
پورتهاي كامپیوترهاي PCارتباط بین CPUوقسمتهاي مختلف
كامپیوتربراي هريك از مدارات جانبي يك كامپیوتريا چندثبات
درنظرگرفته شده است كه ارتباط بین CPUومدارات جانبي
را برقرارمي كند .
اين پورتها به دو دسته تقسیم مي شوند :
-1پورتهاي ورودي :اين پورتها محل ورود اطلعات از
مدارات جانبي به CPUمي باشند .
-2پورتهاي خروجي :اين پورتهاگذرگاه انتقال اطلعات
از CPUبه مدارات جانبي مي باشند .
درصورتي كه بخواهیم به يكي از مدارات جانبي اطلعات ارسال
كنیم ياازآن اطلعات دريافت كنیم ويا اينكه تبادل اطلعات را
از طريق برنامه هاي وقفه انجام دهیم دركامپیوترهاي PCيك
ناحیه ي 64KBبراي ثبات هاي پورتها درنظرگرفته شده
است هرسري از پورتها مربوط به قسمتي از كامپیوتراست .
بعنوان مثال درجدول زيرآدرس بعضي ازثباتهامنظورشده است .
لزم به ذكراست كه اين آدرس هاآدرس حافظه اصلي نیستند و
نمي توانند همانند مقداردادن به حافظه اصلي به آنها مقدار داد
ياازآنها مقدار گرفت .
براي مقداردهي به آنهااز دستورات خاصي مثل INو OUT
استفاده مي كنیم .
آدرس برخي از شماره پورتها به صورت زير است :
برخي از شماره پورتها به : Hexa decimal
21H ثبات هاي كنترلي وقفه
40 – 42 شمارنده و Timer
60 ورودي از صفحه كلید
201 كنترلي بازي
– 3B0 تطبیق دهنده
3BF
61 بلندگو )بیت 0و(1
– 3D0 صفحه نمايش تك رنگ و پورت موازي چاپگر
–3DF
3F0 كنترلي disk
3FD
دستور : INاين دستوريك يا دوبايت را از ورودي خوانده و
آن را درثبات AXويا ALقرار مي دهد .
شكل كلي اين دستوربه صورت زير است :
IN AL,Portnumber
IN AX,Portnumber
دستور :OUTازاين دستوربراي فرستادن يك بايت يايك كلمه
از ثبات AXيا ALبه پورت موردنظر استفاده مي شود .
شكل كلي اين دستوربه صورت زير است :
OUT Portnumber,AL
OUT Portnumber,AX
:مثال
بااستفاده از دسترسي به آدرس پورتها قسمت برنامه اي بنويسید
كه درصورت اجرا بااستفاده از پورت 61Hتولید
START : MOV DX , 1000 صدانمايد.
TOP : IN AL , 61H
AND AL , 0FEH
XOR AL , 02H
OUT 61H , AL
MOV CX , 1000
DELAY : LOOP DELAY
DEC DX
CMP DX ,
JNE TOP
تمرين : 1
با استفاده از دسترسي به آدرس پورتها برنامه اي بنويسید كه
در صورت اجرا مشخص نمايد چاپگر آماده است يا خیر ؟
بااستفاده از دسترسي به آدرس پورتها برنامه اي:2 تمرين
. صفحه كلید بخواندBuffer بنويسید كه يك كاراكتررا از
START : JE LTHREE
IN AX , 305H MOV AX , BX
MASK1 DB 0000000000001111
MOV BX , AX AND AX , MASK4
MASK2 DB 0000000011110000
AND AX , MASK1 CMP AX , MASK4
MASK3 DB 0000111100000000
CMP AX , MASK1 JE LFOUR
MASK4 DB 1111000000000000
JE LONE EXIT :
MASK_OUT1 DB 10000001
MOV AX , BX
MASK_OUT2 DB 01000010
AND AX , MASK2
MASK_OUT3 DB 00100100
CMP AX , MASK2
MASK_OUT4 DB 00011000
JE LTWO
MOV AX , BX
AND AX , MASK3
CMP AX , MASK3
LONE : LTWO :
MOV AL , MASK_OUT4 MOV AL , MASK_OUT3
OUT 307H , AL OUT 307H , AL
JMP EXIT JMP EXIT
LTHREE : LONE :
MOV AL , MASK_OUT2 MOV AL , MASK_OUT1
OUT 307H , AL OUT 307H , AL
JMP EXIT JMP EXIT
دستورات PUSHو : POP
وقتي كه يك زيربرنامه را فراخواني مي كنیم درمواقع اجراي
زيربرنامه بهتراست كه درابتدا محتويات ثبات ها را به حالت
اول خودبرگرداند اين كاربدين منظورانجام مي شود كه ثباتها
بخصوص ثباتهاي عمومي درتمام زيربرنامه ها استفاده مي
.شوند
تغییردادن مقدار آنهادرطول زيربرنامه ممكن است اختللتي
.در برنامه ايجاد كند
دستور PUSHمي تواند مقدار يك ثبات يا محلي از حافظه
رادر محلي بنام STACKذخیره نمايد .دراين محل هريك
از اطلعات جديد روي اطلعات قبلي قرار مي گیرد .
بنابراين براي بازيابي اطلعات بايد آنهارا برعكس زمان
.ذخیره كردن بازيابي نمود
دستور POPبراي بازيابي كردن مقداري از Stack
وقرار دادن دريك ثبات يا متغیرحافظه استفاده مي شود .
شكل كلي اين دستور بصورت زير است :
PUSH mem/reg
POP mem/reg
سؤال :دستورات زير معادل كدام دستوردر اسمبلي است ؟
PUSH AX
PUSH BX
XCHG AX ,
POP AX BX
POP BX
دستورات زير چه كاري انجام مي دهند ؟
MOV AX , 30F2H
MOV BX , 1200H
MOV CX , 3022H
SP 1230 22
PUSH AX
SP 1231 30
PUSH BX
SP 1232 00
PUSH CX SP 1233 12
. SP 1234 F2
.
SP 1235 30
POP CX
12 36
POP BX
POP AX
مثال :قسمت برنامه اي بنويسید كه دربرنامه ي اصلي مقدار
ahو bhبعنوان پارامتر به يك پشته ارسال شوند وسپس
در زيربرنامه مقداري از Stackخوانده شود .
AL DW 203FH
BL DW 3566H
START:
PUSH AL IP BP = SP
PUSH BL
CALL P1
60
: BP + 2
END 35
P1 PROC NEAR 3F
MOV BP , SP BP + 4
20
]MOV BX , [BP+2
]MOV AX , [BP , 4
START
:
ENDP
:تكلیف
دستورات لزم براي يك برنامه ي اصلي وزير برنامه به زبان
اسمبلي را بنويسید كه هركدام دريك فايل جداگانه قراردارند
وبرنامه ي اصلي دو عددرا كه درمكان data1و
data2قراردارند وبصورت باينري مي باشند ازطريق
Stackبه زيربرنامه بدهد .
زيربرنامه اين عددهارا از Stackبردارد ودرهم ضرب
نمايد ودر Stackقرار دهد سپس كنترل به برنامه ي
اصلي برگردد .
برنامه ي اصلي اين عدد رااز Stackبردارد ودرمكان
data3قرار دهد .
دستور : LAHF
اين دستور 8BITپايین)كم ارزش( ثبات وضعیت را درAH
بار مي كند .
دستور : SAHF
اين دستورمقدار AHرادر 8BITپايین ثبات وضعیت قرار
میدهد.
دستور : POPF
اين دستورمقدارثبات وضعیت رااز TOPپشته مي گیرد .
دستور : PUSHF
اين دستور مقدارثبات وضعیت را در TOPپشته كپي مي كند .
:تمرين
قسمت برنامه اي بنويسید كه بیتهاي TFو DFو OF
ازثبات وضعیت را SETكند .
TF=8 , DF=10 , OF=11
PUSHF
POP AX
OR AX , 0000110100000000
PUSH AX
POPF
:انواع چاپ برروي صفحه نمایش
:با استفاده از وقفه ها 1-
بااستفاده ازوقفه ها مي توان رشته رابه صورت حرف به
.حرف يا يك جابايك وقفه چاپ نمود
مثال :باوقفه ي 10hسرويس 09hمي توان يك
كاراكتررادر محل جاري مكان نما چاپ كرد .
MOV BH , 0
’MOV AL , ‘A
MOV BL , 1FH
MOV CX , 1
MOV AH , 09H
INT 10H
:مثال
با وقفه ي 21Hسرويس 09Hمي توان يك رشته را در
محل جاري مكان نما چاپ كرد .
’S DB “This is a test !...”, ‘$
Lea dx , s
Mov ah , 09h
Int 21h
:نكته
وقفه ي 21Hسرويس 02Hبراي نمايش كاراكتري كه در
DLقرار دارد استفاده مي شود.
-2با استفاده از : Video Ram
Video Ramدرحالت متني 25*80آدرس
0b800:0000را دارد كه بصورت زيرمي باشد :
MOV AX , 0B800H
MOV ES , AX
MOV BX , 00H
MOV AL , 65
MOV AH , 04H
MOV ES : [BX] , AX
مثال:
AL كاراكتري كه درVR تابعي بنويسید كه بااستفاده از
BH وستونBL درسطرAH وجود داردورنگ آن در
.MODEL Tiny,C,,OS_DOS SUB AH , AH H: . چاپ كند
.286 MOV AL , 80 MOV AH , 1HH
.CODE MUL BL MOV AL , ‘A’
.STARTUP ADD AL , BH MOV BL , 20
JMP H ADC AH , 0 MOV BH , 10
PUTCH PROC NEAR SHL AX , 1 CALL PUTCH
PUSH ES MOV BX , AX .EXIT0
PUSH AX MOV AX , CX END
PUSH BX MOV ES : [BX] , AX
PUSH CX POP DX
MOV CX , 0B800H POP CX
MOV ES , CX POP BX
DEC BL POP AX
DEC BH POP ES
MOV CX , AX RET PUTCH ENDP
تمرين : 1
.برنامه اي بنويسید كه صفحه نمايش را بارنگ پنج پاك كند
)بااستفاده از ( Video Ram
تمرين : 2
برنامه اي بنويسید كه بااستفاده از Video Ramيك Box
از ) (5,6تا ) (30,12رسم كند .
تمرين : 3
برنامه اي بنويسید كه بااستفاده از Video Ramيك منو با
پنج گزينه روي صفحه نمايش ايجاد كند بااستفاده از
كلیدهاي Arrow upو Arrow downروي گزينه
هاي آن حركت كرده وبازدن كلید Enterهريك پیغام
خاصي برروي صفحه نمايش چاپ شود گزينه ي خروج
نیز داشته باشد .
ماکرو )درشت دستور(:
قسمتی از یک زیر برنامه اسمبلی است که ن ام خاصی را ب ه آن
اختصاص داده ایم .ماکرو همانند زیربرنامه است با این تفاوت که با
هر بار فراخوانی یک ماکرو تمام دست ورات ماک رو در مح ل
فراخوانی کپی می شود.
برای فراخوانی ماکرو باید از دستور MACROاستفاده نمود.
شکل کلی یک ماکرو به صورت زیر است:
Name_macro MACRO parameter_list
local نام برچسب ها
دستورات ماکرو
ENDM
فراخوانی ماکرو
برای فراخوانی یک ماکرو کافی است نام آن را در مح ل م ورد نیاز
ذکر نماییم .پارامترهای ماکرو می توانند در جلوی کلمه ماکرو به
همراه “ ” ,از هم متمایز شوند.
اگر بخواهیم ماکرویی که دارای پارامتر می باشد را فراخوانی نمایی م
باید نام آن را به همراه پارامترها در محل مورد نیاز ذکر کنیم.
چند نکته:
-1استفاده از ماکرو حجم برنامه را به طور قابل ملحظه ای افزایش
می دهد .اما از طرفی به خوانایی برنامه کمک می کند و همچن ین
دسترسی به زیربرنامه ها را ساده تر می کند.
-2برای اینکه حجم برنامه در موقع استفاده از ماکرو افزای ش پی دا
نکند بهتر است در ماکرو فقط مقداردهی ثباتها را انجام دهیم و در
انتهای آن زیربرنامه مربوطه را فراخوانی کنیم.
-3تعریف ماکرو باید قبل از تعاریف Segmentبرنامه باشد.
:مثال
ببرد؟col و ستونrow ماکرویی بنویسید که مکان نما را به سطر
putch endp
دستورات رشته ای:
برای انجام دستورات رشته ای بایستی قبل از هر چیز وضعیت بیت
)DF )Direction Flagرا مشخص کنیم .زیرا این بی ت با دو
مقدار 0و 1خود تنظیم کننده عملیات رشته ای از راست به چپ
یا از چپ به راست می باشد.
String db “ABCDEFGHIJ”
mov cx,4
mov si,offset string+4
mov di,offset string+9
STD
Rep movsb
A B C D E F G H I J
SI DI
A B C D E F B C D E
”result string:”ABCDEFBCDE
:مثال
کپی کند؟str2 را درstr1 کلمه از10 دستوراتی بنویسید که
Str1 dw “ ABCDEFGHIJ”
Str2 dw 10 dup)?(
mov si,offset str1
mov di,offset str2
CLD
mov cx,5
Rep movsw
دستورات : LODSB , LODSW
این دو دست ور از آدرس DS:SIیک بایت در alو یا دو بایت در
axکپی می کنند.
نکته:
با اجرای دستورات فوق اگر DF=1باشد SIیک یا دو بایت کاهش
می یاب د و اگر DF=0باشد SIیک یا دو بای ت افزایش پیدا
می کند.
:مثال
قرارstr2 را در رشتهstr1 دستوراتی بنویسید که معکوس رشته
دهد؟
Str1 db “ABCDFG”
Str2 db 6 dup )?(
mov si,offset str1
mov di,offset str2+5
CLD
mov cx,6
L1: LODSB
mov [di],al
dec di
Loop L1
دستورات : STOSB , STOSW
با استفاده از این دو دست ور می توان محت ویات alو یا axرا در
آدرس DS:DIاز حافظه کپی نمود.عمل کپی یک یا دو بایت ی
انجام می شود.
نکته:
با اجرای این دو دست ور اگر DF=0باشد DIیک یا دو بای ت
افزایش می یابد و اگر DF=1باشد DIیک یا دو بای ت کاهش
می یابد.
مثال:
قسمت برنامه ای بنویسید که رشته str1به طول 10بای ت را با
کاراکتر Spaceپر کند؟
Rep stosw
دستور REPEیا : REPZ
عملیات تا زمانی که ZFمبتنی بر مساوی یا صفر باش د ادام ه
می یابد.وقتی که ZFمبتنی بر صفر نبودن ش ود یا cxکاهش
یافته وصفر شود عملیات خاتمه می یابد.
مثال:
قسمت برن امه ای بنوی سید که در رشت ه ای به طول 10بای ت
کاراکت ری که در alوج ود دارد را جستج و کند اگر پیدا کرد
مقدار 03را در alقرار دهد؟
“Str1 db “ABCDEFGHML
mov cx,10
CLD
Lea di,str1
‘mov al,’F
Repne scasb
Jne L1
mov al,03H
:L1
مثال:
قسمت برنامه ای بنویسید که کاراکتر ’*‘ را در رشته strبه طول
6بایت جستجو کند .اگر پیدا کرد آن را با Spaceجایگزین کند؟
وقفه صفر
وقفه دو
:مثال
را5 وقفه شمارهint برنامه ای بنویسید که بدون استفاده از دستور
) استprint screen مربوط به کلید5 اجرا کند؟ ( وقفه شماره
20 21 22 23
callبرنامهUser
Print Screen
بن ابراین برای مقی م کردن یک برنامه در حافظه باید ابتدا بردار
وق فه را به طور من اسب منحرف کرد و سپ س ب رنامه را
بصورت مقیم در حافظه درآورد.
مقیم کردن یک برنامه در حافظه:
(سرویس 27Hاز وقفه ) 21H
مثال:
برنامه ای بصورت مقیم در حافظه بنویسید که کاراکتر ’*‘ همیشه
گوشه بالی صفحه نمایش نشان داده شود؟
model tiny,c,Os_dos. mov es:[0],1F2AH
286. Pop es
code. STI
startup. Iret
Newint endp
? Oldint dd
:Com
Newint proc
mov ax,3508H
CLI int 21H
push cs mov wordptr oldin,bx
[call ds:[oldint mov wordptr oldint[2],es
push es mov dx,offset newint
push 0B800H
pop es
Push cs
Pop ds
mov ax,2508H
Int 21H
mov ax,0000H
mov dx,offset com
Int 21H
وقفه : 16H
این وقفه برای کار با صفحه کلید و Bufferصفحه کلید انتخاب می
شود.
Area db 11,12,19,36,81,91
db 100,102,104,110
I db -1
X db 102
mov si,0 cmp al,x jmp while
mov di,9 jne L1
:Exit
:While mov I,bl
cmp si,di jmp exit
jae exit :L1
mov ax,si cmp al,x
add ax,di ja L2
shr ax,1 mov di,bx-1
mov bh,0 jmp while
mov bl,al :L2
[mov al,area[bx mov si,bx+1
مثال:
برنامه ای بن ویسی د که 10بایت اطلعات را از پ ورت 3F7H
بخواند .سپ س میان گین اعداد دریافتی را در محلی از حافظه به
نام avgقرار دهد؟
Avg db ? adc bl,al [cmp al,area[di
Ten db 10 loop start je L4
mov cx,10 mov ax,bx :L4
mov bx,0 Div ten
Start: inc si
mov avg,al
in al,3F7H dec di
mov si,0
jmp L3
mov di,7
:L3 :Exit
cmp si,di
jae exit
[mov al,area[si
مثال:
یک روال به زبان اسمبلی بنویسید که ت شخیص دهد BHح اوی
یک Palindramمی باشد؟ ( عددی با بیتهای قرینه )
(?) Area db 8 dup
Sw db 1
mov cx,8
mov si,0
L:
shl bh,1
jnc L2
mov area[si],1
L2:
inc si
loop L
EN