nana1368
سه شنبه 24 آذر 1388, 12:09 عصر
سلام خواهش میکنم کمکم کنید
چنددستورمهم اسمبلی را برام بنویسیید
ممنون
خیلی فوری:ناراحت:
tdkhakpur
سه شنبه 24 آذر 1388, 12:41 عصر
mov
int
add
jz
jo
sub
dec
inc
iret
مائده 100
سه شنبه 24 آذر 1388, 17:45 عصر
[quote=nana1368;868908]سلام خواهش میکنم کمکم کنید
چنددستورمهم اسمبلی را برام بنویسیید
وقفه 21h
تابع 01h. يک کليد را از صفحه کليد می خواند.
کد کليد خوانده شده در ثبات AL برگردانده می شود.
mov AH, 0lh
int 21h
mov AL, character
تابع 02h. يک کاراکتر را روی صفحه نمايش نشان می دهد.
کد کاراکتر در ثبات DL بايد قرار داده شود.
mov AH, 02h
mov DL,character
int 21h
تابع 09h. يک رشته کاراکتری را روی صفحه نمايش نشان می دهد.
آدرس شروع رشته بايد در ثبات های DS:DX قرار بگيرد. انتهای رشته توسط کاراکتر ($) بايد تعيين شده باشد.
mov AH,09h
lea DX, string
int 21h
وقفه 10h
تابع 02h. مکان نما را روی صفحه نمايش به سطر و ستون خاصی منتقل می کند.
شماره صفحه در BH، شماره سطر در DH و شماره ستون در DL بايد قرار بگيرد. مختصات صفحه از نقطه 0 و 0 از گوشه بالای چپ صفحه نمايش شروع می شود.
mov AH, 02h
mov BH, page
mov DH, row
mov DL, column
int 10h
تابع 09h. يک کاراکتر را با رنگ معين چندبار نمايش می دهد.
کد کاراکتر در AL، شماره صفحه در BH، خاصيت رنگ کاراکتر در BL و تعداد تکرار کاراکتر در CX بايد قرار بگيرد.
mov AH, 09h
mov AL, character
mov BH, page
mov BL, attribute
mov CX, number
int 10h
ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ
دستورات شیفت يک رشته بیتی را به سمت راست يا چپ حرکت می دهند. توسط اين دستورات می توان روی بيت های داده کار کرد؛ داده را ادغام يا جدا کرد و عمليات محاسباتی را انجام داد. ريزپردازنده 8086 سه دستورالعمل شيفت (shl/sal، shr و sar) دارد. بخش زير هر يک از اين دستورالعمل ها را شرح می دهد.
SHL/SAL (http://www.hpkclasses.ir/Courses/Assembly/asm0706.html#a1)
SHR (http://www.hpkclasses.ir/Courses/Assembly/asm0706.html#a2)
SAR (http://www.hpkclasses.ir/Courses/Assembly/asm0706.html#a3)
کاربردهای شيفت (http://www.hpkclasses.ir/Courses/Assembly/asm0706.html#a4)
عمل شيفت بيت های داده را حرکت می دهد. حرکت بيت ها می تواند به سمت چپ (به سمت بيت های با ارزش) يا راست (به سمت بيت های کم ارزش) باشد. فلگ Carry معمولا آخرین بيت شیفت داده شده که از عملوند خارج می شود را می گيرد.
دو نوع شيفت وجود دارد: شيفت منطقی و شيفت رياضی. شيفت منطقی ساده ترين شيفت است که به طريق ساده ای بيت ها را شيفت می دهد. در شيفت رياضی علامت عدد حفظ می شود.
مثال. يک عدد شيفت داده شده يک بايتی نشان داده شده است.
http://www.hpkclasses.ir/Courses/Assembly/asm0708.GIF
توجه کنيد که بيت های جديدی که وارد می شوند هميشه صفر هستند.
SHL/SAL
دستورالعمل (shift left) shl يا (shift arithmetic left) sal بيت های داده را به سمت چپ حرکت می دهد. فرم کلی آنها به صورت زير است:
shl dest, count
sal dest, count
shl و sal معادل هستند و يک دستورالعمل را نشان می دهند يعنی کد يکسانی دارند. اين دستورالعمل ها هر بيت عملوند مقصد را به سمت چپ عدد به تعداد عملوند count حرکت می دهند. از سمت راست عدد 0 وارد عدد می شود و آخرين بيتی که از سمت چپ خارج می شود وارد فلگ carry می شود.
http://www.hpkclasses.ir/Courses/Assembly/asm0705.GIF
عملوند اول مقداری است که شيفت داده می شود و عملوند مقصد است. count تعداد شيفت ها را مشخص می کند و می تواند عدد 1 يا برای تعداد شيفت های بالاتر ثبات CL باشد. نوشتن تعداد شيفت بيشتر از 1 مستقيما در دستور غير مجاز است.
دستورالعمل shl/sal می تواند به صورت های زير بکار رود:
shl register, 1
shl memory, 1
shl register, CL
shl memory, CL
دستورالعمل shl/sal به صورت زير روی فلگ تاثير می گذارد:
• اگر تعداد شيفت صفر باشد فلگ ها تغييری نمی کنند.
• فلگ carry آخرين بيت خارج شده از سمت چپ عملوند را نگه می دارد.
• فلگ overflow در يک بيت شيفت يک می شود اگر دو بيت آخرعملوند متفاوت باشند. به عبارت ديگر بعد از عمل شيفت بيت علامت عدد تغيير کند. برای شيفت های بيشتر از يکبار نامعين است.
• فلگ zero، sign و parity با توجه به نتيجه تغيير می کنند.
• فلگ Auxilury Carry نامعين است.
مثال.
mov AX, 4123h
shl AX, 1 ; shift 1 bit to left, ax = 8246H, CF = 0
SHR
دستورالعمل (shift right) shr بيت های داده را به سمت راست حرکت می دهد. فرم کلی آنها به صورت زير است:
shr dest, count
دستورالعمل shr کليه بيت های عملوند مقصد را به تعداد count به سمت راست شيفت منطقی می دهد. از سمت چپ صفر وارد عملوند می شود و آخرين بيتی که از سمت راست خارج می شود وارد فلگ Carry می شود.
دستورالعمل shr مانند shl استفاده می شود؛ عملوند آن می تواند ثبات يا مکانی از حافظه باشد و تعداد شيفت ها می تواند عدد 1 يا ثبات CL باشد.
http://www.hpkclasses.ir/Courses/Assembly/asm0706.GIF
دستورالعمل shr فلگ ها را به صورت زير تنظيم می کند:
• اگر تعداد شيفت صفر باشد فلگ ها تغييری نمی کنند.
• فلگ carry آخرين بيت خارج شده از سمت راست عملوند را نگه می دارد.
• در يک بيت شيفت فلگ overflow يک می شود اگر دو بيت آخرعملوند متفاوت باشند. به عبارت ديگر اگر بعد از عمل شيفت بيت علامت عدد تغيير کند. برای شيفت های بيشتر از يکبار نامعين است.
• فلگ zero، sign و parity با توجه به نتيجه تغيير می کنند.
• فلگ Auxilury Carry نامعين است.
مثال.
mov AX, C1A5h
mov CL,3
shr AX, CL ; shift 3 bit to right, ax = 1834h, CF = 1
SAR
دستورالعمل (shift arithmetic right) sar مانند دستورالعمل shr است با اين تفاوت که علامت عملوند تغيير را نمی دهد. فرم کلی آن به صورت زير است:
sar dest, count
اين شيفت برای اعداد علامتدار طراحی شده است و بيت های عملوند مقصد را به سمت راست شيفت رياضی می دهد و بيت علامت را در خودش کپی می کند.
http://www.hpkclasses.ir/Courses/Assembly/asm0707.GIF
دستورالعمل sar مشابه دستورالعمل shr بکار می رود و به همان صورت روی فلگ ها تاثير می گذارد.
مثال.
mov AX, C1A5h
sar AX, 1 ; shift 1 bit to right, ax = E0D2h, CF = 1
کاربردهای شيفت
مثال. فرض کنيد می خواهيد دو نيبل پائينی ثبات های AL و AH را با هم به صورت زير ترکيب کنيد. کد زير اين کار را انجام می دهد.
http://www.hpkclasses.ir/Courses/Assembly/asm0709.GIF
mov CL, 4
shl AH, CL
and AL, 0Fh
or AL, AH
مثال. فرض کنيد می خواهيد دو نيبل ثبات AL را از هم جدا کرده و نيمه سمت چپ را در ثبات AH و نيمه سمت راست را در ثبات AL به صورت زير قرار دهيد. کدهای زير اين عمل را انجام می دهد.
http://www.hpkclasses.ir/Courses/Assembly/asm0710.GIF
mov AH, AL
mov CL, 4
shr AH, CL
and AL, 0Fh
مثال. هر شيفت به چپ باعث دو برابر شدن عملوند می شود که سرعت بيشتری نسبت به عمل mul دارد. دستورالعمل های shl/sal برای ضرب مقادير علامت دار يا بدون علامت در توان های 2 استفاده می شود. دستور زير مقدار ثبات AX را در عدد 4 ضرب می کند.
mov CL,2
shl AX, CL
مثال. برای محاسبه 10×AX می توانيد به روش زير از دستورشيفت چپ استفاده کنيد (با توجه به اينکه 10×AX=8×AX + 2×AX).
shl AX, 1
mov BX, AX
shl AX, 1
shl AX, 1
add AX, BX
مثال. کدهای زير حاصلضرب AX×7 را محاسبه می کنند (با توجه به اينکه ax×7 = (ax×8)-ax ).
mov BX, AX
shl AX, 1
shl AX, 1
shl AX, 1
sub AX, BX
مثال. چون يک شيفت منطقی به سمت راست مقدار يک عدد صحيح بدون علامت را نصف می کند می توان برای تقسيم بر توان های 2 از آن استفاده کرد. دستورات زير خارج قسمت مقدار ثبات AX بر 8 را محاسبه می کنند.
mov CL,3
shr AX, CL
مثال. برای انجام تقسيم علامتدار بر توان های 2 از شيفت رياضی راست استفاده می شود. دستور زير مقدار ثبات AX را بر عدد 32 تقسيم می کند.
mov CL,5
sar AX, CL
مثال. توجه کنيد اگر عملوند منفی باشد نتيجه دو دستور sar و idiv متفاوت می شود. به دستورات زير دقت کنيد.
mov ax, -15
cwd
mov bx, 2
idiv ;خارج قسمت 7- مي شود
mov ax, -15
sar ax, 1 ;خارج قسمت 8- مي شود
مثال. از شيفت رياضی راست می توانيد برای گسترش رياضی یک عدد علامتدار استفاده کنيد. به کدهای زير دقت کنيد.
; CBW معادل دستور:
mov AH, AL
mov CL, 7
sar AH, CL
; CWD معادل دستور:
mov DX, AX
mov CL, 15
sar DX, CL
البته وقتی يک دستور cbw يا cwd برای گسترش وجود دارد کسی از دو دستور استفاده نمی کند، ولی دستور شيفت اجازه می دهد که مقدار يک ثبات را در هر ثبات ديگرهم اندازه ای به طور رياضی گسترش دهيد:
; DX:BX به BX گسترش رياضی:
mov DX, BX
mov CL, 15
sar DX, CL
ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ــــــ
استفاده از دستورات ضرب و تقسيم کمی پيچيده تر از دستورات ديگر است. زيرا بسته به اندازه و نوع عملوند (بدون علامت و علامتدار) متفاوت از هم هستند. در اين دستورات يک عملوند هميشه ثبات انباشتگر (AL/AX) است.
MUL (http://www.hpkclasses.ir/Courses/Assembly/asm0704.html#a1)
IMUL (http://www.hpkclasses.ir/Courses/Assembly/asm0704.html#a2)
DIV (http://www.hpkclasses.ir/Courses/Assembly/asm0704.html#a3)
IDIV (http://www.hpkclasses.ir/Courses/Assembly/asm0704.html#a4)
MUL
دستورالعمل (multiply) mul عمل ضرب بدون علامت را انجام می دهد. فرم کلی دستور به شکل زير است:
mul src
دستور دارای يک عملوند است درحاليکه عمل ضرب به دو مقدار نياز دارد. عملوند ديگر هميشه ثبات انباشتگر (AL/AX) درنظر می گرفته می شود.
حاصل ضرب 8 بيت در 8 بيت به بيش از يک بايت و 16 بيت در 16 بيت به بيش از دو بايت احتياج دارد.
دستور ضرب بسته به اندازه تک عملوند خود به دو صورت ممکن است عمل کند:
• اگر عملوند يک بايتی باشد؛ عملوند را در AL ضرب کرده نتيجه را در AX ذخيره می کند.
AX=AL*src(8)
• اگر عملوند دوبايتی باشد؛ عملوند را در AX ضرب کرده نتيجه را در ثبات DX:AX قرار می دهد.
DX:AX=AX*src(16)
دستور mul به صورت های زير می تواند باشد:
mul register
mul memory
توجه کنيد که عملوند دستور mul نمی تواند يک داده فوری باشد.
دستور mul روی فلگ های Carry و Overflow را تاثير می گذارد. بعد از اجرای دستور اگر نيمه بالای حاصلضرب برابر با صفر باشد فلگ های Carry و Overflow صفر می شوند در غير اينصورت يک می شوند.
بقيه فلگ ها وضعيت نامعينی دارند خصوصا فلگ های Sign و Zero مقدار معنی داری ندارند. برای بررسی علامت و نتيجه صفر می توان فلگ های Carry و Overflow را بررسی کرد.
IMUL
دستور (integer multiply) imul مشابه دستور mul است با اين تفاوت که عمل ضرب علامتدار را انجام می دهد و روی عملوندهای علامتدار عمل می کند. علامت حاصل ضرب با توجه به بيت علامت عملگرها تنظيم می شود.
مثال. دستورات زير حاصل عبارت (J*7 + K) * 6 را محاسبه می کند. نتيجه در DX:AX قرار می گيرد.
mov AL,7
mov BL,J
imul BL
add AX, K
mov BX,AX
mov AX,6
imul BX
DIV
دستورالعمل (division) div برای تقسيم اعداد بدون علامت استفاده می شود. شکل کلی دستور به صورت زير است:
div src
تک عملوند دستورالعمل div مقسوم عليه تقسيم است، مقسوم بستگی به سايز عملوند يکی از دو حالت زير ممکن است باشد:
• اگر عملوند 8بيتی باشد ثبات AX بر عملوند تقسيم می شود. خارج قسمت تقسيم در AL و باقيمانده در AH قرار می گيرند.
• اگر عملوند 16بيتی باشد مقدار 32بيتی DX:AX بر عملوند تقسيم می شود. خارج قسمت تقسيم در AX و باقيمانده در DX ذخيره می شوند.
برای تقسيم بدون علامت يک عدد 8بيتی بر يک عدد 8بيتی ديگر مقسوم بايد گسترش داده شده 16 بيتی شود. برای اين کار مقسوم را در ثبات AL و مقدار صفر را در ثبات AH ذخيره کنيد. سپس دستور div را بنويسيد.
برای تقسيم بدون علامت يک عدد 16بيتی بر يک عدد 16بيتی ديگر بايد مقسوم در ثبات AX و مقدار صفر در ثبات DX ذخيره شود.
دستور div به يکی از دو صورت زير می تواند باشد. تقسيم بر عملوند فوری امکان ندارد و داده فوری بايد در يکی از ثبات ها قرار گيرد.
div register
div memory
فلگ های Carry، Auxiliary carry، Overflow، Parity، Sign و Zero نامعين هستند.
نکته. اگر مقسوم عليه صفر باشد يا خارج قسمت بزرگتر از مقصد باشد خطا اتفاق می افتد و برنامه سقط می شود. معمولا پيغام "division by zero" يا "divide error" صادر می شود.
مثال. دستورات زير حاصل عبارت J=K/M را محاسبه می کند. متغيرها 8 بيتی و بدون علامت هستند.
mov AL, K
mov AH, 0
div M
mov J, AX
IDIV
دستورالعمل (integer division) idiv مشابه دستورالعمل div است با اين تفاوت که تقسيم علامتدار را انجام می دهد.
قبل از عمل تقسيم مقدار مقسوم (AL يا AX) در صورت لزوم به طور رياضی بايد گسترش داده شوند. اينکار توسط دستورات cbw و cwd انجام می پذيرد.
مثال. دستورات زير حاصل عبارت J := (K*M)/P را محاسبه می کنند. متغيرها 16بيتی و علامتدار درنظرگرفته شده اند.
mov AX, K
imul M
idiv P
mov J, AX
جدول زير به طور خلاصه کاربرد دستورات گسترش در عمليات ضرب و تقسيم را نشان می دهد.
ضرب
تقسيم
mov AL, byte1
imul byte2mov AX, word1
idiv byte1mov AX, word1
imul word2mov AL, byte1
cbw
idiv byte2mov AL,byte1
cbw
imul word1mov AX, word1
cwd
idiv word2
دستورالعمل های انتقال داده مقادير را از يک محل به محل ديگر کپی می کنند.
MOV (http://www.hpkclasses.ir/Courses/Assembly/asm0701.html#a1)
XCHG (http://www.hpkclasses.ir/Courses/Assembly/asm0701.html#a2)
LEA (http://www.hpkclasses.ir/Courses/Assembly/asm0701.html#a3)
MOV
ساده ترين دستورالعمل mov است که دارای دو عملوند است. اين دستورالعمل محتوای دومين عملوند خود را در اولين کپی می کند. فرم کلی آن به صورت زير است:
mov Dest, Source
دستور mov يک کپی از Source را گرفته و آنرا در Dest ذخيره می کند. محتوای Source بعد از اجرای دستور تغيير نمی کند ولی مقدار قبلی Dest رونويسی می شود.
دستور mov مشابه دستور انتساب در زبان های سطح بالا است ( Dest := Source; در زبان Pascal يا Dest=Source; در زبان C).
با توجه به نوع عملوندها، انواع مختلفی از دستورالعمل mov را می توان داشت. متداولترین آنها عبارتند از:
mov register, register
mov memory, register
mov register, memory
mov memory, immediate data
mov register, immediate data
mov AX/AL, memory
mov memory, AX/AL
mov segment register, memory 16
mov segment register, register 16
mov register 16, segment register
mov memory 16, segment register
چند موضوع مهم درباره دستور mov را باید همواره بخاطر داشت:
1. انتقال حافظه به حافظه وجود ندارد. يعنی هردو عملوند همزمان نمی توانند عملوند حافظه ای باشند.
2. عملوندها می تواند از نوع بايت يا کلمه باشند. اما هردو عملوند حتما بايد هم اندازه باشند (برای مثال دستور mov AX,BL اشتباه است). اين برای عملوند های حافظه و ثبات هم باید رعایت شود (اگر متغيری را يک بايتی تعريف کنيد و آنرا در ثبات AX منتقل کنيد اسمبلر پيغام خطا صادر می کند).
3. با اين دستور نمی توان يک داده فوری را در يک ثبات سگمنت منتقل کرد.
4. هر دو عملوند نمی توانند ثبات سگمنت باشند.
5. گونه هائی از دستور mov سريع تر و کوتاهتراز بقيه هستند. برای مثال هر دو دستور mov ax, mem و mov reg, mem داده ای را از حافظه به ثبات کپی می کنند اما دستورالعمل اول کوتاهتر و سريع تر از دومی است.
6. می توان يک مقدار فوری را در يک محل حافظه منتقل کرد. در اين حالت داده فوری به اندازه عملوند مقصد گسترش داده می شود (مگراينکه بزرگتر از مقصد باشد که خطا صادر می شود). البته اسمبلر نمی تواند اندازه عملوند حافظه را تعيين کند مگر اينکه عملوند حافظه ای به صورت يک متغير در برنامه اعلان شده باشد. برای حل اين مشکل از عملگر های byte ptr و word ptr برای تعيين اندازه عملوند حافظه ای می توان استفاده کرد.
مثال. دستور زيرداده فوری 10h را به اندازه يک کلمه گسترش داده و در محلی که BX به آن اشاره می کند ذخيره می کند.
mov word ptr , 10h
مثال. دستورات زير داده فوری 40h را در ثبات سگمنت ES ذخيره می کند. ثبات AX به عنوان واسطه بکار رفته است. هر کدام از ثبات همه منظوره را می توان به جای AX بکار برد.
mov AX, 40h
mov ES, AX
دستور mov روی هيچکدام از فلگ ها تاثيری ندارد.
[B]XCHG
دستورالعمل xchg محتوای دو عملوند خود را جابجا می کند. فرم کلی آن به صورت زير است:
xchg Operand1, Operand2
مقدار هردو عملوند در اثر اجرا تغيير می کند.
چهار شکل خاص برای اين دستور وجوددارد:
xchg register, memory
xchg register, register
xchg ax, register16
ترتيب علموندها اهمیت ندارد. می توانید xchg mem,reg یا xchg reg,mem را بنویسید نتیجه فرقی ندارد. اکثر اسمبلرها بطور خودکار کد کوتاهتر را انتخاب می کنند.
هردو عملوند باید یک اندازه باشند.
دستور xchg روی هيچيک از فلگ ها تاثیر نمی گذارد.
LEA
دستورالعمل (load effective address) lea برای مقداردهی اشاره گرها استفاده می شود. فرم خاص آن به صورت زیر است:
lea register16, memory
اين دستور آدرس موثر يک محل خاص از حافظه را درون یک ثبات همه منظوره ذخيره می کند. منظور از آدرس موثر آدرس نهائی حافظه بعد از کلیه محاسبات آدرسی است.
مثال. دستور زير مقدار 1234h را در ثبات AX قرار می دهد.
lea AX, DS:[1234h]
دستور mov ax, immediate data هم همین عمل را انجام می دهد. تفاوت آنها در اين است که دستورالعمل lea محاسبه آدرسی و انتقال داده را همزمان انجام می دهد.
مثال. دستور زير آدرس حاصل از محاسبه BP+SI+4 را درثبات AX قرار می دهد. ابتدا مقادير را بهم جمع کرده سپس در ثبات منتقل می کند.
lea bx, 4[bp+si]
دستورالعمل lea روی فلگ ها تاثير ندارد.
ahmad100
پنج شنبه 26 آذر 1388, 22:39 عصر
سلام
كسي مقاله اي در مورد پورت هاي نرم افزاري اسمبلي داره؟
:متفکر::متفکر:
tdkhakpur
جمعه 27 آذر 1388, 00:00 صبح
سلام
كسي مقاله اي در مورد پورت هاي نرم افزاري اسمبلي داره؟
:متفکر::متفکر:
http://barnamenevis.org/forum/showpost.php?p=870752&postcount=7:لبخندساده:
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.