اسمبلی 8086

پشت هر دستور اسمبلی یک مفهوم سخت افزاری نهفته ست برای اینکه بتوانیم برنامه های اسمبلی بنویسیم باید حداقل اطلاعاتی از معماری داخلی پردازنده داشته باشیم .اسمبلی در واقع پیوند سخت افزار و نرم افزار است .زبانهای هم خانواده C خیلی به اسمبلی نزدیک هستند و در صورتی که دیس اسمبل برنامه های C رو دیده باشید میبینید که از تعداد زیادی ماکرو تشکیل شده که به صورت تکراری از آنها در تمام برنامه ها استفاده میشود و با استفاده از این تکه کدها برنامه ساخته و کامپایل میشود . یاد گیری دستورات اصلی نیاز به کمی تجربه دارد ولی بعد از آن خواهید دید که بقیه دستورات شبیه هم هستند و فقط کمی با دستورات اصلی تفاوت دارند.یاد گیری زبان اسمبلی یک نوع پردازنده راه را برای یاد گیری اسمبلی بقیه پردازنده ها باز میکند و به صو رت تطبیقی به سرعت دستورات را به ذهن میسپاریم .

8086, چهارده رجیستر 16 بیتی قابل دسترس برای برنامه نویس دارد ( AVR خودمون 32 تا رجیستر داره ) :

8تا به عنوان General Purpose که چهارتا ی آنها ax, bx,cx,dx هستند که رجیستر Data نامیده میشوند.از این رجیستر ها میتوان به صورت مستقل از هم استفاده کرد همچنین میتوان از هر کدام به صورت دو رجیستر 8 بیتی جدا از هم نیز استفاده کرد .چهارتای دیگر یعنی sp,bp,si,di به عنوان Index/Pointer استفاده می شوند.

دستورات اسمبلی دو نوع هستند :

Instruction-1

Preprocessor-2

1-معمولا دستورات از ستون اول شروع نمی شوند و( برای اینکه بگیم ما هم اسمبلی بلدیم ) یک Tab فاصله میزنیم ودستورات را در ستون دوم مینویسیم و اپرند ها را در ستون چهارم یا پنجم و دستورات پیش پردازنده و برجسبها در ستون اول نوشته میشوند.اما اگر با این قالب ننوشتید اسمبلر ایراد نمیگیرد.

شکل کلی یک دستور اسمبلی به صورت زیر است :

 

Instruction   [Destination],[Source]   ;[Comment]

هر یک از قسمتهای داخل کروشه می نواند حذف شود.دستورات میتوانند بیش از دو اپرند داشته باشند یا دو یا یک یا اصلا اپرندی نداشته باشند.

مثال:

mov ax,10h ;Load Immediate

باید دقت کنید که در دستور mov ( بهتر بود اسمش رو Copy میگذاشتند به هر حال هر کسی اول اختراع کرده به نظرش رسیده که اسم این کار MOVE هست ) هر دو اپرند باید طول مساوی داشته باشند و نمیتوان از حافظه به حافظه انتقال داد و باید از ثبات کمکی استفاده کرد .

2-دستورات پیش پردازنده هیچ کد اجرایی برای پردازنده تولید نمیکنند و فقط به اسمبلر میگویند که چطور عمل اسمبل کردن کد ها را انجام دهد .مثلا یک برچسب تبدیل به یک آدرس آفستی میشود و این آدرس در دستورات انشعاب بکار میرود ولی اگر از برجسب استفاده نشود هیچ تاثیری ندارد.

برای نوشتن برنامه ابتدا باید مدل برنامه را مشخص کرد که میتواند یکی از حالتهای زیر باشد :

com
exe
bin
boot

compact برای برنامه هایی با کمتر از 64kb کد ودیتا استفاده میشود .

exe برای مدل ها یی با چند سگمنت کد و دیتا استفاده میشود.در این مدل باید تمام سگمنتهای Data ,Stack,Code تعریف شوند و آدرس سگمنت آنها به ثباتهای سگمنت انتقال پیدا کند ( مواظب باشید سوتی ندید آدرس Data segment قبل از شروع برنامه خودتون رو باید به Stack پوش کنید تا بعد از اتمام برنامه سیستم عامل بتونه ادامه برنامه خودش رو دنبال کنه ).

 

Intrrupt یکی از مهمترین بخشهای کامپیوتر محسوب میشود . دو نوع وقفه وجود دارد :

1 -وقفه سخت افزاری

2 -وقفه نرم افزاری

در 8086 , 256 تا وقفه وجود دارد که حدود 50 تا از آنها به صورت استاندارد تعریف شده اند و بقیه آنها تعریف نشده هستند و برنامه نویس میتواند خودش Interrupt تعریف کند .بعضی از آنها هم توسط ویندوز Overwrite میشوند.آدرس تمام وقفه ها در 1kb اول RAM قرار دارد و هرگونه دستکاری در این قسمت باعث نتایج غیر منتظره خواهد شد ( بی خیال این یه تیکه شید مگر اینکه حرفه ای باشید ).مهمترین وقفه های نرم افزاری به صورت زیر هستند:

INT 21h DOS Intrerrupt
INT 20h COM Exit Interrupt
INT 16h KeyBoard Interrupt
INT 10h Screen Interrupt

میبینید که حتی برای خروج از برنامه هم از وقفه استفاده میشود.

در زیر یک برنامه ساده اسمبلی رو میبینید که یک پیغام در صفحه نمایش چاپ میکند و باز هم اهمیت وقفه رو میبینید که برای همچین کار ساده ای هم ازش استفاده میشود.

توضیح سه تا وقفه ای که بکار رفته اند را میبینید :

interrupt 10h تابع 2h برای تنظیم Cursor بکار میرود .

interrupt 21h تابع 9h برای چاپ رشته ای که قبلا در حافظه ذخیره شده بکار میرود.

interrupt 16h تابع 0h برای خواندن یک کاراکتر از صفحه کلید به روش polling بکار میرود .

نحوه بکار بردن به شکل زیر است:

INT10h/AH=02h -set cursor position.

DH=row
DL=column
BH= page number 0. . . 7

example :
mov dh,10
mov, dl,20
mov dh,0
mov ah,2
int 10h

 

INT 21h/AH=9h –output of a string at DS:DX. String must be terminated by
‹$›.

example :
org 100h
mov dx, offset msg
mov ah, 9
int 21h
ret

msg db "Hello World$" 

INT 16h/AH=00h –get keystroke from keyboard ,no echo

AH = BIOS scan code
AL = ASCII character

if a keystroke is present, it is removed from the keyboard
buffer



;This Program Prints A Massege On Screen
;And Waits To Press Any Key
;Model Of Program Is Tiny

org 100h

    mov     ah,2     ;Set cursor to(25,5)
    mov     dh,5
    mov     dl,25
    mov     bh,0
    int     10h

    mov     ah,9h    ;Print Up Stars
    mov     dx,offset Line
    int     21h 

    mov     ah,2     ;Set cursor to(25,6)
    mov     dh,6
    mov     dl,25
    int     10h

    mov     ah,9h    ;Print Massege
    mov     dx,offset   msg
    int     21h

    mov     ah,2     ;Set cursor to(25,7)
    mov     dh,7
    mov     dl,25
    int     10h

    mov     ah,9h    ;Print Bottom Stars
    mov     dx,offset   Line
    int     21h

    mov     ah, 0    ; wait for any key press
    int     16h

    ret              ;return to Operating System

Line db 32 dup('*'),'$'     ;defining strings
msg db '*    Hello,World from 8086 !   *','$'

خروجی برنامه

 

 

پایان!

Advertisements

دربارهٔ DeltaCode

Somewhere near the sky Far away from people Far away from noise Somewhere near yourself

Posted on دسامبر 30, 2010, in برنامه نویسی and tagged , , , , , , . Bookmark the permalink. 9 دیدگاه.

  1. نمره اسمبلی ات باید 20 بشه….مرسی کدها رو هم تمیز نوشتی،

  2. @tjsoftware
    پاس کردن یه چیزه برنامه نویسی یه چیز دیگه ست .

  3. salam .damet garm
    mikhastam ie lotfi baram bokoni chanta barname kochike age benevisi baferesti be mailam damet garme garm dar gheire in sorat ham damet gharm saite bahali dari
    1- برنامه¬ای بنویسید که یک عدد صحیح مثبت n را از ورودی بخواند و سپس اعداد زوج کوچک¬تر از آن را در خروجی چاپ کند.
    2- برنامه¬ای بنویسید که در یک حلقه¬ی تکرار 20 تایی، 20 کاراکتر را از ورودی بخواند و سپس آن¬ها را به صورت یک رشته¬ی 20 کاراکتری در خروجی چاپ کند.
    3- برنامه¬ای بنویسید که کاراکتری را از ورودی بخواند، اگر آن کاراکتر ‹P› باشد، کلمه¬ی ‹Pass’، اگر ‹F› باشد، کلمه¬ی ‹Fail› و در غیراین¬صورت کلمه¬ی ‹Anonymous› را در خروجی چاپ کند.

  4. @sajjad
    دوست من برنامه ها رو فرستادم .اگر بازم سوال داشتی بپرس.

  5. <salam khoob hastin bebakhshid ye lotfi mikonid vase manam barnamehay ke vase aghaye sajjad sent kardin(3ta barnameha) vase manam befrestid? vaghan lotfe bozorgi mikonid mamnoon misham d

  6. لطفاً با فونت فارسی بنویسید . برنامه ها رو فرستادم .

  7. سلام خوب هستین.میتونیدبرنامه ای بنویسید که با استفاده از فایل باشه و یک منو ایجاد کنه که قابلیت نوشتن در صفحه و ذخیره کردن وکپی رو داشته باشه/؟ممنون میشم.

  8. @سپیده
    سرکار خانم ,اینکه شما فرمودید دیگه یه برنامه نیست,بلکه پروژه text editor هستش با کلی منو کاری و دنگ و فنگ که فکر نمی کنم کسی سورس کدش رو رایگان در اختیارتون بگذارد .
    به هر حال اگر خواستید میتونم برنامه خواندن و نوشتن فایل رو براتون بفرستم .
    برای اطلاعات بیشتر میتونید به این سایت مراجعه کنید
    http://www.laynetworks.com/assembly%20tutorials4.htm
    یا فصل دوازدهم کتاب
    Introduction to 80×86 Assembly Language and Computer Architecture
    نوشته
    Richard C. Detmer
    در مورد ورودی خروخی هستش.

پاسخی بگذارید

در پایین مشخصات خود را پر کنید یا برای ورود روی شمایل‌ها کلیک نمایید:

نشان‌وارهٔ وردپرس.کام

شما در حال بیان دیدگاه با حساب کاربری WordPress.com خود هستید. بیرون رفتن / تغییر دادن )

تصویر توییتر

شما در حال بیان دیدگاه با حساب کاربری Twitter خود هستید. بیرون رفتن / تغییر دادن )

عکس فیسبوک

شما در حال بیان دیدگاه با حساب کاربری Facebook خود هستید. بیرون رفتن / تغییر دادن )

عکس گوگل+

شما در حال بیان دیدگاه با حساب کاربری Google+ خود هستید. بیرون رفتن / تغییر دادن )

درحال اتصال به %s

%d وب‌نوشت‌نویس این را دوست دارند: