تحقیق درباره اسمبلی

راهنمای سایت

سایت اقدام پژوهی -  گزارش تخصصی و فایل های مورد نیاز فرهنگیان

1 -با اطمینان خرید کنید ، پشتیبان سایت همیشه در خدمت شما می باشد .فایل ها بعد از خرید بصورت ورد و قابل ویرایش به دست شما خواهد رسید. پشتیبانی : بااسمس و واتساپ: 09159886819  -  صارمی

2- شما با هر کارت بانکی عضو شتاب (همه کارت های عضو شتاب ) و داشتن رمز دوم کارت خود و cvv2  و تاریخ انقاضاکارت ، می توانید بصورت آنلاین از سامانه پرداخت بانکی  (که کاملا مطمئن و محافظت شده می باشد ) خرید نمائید .

3 - درهنگام خرید اگر ایمیل ندارید ، در قسمت ایمیل ، ایمیل http://up.asemankafinet.ir/view/2488784/email.png  را بنویسید.

http://up.asemankafinet.ir/view/2518890/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C%20%D8%AE%D8%B1%DB%8C%D8%AF%20%D8%A2%D9%86%D9%84%D8%A7%DB%8C%D9%86.jpghttp://up.asemankafinet.ir/view/2518891/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C%20%D8%AE%D8%B1%DB%8C%D8%AF%20%DA%A9%D8%A7%D8%B1%D8%AA%20%D8%A8%D9%87%20%DA%A9%D8%A7%D8%B1%D8%AA.jpg

لیست گزارش تخصصی   لیست اقدام پژوهی     لیست کلیه طرح درس ها

پشتیبانی سایت

در صورت هر گونه مشکل در دریافت فایل بعد از خرید به شماره 09159886819 در شاد ، تلگرام و یا نرم افزار ایتا  پیام بدهید
آیدی ما در نرم افزار شاد : @asemankafinet

تحقیق درباره اسمبلی

بازديد: 567

تحقیق درباره اسمبلی

قسمت های تشکیل دهنده واحد پردازش مرکزی:

1) خطوط ورودی خروجی داده ( گذرگاه مشترک) Data Bus.

2)    خطوط آدرس(گذرگاه آدرس) Adress Bus.

3)    واحد محاسبه و منطق Alu.

4)    واحد حافظه Memory Unit.

 

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

1)  این خطوط مشخص می کنند که اطلاعات دقیقا از چه دستگاهی وارد یا خارج شوند این خطوط نیز به تمام واحدها متصل هستند.

2)  وظیفه این واحد انجام محاسبات و عملیات منطقی پایه است این اعمال منطقی and,or,xor,not هستند و اعمال محاسبات پایه شامل تمام جمع کننده (Full Adder) و معکوس کننده (Inverter) هستند که به طور سخت افزاری در Cpu قرار دارند.

3)  برای اینکه Cpu بتواند کاری انجام دهد باید اطلاعات خود را در جایی ذخیره کند این کار را واحد حافظه در Cpu انجام می هد و داده های مورد نیاز Cpu را به طور موقت در خود ذخیره می کند و واحد آن ثبات یا Register است .

نکته:

تعداد آدرس = دو به توان تعداد خطوط آدرس

خانواده های Cpu هایی که در PC مورد استفاده قرار می گیرند عبارتند از:

خانواده های X86

 

8086: PC      XT,JR    A:20bit     D:16bit

8088: PC     XT,JR     A:20bit     D:8bit

80286: PC     AT        A:24bit     D:16bit

80386: PC     AT        A:24bit     D:16bit

80486: PC     AT        A:24bit     D:32bit

80586: PC     AT        A:24bit     D:64bit

 

در 80286 از تکنولوژی ISA استفاده می کنند در 80386 از تکنولوژی EISA استفاده می کنند در 80486 از تکنولوژی EISA,VESA استفاده می کنند در 80586 از تکنولوژی PCI استفاده می کنند .

تکنولوژی جدیدی که در X586 استفاده می شود تکنولوژی AGP نامیده می شود.

ثبات یا Register:

محلی است که در  CPU قرار دارد و اطلاعات را به طور موقت در خود ذخیره می کند ثبات از سلول های حافظه به نام فلیپ فلاپ (flipflap) تشکیل شده است یک فلیپ فلاپ می تواند دارای مقدادیر صفر یا یک باشد یعنی کار یک بیت را انجام میدهد.

خواص ثبات:

1) قابلیت Load داشته باشد. یعنی بتوانیم به ثبات مقدار اولیه بدهیم.

2)    قابلیت Regist داشته باشد. یعنی بتوانیم داده ها را در آن ذخیره کنیم.

3)    قبلیت Change داشته باشد. یعنی بتوانیم مقدار آن را تغییر بدهیم این تغییرات عبارتند از:

الف) بتواند  setشود. یعنی تمام بیت هایش به یک تبدیل شود.

ب) بتواند clear شود . یعنی تمام بیت هایش به صفر تبدیل شود.

ج) بتواند complement شود. یعنی بتواند یک واحد از آن کم شود.

د) بتواند incerement شود. یعنی بتواند یک واحد به آن اضافه شود.

ه) بتواند shift شود. یعنی قابلیت انتقال داشته باشد.

انواع ثبات:

1) ثبات های عمومی (general- pwpose register).
2) ثبات های خاص (
special-pwpose register).

ثبات های عمومی ثبات هایی هستند که برای آن ها کار خاصی در نظر نمی گیریم و در همه ی کار های cpu قرار می گیرند. این ثبات ها قابلیت و توانایی تمام ثبات های دیگر را نیز دارد و می توان به جای هم مورد استفاده قرار گیرند.

ثبات های خاص ثبات هایی هستند که یک کاربر با وظیفه ی خاص دارند یعنی بسته به نوع کاری که انجام می دهیم ممکن است اجازه استفاده از آن ثبات را داشته باشیم یا خیر . ثبات های این خانواده دارای وضعیت بحرانی (critical) می باشند.

انواع ثبات های عمومی:

8bit: AL,AH,BL,BH,CL,CH,DL,DH

16bit: AX,BX,CX,DX

32bit: EAX,EBX,ECX,DX

 

eax یا accumulator یا ثبات انباره:

این ثباتی همه کاره است یعنی تمام دستور العمل هایی که درزبان اسمبلی داریم روی این ثبات می تواند انجام شود eax تنها ثباتی است که با فضای بیرون از cpu ارتباط مستقیم دارد و به طور مستقیم به خطوط داده متصل است پس eax می تواند به طور مستقیم اطلاعات را بگیرد یا به طور مستقیم اطلاعات را بفرستد. مبدا و مقصد بسیاری از دستورات اسمبلی این ثبات است.

ثبات ebx یا base register یا ثبات پایه:

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

ثبات ecx یا conter register یا ثبات شمارنده:

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

ثبات edx یا ثبات data regisret یا ثبات داده:

این ثبات یک ثبات عمومی است که می تواند در عمل نقل و انتقال اطلاعات و یا برخی از اعمال محاسباتی شرکت کند وظیفه اصلی این ثبات دریافت و ارسال اطلاعات است این ثبات همچنین می تواند با عنوان ثبات کمکی در کنار دیگر ثباتها قرار گیرد.

ثبات های خاص:

الف) ثباتهای اشاره گر یا pointer:

از ثبات های اشاره گر در آدرس دهی داده ها در بخش های مختلف حافظه استفاده می کند این ثبات ها عبارت اند از:

ebp,eip,esp

ebp یا base pointer یا اشاره گر پایه:

از این ثبات 32بیتی برای آدرس دهی بخشهای مختلف حافظه و به عنوان مرکزی برای برداشت اطلاعات استفاده می کند.

eip یا instruction pointer یا اشاره گر دستور:

از این ثبات 32بیتی برای دسترسی به دستور العملی که هم اکنون باید اجرا گردد استفاده می شود این اشاره گر همواره به ابتدای یک بخش از حافظه که دستور العمل در آن دارد اشاره می کند بسته به نوع عمل اجرا شده eip ممکن است یک یا چند خانه افزایش یابد.

 esp یا stack pointer یا اشاره گر پشته:

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

ب) ثبات های شاخص یا index register:

این ثبات ها عبارتند از esi,edi:

edi یا destination index یا شاخص مقصد و esi یا source indexیاشاخص مبدا:

این ثبات های 32بیتی به صورت جفت در نقل و انتقال اطلاعات بین بخش های مختلف حافظه استفاده میشود همچنین از این دو ثبات برای ساخت آدرس استفاده می گردد محتویات این دو ثبات فقط آدرس اند نه داده.

ج) ثبات های eflag:

این ثبات 32 بیتی ثباتی است که وظیفه ی اعلام وضعیت داخلی cpu به استفاده کننده است و شامل شرایطی همچون وجود یا عدم وجود بیت نقلی (cary) بیت توازن(parity) بیت نقلی کمکی(auxiliary) بیت صفر(ziro) بیت علامت(sign) بیت اجرای دستورات(trap) بیت وجود وقفه(intter up) بیت جهت انتقال(direction) بیت سریز(overflow) بیت ها مربوط به کارکردن cpu در وظعیت حفاظت شده (modeprotected ) می باشد.

ساختار eflag:

cf

0

pf

0

af

0

zf

sf

tf

if

df

of

io

dl

nt

0

cf(carry flag):

این بیت وجود یا عدم وجود کری در یک بیت نقلی را نشان می دهد این بیت همواره به عنوان بالاترین بیت در اعداد بی علامت از نظر ارزش است این بیت فقط برای اعداد بی علامت و فقط برای eax تعریف شده است .

توازن(parity):

از جزوه ی مدار منطقی

یکی از راه های یافت خطا استفاده از بیت توازن است بیت توازن وضعیت تعداد بیت ها را مشخص می کند.

انواع توازن:

1) توازن فرد (odd parity):

اگر تعداد بیت های قالب ارسال شده فرد باشد بیت توازن صفر و در غیر این صورت یک است.

2) توازن زوج (even parity):

اگر تعداد یک های قالب ارسالی زوج باشد بیت توازن صفر و در غیر این صورت یک خواهد شد.

Pf(parity flag):

این بیت وضعیت توازن اطلاعات ارسال شده یا دریافت شده را که در eax قرار گرفته را نشان می دهد. توازن به کار رفته به صورتی است که اگر تعداد یک ها فرد باشد بیت توازن یک خواهد شد (توازن زوج). علت این که cpu از توازن زوج استفاده می کند به ساختارalu  برمی گردد چرا که درalu گیت xor قرار گرفته  است.

Af(auxiliary flag):

این بیت وجود یا عدم وجود بیت نقلی را در محاسبه حاصل جمع بیت شماره 3از دو ثبات نشان می دهد این بیت در محاسبات bcd مورد استفاده قرار می گیرد.

Zf(ziro flag):

این بیت وضعیت صفر شدن همه بیت های eax را نشان می دهد به عبارت دیگر اگر بر اثر عملی چه منطقی چه محاسباتی کلیه بیت های eax صفر شود این بیت فعال خواهد شد.

Sf(sign flag):

در صورت استفاده از اعداد علامت دار بیت علامت در این بیت ذخیره می شود . در صورتی که عمل چرخش یا انتقال روی محتویات یک ثبات صورت پذیرد وضعیت بیت علامت در صورت تغییر آن در این بیت ذخیره می شود.

نکته:

در صورتی که در یک عدد علامت دار تغییر علامت ناخواسته رخ دهد حالت over flow پیش می آید. بنابراین اعداد علامت دار را نباید به صورت منطقی شیفت داد بلکه باید به صورت محاسباتی شیفت داد.

tf(trap flag) :

این بیت نحوه اجرای دستورات توسط cpu را نشان می دهد. به این صورت که یا دستورات طبق روال منطقی برنامه به صورت پشت سر هم و پی در پی با دادن یک بار دستور اجرا می شود و یا در حالتی هستیم که دستورات به صورت مرحله به مرحله اجرا خواهند شد یعنی با هر بار اجرای دستور فقط یک دستورالعمل اجرا خواهد شد و نتیجه ی حاصل از آن به دست خواهد آمد. اگر tf یک باشد در حالت single step (قدم به قدم یا مرحله به مرحله) و اگر صفر باشد در حالت normal (پی در پی) هستیم.

If(interup flag) :

برای ارتباط cpu با دنیای خارج cpu از دو حالت زیر استفاده می کند.

Poling(سر کشی),interup(وقفه):

در روش سرکشی برای بررسی عناصر جانبی و بررسی اعلام آمادگی این عناصر برای دریافت و ارسال اطلاعات cpu هر بار خطوط کنترلی هر یک را بررسی می کند به عبارت دیگر با سرکشی به هر یک از این عناصر آمادگی یا عدم آمادگی آن ها را بررسی می کند. در کارهای صنعتی وقتی که تعداد عناصر جانبی کم است از این روش استفاده می شود در ضمن این روش از نظر سخت افزار و نرم افراز بسیار راحت است اما یک اشکال بزرگ دارد و آن این است که cpu در هنگام سر کشی هیچ کار دیگری نمی تواند انجام دهد زیرا دائما در حال سرکشی است.

خطوط ارتباطی بین ابزار و cpu را خطوط وقفه می گویند هر وقفه دارای یک درخواست(request) و یک پاسخ(acknowledge) می باشد.

وقفه در cpu بر دو نوع است:

1) وقفه قابل صرفه نظر شدن یا maskable.

2) وقفه غیر قابل صرفه نظر شدن یا non-maskable.

فقط یک وقفه است که غیر قابل صرفه نظر شدن است که همان وقفه nmi می باشد و به کلید reset روی سیستم متصل شده است یعنی تحت هر شرایطی cpu باید به این وقفه جواب دهد و بالاترین اولویت را دارد و مستقیما به پایه ی nmi میکروپروسسور وصل است بقیه ی وقفه که قابل صرفه نظر هستند اولویت بندی شده و در اختیار عناصر دیگر قرار می گیرند.

اگر بیت وقفه یک باشد علامت پذیرش وقفه است و اگر صفر باشد بیانگر عدم پذیرش وقفه است(در مورد وقفه های قابل صرفه نظر شدن).

DF(flag(direction

این بیت وضعیت ارسال اطلاعات در صورت استفاده از روش آدرس دهی شاخص(ESI,EDI) را نشان می دهد وبسته به مقادیر مختلف داده ها را از مبدا به مقصد و یا بلعکس منتقل می کند و در صورتی که اطلاعات از مبدا به مقصد منتقل می شود DF صفر است، ESI,EDIدر آغاز در ابتدای حافظه قرار دارند و در هر بار انتقال اطلاعات ESI,EDI یک واحد اضافه می شود وقتی عمل ارسال اطلاعات به مقصد تمام می شود ESI,EDI در انتهای بخش حافظه قرار دارند در این صورت اگر لازم باشد اطلاعات دوباره به مبدا فرستاده شوند DF باید یک شود و در این صورت با هر بار ارسال اطلاعات از ESI,EDI یک واحد کم می شود.

حجم اطلاعات منتقل شده از مبدا به مقصد و یا بلعکس را ثبات CL می گوییم.

OF((over flow:

اگر در یک محاسبه در اعداد با علامت over flow رخ دهد (یعنی یک بیت اضافه بیاوریم) این بیت یک خواهد شد.

Nt,Pl,Io:

این سه بیت مربوط به عملکرد cpu و در وضعیت حفاظت شده است.

وضعیت های کاری cpu های 80286 به بالا:

1)    وضعیت read mode :

 اینکه هر cpu می تواند دستور العمل های 8086 را اجرا کند. در این صورت حافظه به چهار بخش 64 کیلو بایتی تقسیم می شود.

2)    وضعیت protected mode :

 دراین وضعیت cpu  می تواند حافظه را به طور کامل تقسیم کرده و در هر قسمت یک برنامه مجزا را اجرا کند. در این صورت هر بخش از حافظه اصلی مانند یک حافظه مجزا عمل می کند.

3)    وضعیت virtual mode:

در این وضعیت cpu می تواند که آدرس دهی مجازی انجام دهد پس می تواند حجم حافظه را به طور مجازی افزایش دهد.

د)ثبات های بخشsegment registers:

این ثبات ها برای ساخت آدرس بخش های حافظه استفاده می شود حافظه اصلی برای اجرای برنامه به چهار بخش تقسیم می شود.

1) بخش دستورات(code segment)

2) بخش داده(data segment)

3) بخش پشته(حافظه موقت)(stuck segment)

4)    بخش اضافه باکمکی(extra segment)

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

CS یا ثبات بخش کد(code segment register):

این ثبات آدرس ابتدای بخش دستورات را ذخیره می کند.

DS  یا ثبات بخش داده(data segment register):

این ثبات آدرس ابتدای بخش داده را ذخیره می کند.

SS یا ثبات بخش پشته(stack segment register):

این ثبات آدرس ابتدای بخش پشته را ذخیره می کند

ES ثبات بخش کمکی(extra segment register):

این ثبات آدرس ابتدای بخش کمکی را در خود ذخیره می کند.

ثباتIP در بخش کد وظیفه اش اشاره به دستورالعملی است که باید اجرا شود و در آدرس آن cs:ip است.

ثباتBP در بخش data مورد استفاده قرار می گیرد و دسته ی به آن به صورت ds:bp است.

ثباتSP در بخش stack مورد استفاده قرار می گیرد و دسته ی به آن به صورت ss:sp است. چون sp با حجم پشته پر می شود با هر بار ورود اطلاعات به آن (پشته) از sp کم خواهد شد.

در قبال برنامه نویسی معمولا آدرس ابتدای بخش دستورات و اضافی یکی هستند.

نکته: ثبات های بخش در همه cpu های خانواده x86 ،16 بیتی هستند.

CS:

Cs ثباتی 16 بیتی است به آدرس شروع بخش دستور در حافظه اصلی را برای برنامه ای که در حال اجرا است در خود دارد. بخش دستورشامل کلیه دستورات برنامه نویسی شده که با مشخص کردن آدرس شروع بخش دو آغاز شده و به دستورend ختم می شود. برای ساخت آدرس در وضعیت read mode باید محتوای cs در f ضرب شده و حاصل به عنوان بخش ثابت در ساخت آدرس مورد استفاده قرار گیرد به عبارت دیگر:

Effective address = cf  f + ip

با ضربf در cs چهار بیت صفر درسمت راست خواهیم داشت.

آدرس موثر آدرس دسته ی به یک خانه حافظه است.

Offset همواره فاصله از آغاز یک بخش خواهد بود.

مراحل اجرای یک دستورالعمل در cpu:

1) fetch: یعنی برداشت دستورالعمل از حافظه که توسط address unit, bus unit انجام می گیرد.

2) decode: یعنی برگرداندن کد دستورالعمل که توسط execution uint انجام می گیرد.

3) execute: یعنی اجرای یکی دستورالعمل.

بخش های یک cpu:

1) bus unit : کار نقل و انتقال داده ها و دستورات است.

2) address unit: کار این قسمت ساخت آدرس دستورالعمل است.

3) exe cution unit: کار این قسمت اجرای یک دستورالعمل است.

این بخش شامل دو قسمت است:

الف) insttraction queue:

ب) execution unit:

هر چه حجم صف یا queue در cpu بیشتر باشد سرعت اجرا بیشتر است معمولا بین هشت یا چهارده دستورالعمل در cpu کدشان برای اجرا آماده می شود.

Ds:

 ثباتی 16 بیتی است که از آن برای مشخص کردن آدرس شروع بخش داده در حافظه اصلی استفاده می شود. بخش داده حاوی کلیه داده ها و احتمالا محل هایی است که به عنوان متغیر برنامه نویسی مورد نیاز می باشد. برای دسترسی به داده هایی ذخیره شده در این بخش نیز آدرس موثر با فرمول زیر بدست می آید:

این offset بسته به نوع آدرس دهی می توان edi,bp یا es باشد در بخش داده می توان ثابت ها و متغیرها را ذخیره کرد.

Ss:

ثباتی 16 بیتی است که می توان آدرس شروع حافظه پشته در هنگام برنامه نویسی را در خود ذخیره کند. برای آدرس دهی به stack و یا ذخیره و بازیابی اطلاعات در آن داریم.

این offset می تواند sp یا ebp باشد. توجه کنید که ebp در نوع خاصی از برنامه های اسمبلی که بخش داده و پشته یکی باشند می توانند مورد استفاده قرار گیرند.

نکته:maximom مقدار هر بخش در حافظه 64 کیلو بایت است.

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

هر فایل اسمبلی با پسوند asm قابل شناسایی است که فایلی از نوع متنی با کد اسکی است این فایل را باید توسط اسمبلرtasm) .exe یا (masm .exe به این فایل آبجکت (obj) تبدیل کرد و سپس با استفاده از لینک (link .exe) آن فایل آبجکت را به فایل exe تبدیل کرد.

فایل exe را می توان تحت هر شرایط خاصی توسط exe2bin .exe به فایل با پسوند com تبدیل کرد.

فایل های exe و com:

خصوصیات فایل های exe:

1) فایل های exe هر چهار بخش es ,ss , ds ,cs را دارد.

2) حجم فایل های exe محدود نیست یعنی فایل exe می تواند تا maximom حجم حافظه  حجم داشته باشد بنابراین فقط از 256KB استفاده نمی کند بلکه کل حافظه پایه را (حافظه اصلی) به چهار بخش تقسیم می کند.

3) آدرس شروع آن ها ثابت نیست یعنی بخش ها در فایل exe دارای آدرس ثابت نیستند بلکه دارای آدرس شناوراند و در هر جای حافظه می توانند قرار گیرند. پس فایل exe اصطلاحا یک فایل reloeatable است.

خصوصیات فایل های com:

1) فایل های com فقط یک بخش دارند یعنی es ,ss , ds ,cs همه یکی هستند.

2) حجم فایل com حداکثر 64KB است چون یک بخش بیشتر نداریم.

3) آدرس شروع آن ثابت است یعنی برای ساخته شدن آدرس نیازی به ساخت آن نداریم. آدرس شروع هر برنامه از نوع com.100hex است به عبارت دیگر اولین مقداری که ip می گیرد 100hex است.

4) برای فایل com به هیچ عنوان نباید بخش پشته تعریف شود یعنی ss نباید در متن برنامه اسمبلی تعریف شود چرا که پشته را خود سیستم تعریف می کند.

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

1)    فایل های com             2) فایل های exe               3) فایل های bat

نکته: header(یک اطلاعات عمومی درباره فایل می دهد) فایل های 256 ,exe بایت وheader فایل 512b است .

نکته: فایل های exe اگر خیلی بزرگ باشند می توان در کنار آن ها فایل هایی با پسوند (over lait file)ovl ایجاد کرد.

این فایل ها دنباله فایل exe هستند که دارای header نیست.

نکته: در هنگام ایجاد یک فایل com چون stack تعریف نشده هنگام link کردن لینکرپیام خطای no stack defined را خواهد داد البته لینکر فایل exe را تولید خواهد کرد.

4/8/84

انواع خطاها در ماکرو اسمبلر و لینکر:

1) خطاهای اساسی:

خطاهایی هستند که روال تبدیل را متوقف می کند یعنی اگر در هنگام تولید یک فایل object یک خطای اساسی رخ دهد دیگر فایل object تولید نخواهد شد در این صورت پیام خطا و نوع خطا به همراه توضیح آن چاپ خواهد شد.

2) خطاهای هشداری:

این خطاها روال تبدیل را متوقف نمی کند مثلا خطای no stack defind از نوع خطاهای هشداری است.

فرم کلی دستورات در زبان اسمبلی

[label:] mnemonic [operand(s)] [;commed]

Label (برچسب):

فایلی است که برای یک دستور در نظر گرفته می شود. این نام حداکثر 32 فرمی است و حتما به علامت : ختم می شود و می تواند شامل حروف a..z , c..z ارقام  0..9و برخی علائم خاص باشد مانند:

0,?,@,_,$

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

نکته: اسمبلی  حساس به متن نیست (یعنی حروف بزرگ و کوچک فرقی نمی کند).

Mnemonic (کد دستور):

که معادل زبان اسمبلی که برای هر دستور در زبان ماشین قرار می گیرد و حداقل یک حرفی و حداکثر 7 حرفی است.

Operand (مولفه):

هر دستور موجود در زبان اسمبلی بسته به نوع و روش آدرس دهی ممکن است دارای صفرتا سه مولفه باشد این مولفه یا یک ثابت است یا هم خانه ای از حافظه است یا یک مقدار ثابت است.

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

آدرس خانه ای از حافظه که 32 بیتی  mem-32:

آدرس خانه ای از حافظه که 16 بیتی  mem-16:

آدرس خانه ای از حافظه که 8 بیتی mem-8:     

می توان بجای اسم خانه ای از حافظه آدرس خانه ای از حافظه را در دستور قرار داد که در این صورت بین  قرار می گیرد. در این صورت [address]محتوای آن آدرس را نشان خواهد داد.

ثوابت به دو دسته تقسیم می شوند:

1) عددی:

ثوابت عددی به سه دسته تقسیم می شوند:

الف) decimal                    ب) hexa decimal                      ج) binerg

ثابت decimal ثابتی است که در انتهای آن حرف d ذکر شود مانند:

(یعنی 89 یکی واحد دهی) 89d

طبق قرارداد می توان حرف d را حذف کرد بنابراین عددی که در انتهای آن حرفی نباشد یک عدد را  decimalاست.

89

ثابت hexadecimal ثابتی است که در انتهای آن حرف h ظاهر شود مانند:

89h           8a (یک بیت اضافه می شود)

ثابت باینری ثابتی است که در انتهای آن حرف b قرار گیرد.

01011101b

نکته: اگر یک داده و محلی که قرار است داده در آن قرار گیرد انطباق برقرار نباشد خطای    mis matchرخ می دهد. مانند هنگامی که بخواهیم یک مقدار 16 بیتی را در ثبات ah قرار دهیم.

نکته: برای اعداد علامت دار منفی دسیمال گذاشتن علامت منفی در پشت عدد کفایت می کند اما اعداد منفی باینری و hexadecimal حتما باید به فرم مکمل دو باشند.

2) کاراکتری:

مجموعه ای از کاراکترها که در داخل علامت های' ' قرار گیرد ثابت کاراکتری است. یک ثابت کاراکتری در زبان اسمبلی همواره یک بایت است بدون توجه به تعداد کاراکترها.

Comment (توضیح):

هر توضیح با منفی که لازم باشد به دستور اضافه کنیم تا دستور واضح شود هر توضیح حتما باید بعد از علامت ؛ قرار گیرد. توضیحات در هنگام تبدیل به زبان ماشین در نظر گرفته نخواهد شد.

روش های آدرس دهی در real mod:

1) آدرس دهی ثباتی (register addressing)

در این روش آدرس دهی مولف های دستور به کار رفته حتما ثبات های cpu هستند معمولا ما برای هر دستورالعمل یک مبدا (source) و یک مقصد (destination). در این روش آدرس دهی هم مبدا و هم مقصد باید ثبات باشند. شکل کلی این نوع آدرس دهی به فرم زیر است:

Instruction register, register

2) آدرس دهی فوری (immediate addressing)

اگر در عمل انتسال مبدا یک مقدار ثابت هشت بیتی، 16 بیتی یا 32 بیتی باشد عمل آدرس دهی بلافصل (فوری) را خواهیم داشت. شکل کلی آن به فرم زیر است:

 Instruction destination , constant

مثال)

Mov ax,100 ; ax = 100;

مقصد می تواند یک ثبات cpu و یا یک خانه از حافظه باشد از این روش معمولا برای مقدار دهی اولیه ثبات ها استفاده می کنند.

3) آدرس دهی مستقیم (direct addressing)

در این روش آدرس دهی آدرس مولفه با نامی که برای مولفه در حافظه قرار داده ایم به طور مستقیم در دستورالعمل ذکر می شود. شکل کلی آن به فرم زیر است:

Instruction register , soure

مبدا نام یک خانه از حافظه است که حتما باید در بخش داده تعریف شده باشد. بسته به نوع ثبات از آدرس داده برداشته می شود به عنوان مثال برای ثبات ax دو بایت از حافظه برداشته می شود.

4) آدرس دهی غیر مستقیم با ثبات (register indirect addressing)

  در این نوع آدرس دهی cpu آدرس موثر را از جمع محتوای یکی از ثبات های di,bp,bx و یا si یا محتوای ثبات ds (که به ابتدای segment داده اشاره می کند) به دست می آید. در این صورت باید ثبات را در  قرار دهیم. شکل کلی آن به فرم زیر است:

Instruction register,[register]

; ax=[ds+bx]Mov ax,[bx]

در مثال فوق محتوای bx آدرس نسبی است و [bx] به داده ی ذخیره شده در آن آدرس اشاره می کند.

5) آدرس دهی نسبی با ثبات پایه(base relative addressing):

در این آدرس دهی cpu آدرس موثررا از جمع محتوای ثبات bp,ds یا bx و یک مقدار ثابت بدست می آورد.

Instruction register,[register+constant]

Mov ax,[bp+100]

تمرین: در مورد 2 نوع آدرس دهی دیگر یعنی:

6) آدرس دهی مستقیم با ثبات شاخص(direct index addressing).

7) آدرس دهی شاخص دار با ثبات پایه(base indexed dressing).

تحقیق کنید؟

شبه دستورات  pseudo- code:

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

الف) دستورات اجرایی

ب) دستورات غیر اجرایی (شبه دستورات)

دستورات اجرایی دستوراتی هستند که اسمبلر در زمان ترجمه برنامه معادل زبان ماشین آن را تولید می کند ولی دستورات غیر اجرایی دستوراتی هستند که معادل زبان ماشین ندارند و اسمبلر کدی برای این دستورات تولید نمی کند.

11/8/84

الف) شبه دستورات تعریف داده:

تعریف ثوابت: برای تعریف ثوابت از دستور equal به شکل زیر استفاده می شود

Name equ data :فرم کلی

Name، نام یک مقدار ثابت و نام یک خانه ی حافظه می باشد.

Data، یک مقدار ثابت است که می تواند مقداری عددی، کاراکتری، آدرس حافظه و یا یک ثبات باشد.

مثال:

مقدار عددی ;data-1 equ 10eh

مقدارکاراکتری ;data-2 equ 'root'

آدرس ;data-3 equ [si]

ثبات ;data-4 equ cx

نکته:

در صورت استفاده از equ دیگر نمی توان تعریف مجدد برای آن نماد را داشت. در صورتی که بخواهیم امکان تعریف مجدد فراهم باشد بجای equ باید از = استفاده کرد . استفاده از علامت = خاص عبارت عددی است.

مثال)

غلط

 

Data-1 equ 10

Data-1 equ 20

درست

 

Data-1 = 10

Data-1 = 20

تعریف متغیرها: برای تعریف متغیرها از دستور define به شکل زیر استفاده می شود:

Name dx data [dup()] :فرم کلی

Name: نام متغیر              

Dx: نوع متغیر

Data: مقدار اولیه متغیر

حالات x:

فضای یک بایتی   db

فضای دو بایتی     dw

فضای چهار بایتی   dd

فضای هشت بایتی   dq

فضای ده بایتی   dt

مثال)

Data1 db 01h

Data-2 dw 2ef1h

Data-3 dd 3a00eh

در صورت که بخواهیم مقدار اولیه برای متغیر تعریف نکنیم بجای data از ؟ استفاده می کنیم.

مثال)

Data-4 dw ?

بنا به تعریف هر ثابت کاراکتری در زبان اسمبلی فقط و فقط در یک بایت قرار می گیرد و از علامت ' ' (تک کتیشن) برای نمایش آن استفاده می شود.

مثال)

Data-5 db 'this is a test'

ثوابت کاراکتری فقط یک بایتی می باشند پس همیشه از نوع db تعریف می شوند.

در اسمبلی آرایه هم می توان تعریف کرد . کافی است برای یک مقدار چند مقدار را در جلوی متغییر قرار دهیم.

مثال)

Data6 db 32,20,18,90,46

برای دست رسی به عناصر آرایه       

Data6=32

Data6+1=20

Data6+2=18

 Mov ax,data6+1:مانند

اختصاص فضای بیش از 10 بایت مستلزم استفاده از فیلد تکرار یا dup است.

در این صورت data ضریب تکرار برای داده مشخص می کند و در داخل پرانتز جلوی dup مقداری که باید تکرار شود را قرار می دهیم.

مثال)

Data7 db 5,5,10,10,10,10,10,8,8,8 ; data7 db 2dup(5),5dup(5),3dup(8)

آرایه ای به طول 100 کلمه یا 200 بایت بدون مقدار اولیه Data7 dw 100dup(?) ;

در زبان اسمبلی تعریف داده چندین خط را می تواند به خود اختصاص دهد. ولی توجه کنید که نوع داده را نمی توان عوض کرد.

مثال)

Data9 dd 20dup(10)

           dd 30dup(0)

 Data10 db 'first'

              db 'second'

              db 'third'

شبه دستورات ارجاع خارجی:

برنامه های نوشته شده در زبان اسمبلی ممکن است شامل چندین بخش یا ماژول باشد اگر این ماژول ها بخواهند داده هایشان را به اشتراک بگذارند این کار با استفاده از دو شبه دستور  public,extrn به شکل زیر فراهم می شوند.

Public symbol[,…]:فرم کلی

این شبه دستور به ماژول های نوشته شده و ترجمه شده به طور جداگانه که در زمان لینک کردن به هم پیوند خورده اند اجازه می دهد که از نمادهایی که در این شبه دستور مشخص شده است به طور مشترک استفاده نماید. با این کار از تکرار داده های مشابه در ماژول های مختلف که جداگانه نوشته شده اند جلوگیری می شود.

Extrn name:type[,…] :فرم کلی

این شبه دستور برای اسمبلر مشخص می کند که داده های موجود در این شبه دستور در این ماژول تعریف نشده اند بلکه در ماژول های دیگری نوشته شده اند که توسط شبه دستور public به اشتراک گذاشته شده اند. به عبارت دیگر آن داده ها برای این ماژل خارجی هستند. نوع یا type بسته به نوع داده یکی از وظعیت های زیر است:

الف) اگر name ، داده ای باشد که در سگمنت داده یا اضافی تعریف شده باشد آنگاه type یکی از کلامات کلیدی byte,word یا dword خواهد بود.

ب) اگر name ، نام ثابتی باشد که توسط دستور equal یا مساوی تعریف شده باشد آنگاه type ، کلمه کلیدی abs خواهد بود.

ج) اگر name ، نام یک روال باشد آنگاه type یکی از دو کلمه ی کلیدی near یا far خواهد بود.

شبه دستور دیگری که می تواند در این بخش مورد استفاده قرارگیرد ، شبه دستور include است که به فرم زیر تعریف می شود:

Include filename :فرم کلی

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

18/8/84

ج) شبه دستورات تعریف سگمنت:

شکل کلی تعریف سگمنت به فرم زیر است:

Seq-name segment [aligm-typy] [combin] [class]

مجموعه دستورات یا داده ها   

 

Seg-name ends

با این دستور می توان یک سگمنت را تعریف و ابتدا و انتهای آن را مشخص کنید.

Align-typy یا نوع هم ترازی:

از عملوند برای تعیین و انطباق شروع یک سگمنت با آدرس حافظه بکار می رود و دارای حالات زیر است:

الف) byte: سگمنت از هر آدرسی می توند شروع شود.

ب) word: سگمنت از هر آدرس زوجی می تواند شروع شود.

ج) para: سگمنت از هر آدرس که قابلیت تقسیم بر 16 را داشته باشد می تواند شروع شود.

د) page: سگمنت از هر آدرسی که قابلیت تقسیم بر 256 را داشته باشد می تواند شروع شود.

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

combin type یا نوع ترکیب:

از این عملوند برای تعیین ترکیب سگمنت در حال تعرف یف با سایر سگمنت های همنام در سایر ماژول ها استفاده می شود و دارای حالات زیر است:

الف) public: دو سگمنت هم نام به طور متوالی در حافظه قرار می گیرند.

ب) comment: دو سگمنت هم نام از یک ناحیه به طور مشترک استفاده می کنند.

ج) stack: در سگمنت های از نوع پشته باید از این حالت استفاده شود.

در صورتی که نوع ترکیب ذکر نشود حالت پیش فرض public خواهد بود.

Class:می تواند یکی از حالات زیر باشد:

الف) 'code': برای سگمنت کد.

ب) 'data': برای سگمنت داده.

ج) 'stack': برای سگمنت پشته.

د) 'extra': برای سگمنت اضافی.

مثال)

تعریف سگمنت کد:

Cseg segment para public ['code']

                                      Assume  cs:cseg,ds:dseg,ss:sseg,es:eseg     

                           Mov ax,05h

Add ax,bx

Cceg ends

مثال)

تعریف سگمنت داده:

Dseg segment para public ['data']

                                      Data1 db ?

         Data2 dw ?         

Dseg ends

مثال)

تعریف سگمنت پشته:

Sseg segment para stack ['stack']

 Dw 32dup(?)      

Sseg ends

تعریف سگمنت اضافی:

Eseg segment para public 'extra'

                   Str1 db 'abcdefghijklm'

         Str2 db 'nopqrstuvwxyz'

Eseg ends

نکنته:

همان طور که در مثال تعریف پشته دیده می شود استفاده از دستور define در این بخش نیازی به اسم ندارد چرا که پشته نیاز به آدرس دهی ندارد و همچنین در داده های موجود در پشته مقدار اولیه در نظرگرفته نمی شود و همچنین تعریف سگمنت پشته  معمولا(نه همیشه) شامل تعریف یک آرایه با استفاده از دستور dup است.

شبه دستور assume:

این دستور برای تعیین آدرس متاظر ثباتهای بخش بنام بخش ها بکار می رود و به شکل کلی زیر است:

Assume seg-reg:segname[,…] :فرم کلی

Seg-reg یکی ازمقادیر cs,ds,ss,es است و segname نام گمنت متناظر با ثبات ذکر شده است . این دستور همیشه در ابتدای تعریف سگمنت برنامه قرار می گیرد.

د) شبه دستور proc:

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

Proc name proc [attribute]

 

 

شبه دستورات          

 

Ret

Proc-name endp

Proc-name نام روال مورد نظر است و attribute یکی از دو کلمه ی کلیدی near و far می باشد.

روال ها به دوسته خارجی و داخلی تقسیم می شوند . اگر روال تعریف شده فقط از داخل سگمنتی که این روال تعریف شده است قابل فراخوانی باشد روال را داخلی گویند و از کلمه ی کلیدی near برای آن استفاده می شود. اما اگر روال تعریف شده بتواند از سگمنت های  دیگر قابل فراخوانی شود آنگاه روال را خارجی می نامند و از کلمه ی کلیدی far برای آن  استفاده  می شود در صورتی که هیچ صفتی برای روال ذکر نشود اسمبلی به طور پیش فرض صفت near را برای روال در نظر می گیرد.

نکته:

دستور ret در انتهای روال کنترل را به دستورالعمل بعد از دستورالعمل call ( یا دستورالعمل فراخواننده روال ) منتقل می کند.

 

25/8/84

هـ) شبه دستور کنترل اجرای برنامه شبه دستورend:

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

[entry point lable] end

برچسب نقطه شروع مکانی است که سیستم عامل اجرای برنامه را شروع نموده است در صورتی که برنامه اسمبلی ماژول های مختلفی داشته باشد فقط end ماژول اصلی می تواند دارای برچسب باشد و end سایر ماژول ها حتما نباید دارای بر چسب باشد.

شبه دستورeven:

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

Even

این شبه دستور هیچ پارامتری ندارد.

مثال)

Dseg seg para public 'data'

Hour db?

Even

Message db 'press any key to eontinue…'

Dseg ends

شبه دستورorg:

از این شبه دستور برای تغییر محتویات ثبات اشاره گر دستورالعمل (ip) در هنگام شروع برنامه برای اجرا استفاده می شود و به فرم کلی زیر می باشد:

Org address

آدرس تعریف شده در شبه دستورorg هنگام اجرای برنامه در ثبات ip قرار خواهد گرفت ازا ین دستور به شکل org 100h برای برنامه های اجرایی از نوع com مورد استفاده قرار می گیرد. زیرا همان طور که گفته برنامه های اجرایی نوع com حتما از این نوع آدرس باید شروع و اجرا شود.

2/9/84

دستورات انتقال داده ها:

این مجموعه دستورات عمل انتقال داده و یا آدرس بین ثبات های مختلف cpu و یا ثبات ها و حافظه و یا ثبات ها و io را انجام می دهند این مجموعه دستورات به چهار دسته کلی تقسیم می شوند.

1) دستورات عمومی  2) دستورات io 3 ) انتقال آدرس  4) انتقال flag

دستورmove:

یکی از دستورات عمومی برای انتقال داده بین بخش های مختلف cpu حافظه و یا io است.

Mov destination,source

دستورات move حتما دارای دو مولفه است. مقصد در دستورmove می توان ثبات cpu و یا محلی از حافظه باشد، مبدا نیز می تواند ثبات cpu، محلی از حافظه و یا مقدار ثبات باشد.

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

Move datal,data2

هم مبدا و هم مقصد نمی تواند آدرس محلی از حافظه باشد.

نکته2) در دستور move حتما باید انطباق بین مبدا و مقصد برقرار باشد.

مثال)

Mov eax,edx

Mov ax,cx

Mov al,cl

Mov ax,mem-16

Mov bx,o

Mov cx,o5h

دستورات آدرس دهی پشته:

این دستورات احتیاج به تهیه آدرس ندارند.

دستورpush:

Push regname

از این دستور برای قرار دادن مقدار یک ثبات در حافظه پشته استفاده می کنیم معمولا بخش پشته یک بایتی است بنابراین برای ذخیره مثلا ثبات ax داریم:

 

ah

al

 

هشت بیت پایین

 

                                         

 
 

هشت بیت بالا

 

 

 

 

نکته:

توسط این دستور نمی توان ثبات بخش و ثبات flag را در حافظه ذخیره کرد. چرا که ثبات بخش مقدارش از اول برنامه تا آخر برنامه تغییرنمی کند.

مثال)

Push dx

Push ebx

دستورpop:

از این دستور برای بازیابی اطلاعات ذخیره شده stack استفاده می کنید در هنگام برداشت اطلاعات نیز به نکات مشابه دستور push توجه داشته باشید. روال بازیابی و ترتیب قرارگیری ثبات ها در هنگام بازیابی اطلاعات ذخیره شده عکس ترتیب ذخیره آن ها است.

مثال)

آخرین ثباتب که push کردیم اولین ثباتی است که pop می شود.

 

Push dx

Pop ebx

Pop dx

نکته:

اگرترتیب بازیابی به هم بخورد یا حالت تساوی بین تعداد دستورات pop,push به هم بخورد خطاهای مربوط به stack مانند

pop without push , push without pop

مثال)

Push ax                                            push ax

Pop without push

 

 

Push without pop

 

Push bx                                            push bx

Pop ax                                             push bx

دستورpush flag:

pushf :فرم کلی

از این دستور برای ذخیره ثبات flag در حافظه پشته استفاده می کنیم.

دستور pop flag:

popf :فرم کلی

از این دستور برای بازیابی ثبات flag از حافظه پشته استفاده می کنیم.

دستور push all general register:

Pusha  :فرم کلی

از این دستور برای ذخیره تمام ثبات های عمومی بره ترتیب  di,si,bp,sp,bx,dx,cx,ax استفاده می شود.

دستور تعویض مقادیرexchange:

Echg destination,source :فرم کلی

از این دستور برای تعویض مقادیر دو ثبات از cpu یا یک ثبات و یک خانه حافظه استفاده می کنیم. مقصد می تواند ثبات cpu یا محلی یا محلی از حافظه باشد و مبدا نیز می تواند ثبات cpu یا محلی از حافظه باشد.

توجه کنید که هر دو مولفه نمی توانند محلی از حافظه باشند. باید انطباق بین مبدا و مقصد برقرار باشد.

مثال)

Xchg al,bl

Xchg mem-32,ebx

دستورات وردی خروجی:

دستور input:

in destination,address  :فرم کلی

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

در این دستور مقصد فقط می تواند ثبات eax,ax یا ah باشد. علت آن این است که ax تنها ثبات است که به گزرگاه داده وصل شده است. آدرس نیز، آدرس پرت  ابزار ورودی است. بعضی آدرس های متداول پرت عبارتند از:

300h     network,adapter

378h     lpt1

3f8h     com1

2f8h     com2

3e8h     com3

2e8h     com4

نکته ی 1:

در دستور in ثبات al قرار نمی گیرد.

نکته ی 2:

کامپیوتر می تواند 256 ابزار ابزار ورودی خروجی را آدرس دهی کند. و از آن استفاده کند. اما در عمل کامپیوتر به تعداد slot هایش می تواند ابزار ورودی/خروجی داشده باشد.

نکته ی 3:

تنها ثباتی که مجاز است محتوای آدرس پرت باشد ثبات dx است.

مثال)

Mov dx,300h

In ax,dx

دستور output:

Out address,source :فرم کلی

در این دستور address، آدرس پرت خروجی و source یکی از ثبات های ax,eax یا ah (اما نه al) می باشد. به وسیله ی این دستور مقداری را روی خط داده قرار می دهیم. آدرس ابزار خروجی می تواند مشابه دستور in در dx قرار بگیرد.

مثال)

Mov dx,300h

Out dx,ax

Mov ax,05h

Out 3f8h,ax

9/9/84

انتقال flag:

دستورload ah from flag:

lahf :فرم کلی

این دستور flag را به ah منتقل می کند مقدار آن در ah به صورت زیر قرار می گیرد:

cf

1

pf

o

ax

o

zf

sf

دستور save ah to flag:

فرم کلی sahf:

این دستور ah را در flag ذخیره می کند.

مثال) دستورات زیر چه عملی را انجام می دهد؟

Mov ah,o3h

Sahf                                                    o3h=00000011

(بیت کری فعال می شود)

دستورات محاسباتی:

Add  adc  sub  sbb  inc  dec  mul  imul  div  idiv

 دستورات منطقی:

And or xor not test

دستورات محاسباتی (توضیحات):

دستور addition:

فرم کلی add destination, source:

در این دستور مقصد می تواند ثبات یا خانه حافظه و مبدا می تواند ثبات یا خانه حافظه یا مقدار ثبات باشد. اما هر دو هم زمان نمی توانند به طور هم زمان خانه ای از حافظه باشد حاصل اجرای دستور فوق به شکل زیر است:

Destination=destination+ source

این دستور روی cf اثر می گذارد اما آن را در محاسبه در نظر نمی گیرد.

دستورaddition with carry:

فرم کلی adc destination,source:

این دستور مانند دستور قبلی است با این تفاوت که کری را نیز در نظر می گیرد.

Destination= destination+source+cf

مثال) فرض کنید که یک عدد 64 بیتی در دو خانه از حافظه به نام a1,a2 به شکل زیر ذخیره شده باشد.

63                  32  31                       0                                            

A1

A2

عدد b نیز به طور مشابه دردو خانه b1,b2 در حافظه ذخیره شده است. برنامه بنویسید که این دو عدد 64 بیتی را با هم جمع کرده و حاصل را در خانه 64 بیتی c به طریق مشابه ذخیره نماید.

Dseg segment para public 'data'

                        A1 dd fa98h

     A2 dd ffffh 

     B1 dd 3ffah

     B2 dd aeo1h

     C1 dd ?

     C2 dd ?

Dseg ends

Sseg segment para stack 'stack'

     Db 32 dap(?)

 Sseg ends

Cseg segment para public 'code'

     Assume cs: cseg,ds: dseg,ss: sseg

     Start: move eax,a1

                                                                        Add eax,b1

     Mov c1,eax

     Mov eax,a2

     Adc eax,b2

     Mov c2,eax 

Cseg ends

End start

دستور subtraction:

فرم کلی sub destination,source:

در این دستور نیز مبدا و مقصد نمی توانند هم زمان به هم خانه ای از حافظه باشند حاصل اجرای دستور فوق به شکل زیر خواهد بود:

Destination=destination-source

دستورsubtraction with borrow:

فرم کلی sbb destination,source:

این دستور همانند دستور فوق است با این تفاوت که کری را نیز در نظر می گیرد.

Destination= destination-source-cf

دستورincrement:

فرم کلی inc destination:

مقصد می تواند ثبات یا محلی از حافظه باشد. این دستور به مقصد یک واحد اضافه می کند.

دستور decrement:

فرم کلی dec destination:

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

دستور negative:

فرم کلی neg destination:

مقصد می تواند ثبات یا محلی از حافظه باشد. این دستور علامت مقدار دو دویی درمقصدراعوض می کند که بااستفاده ازمتمم راانجام می شود.

دستور muitiplication:

فرم کلی: mul source

فرم کلی: imul source

دستور mul جهت ضرب اعداد بی علامت و دستورimul جهت ضرب اعداد با علامت به کار می رود.source می تواند ثبات یا محلی از حافظه باشد در عمل ضرب یکی از پنج حالت زیر ممکن است:

1) ضرب یک بایت دریک بایت

2) ضرب یک کلمه در یک کلمه (کلمه=دوبایت)

3) ضرب یک بایت در یک کلمه

4) ضرب یک کلمه در یک کلمه مضاعف

5) ضرب یک کلمه مضاعف در یک کلمه مضاعف

در ضرب یک بایت در یک بایت:

 مضروب در ثبات al و مضروب فی در source قرار می گیرد و نتیجه حاصل ضرب در ax ذخیره می شود.

source Ax=al

در ضرب یک کلمه در یک کلمه:

 مضروب در ثبات ax و مضروب فی در source قرار می گیرد و حاصل ضرب در dx:ax ذخیره می کند.

source Dx:ax=ax

در ضرب یک کلمه مضاعب در یک کلمه مضاعف:

 مضروب در ثبات eax و مضروب فی در source ذخیره و حاصل ضرب در  edx:eaxقرار می گیرد.

source edx:eax=eax

در ضرب یک بایت در یک کلمه:

 مضروب در al قرار می گیرد و سپس یکی از حالات زیر اتفاق می افتد.

الف) اگر عدد بی علامت باشد آنگاه ah صفر می شود.

ب) اگر عدد با علامت باشد آنگاه با استفاده از دستور cbw ثبات ah علامت عدد ذخیره شده در al را می گیرد.

سپس  مضروب فی در source قرار میگیرد و حاصل ضرب در dx:ax قرار می گیرد.

source dx:ax=ah:al

در ضرب یک کلمه در یک کلمه مضاعف:

 مضروب در ax قرار می گیرد و سپس یکی از دو حالت زیر اتفاق می افتد:

الف) اگر عدد بی علامت باشد آنگاه 16بیت با ارزش صفرمی شود.

ب) اگر عدد با علامت باشد آنگاه با استفاده از دستور cwd،16بیت با ارزش علامت عدد ذخیره شده در ax را می گیرد.

سپس مضروب فی در source قرار می گیرد و نتیجه ضرب در edx:eax ذخیره می شود.

source edx:eax=16b:ax

مثال)

alMul bh;ax=bh

16/9/84

دستور divistion:

فرم کلی: div source

فرم کلی: idiv source

دستور div جهت تقسیم اعداد بی علامت و دستور idiv جهت تقسیم اعداد با علامت مورد استفاده قرار می گیرد.source می تواند مکانی از حافظه یا ثبات باشد در عمل تقسیم یکی از چهار حالت زیر ممکن است اتفاق بیفتد:

1) تقسیم یک کلمه بر یک بایت

2) تقسیم یک بایت بر یک بایت

3) تقسیم یک کلمه مضاعف بر یک کلمه

4) تقسیم یک کلمه بر یک کلمه

تقسیم یک کلمه بر یک بایت:

 مقسوم در ثبات ax قرارداده می شود و مقسوم علیه در source  قرار می گیرد. پس از تقسیم خارج قسمت در ثبات al و باقیمانده در ثبات ah قرارمی گیرد.

source        al=ax

        ah=ax mod source

در تقسیم یک بایت بر یک بایت :

مقسوم در ثبات al قرار می گیرد و پس ثبات ah با توجه به نوع عدد (بی علامت یابا علامت) مقدار دهی می شود و با استفاده از دستور cbw همانطور که گفته شد و مقسوم علیه source قرار می گیرد. پس از تقسیم خارج قسمت در ثبات al و باقیمانده در ثبات ah قرار خواهد گرفت.

 

source        al=ah:al

       ah=ah:al mod source

3) در تقسیم یک کلمه مضاعف بر یک کلمه مقسوم در ثبات های dx:ax یا eax قرار می گیرد و مقسوم علیه در source قرار می گیرد پس از تقسیم خارج قسمت در ثبات dx و باقیمانده در ثبات ax قرار می گیرد.

source dx=dx:ax

ax=dx:ax mod source

4) در تقسیم یک کلمه بر یک کلمه مقسوم در ثبات ax قرار می گیرد و 16بیت با ارزش ax یا ثبات dx با توجه به نوع عدد ذخیره شده در ax مقدار دهی می شود با استفاده از دستور cwd همانطور که گفته شد. سپس مقسوم علیه در source قرار می گیرد پس از تقسیم خارج قسمت در dx و باقیمانده در ax قرار خواهد گرفت.

دستور العمل convert by to to word:

فرم کلی cbw:

این دستور با توجه به یک علامت ثبات al ثبات ah را مقدار دهی می کند اگر بیت علامت ثبات al یک باشد آنگاه کلیه بیت های ثبات ah یک خواهد شد که نشانگر منفی بودن عدد است و اگر بیت علامت ثبات al صفر باشد آنگاه کلیه بیت های ثبات ah صفر خواهد شد.

دستور العمل convert word t double:

فرم کلی cwd:

این دستور العمل با توجه به بیت علامت ax، ثبات dx و یا 16بیت با ارزش را مقدار خواهد داد اگر بیت علامت ثبات یک باشد آنگاه کلیه بیت های ثبات dx و یا 16بیت با ارزش یک خواهد شد که نشانگر منفی بودن عدد است و اگر بیت علامت ثبات ax صفر باشد آنگاه کلیه بیت های ثبات dx و با 16بیت با ارزش صفر خواهد شد.

دستورات منطقی:

این دستورات حتما بر روی flag ها تقسیم می گذارند و در تمامی این دستورات ترکیب خانه ی حافظه و خانه ی حافظه برای هر دو عملوند در زمان واحد غیر ممکن است.

دستورxor,or,and

And destination soure                       

    Or destination source                                                       فرم کلی      

Xor destination source                

این دستورات روی بیت های متناظر مبدا و مقصد عملیات xor,or,and را انجام داده و حاصل را در مقصد ذخیره می کند توجه کنید که حتما باید انطباق باید بین مبدا و

مقصد برقرار باشد این دستورات روی zf,sf,pf,of,cf اثر می گذارد.

 

 

 

 

 

 

 

23/9/84

(a با استفاده از دستور and و یکی از ماسک های زیر می توان وضعیت یک بیت را که ست (یک) یا ری ست شده است معین کرد.

ماسک

شماره بیت

0001h

0

0002h

1

0004h

2

0008h

3

0010h

4

0020h

5

0040h

6

0080h

7

0100h

8

0200h

9

0400h

10

0800h

11

1000h

12

2000h

13

4000h

14

8000h

15

 

b) با استفاده از دستور or معمولا بیت های مختلف را set می کنیم.

c) با استفاده از دستور xor معمولا تست عدم تساوی را انجام می دهیم.

دستور test:

فرم کلی test distination,source

این دستور دقیقا همانند دستور and است با این تفاوت که فقط روی flag ها تاثیر می گذارند و محتویات عملوندها را تغییر نمی دهد.

دستور not:

فرم کلی: not distination

این دستور مکمل یک مقصد را محاسبه کرده و در خود مقصد قرار می دهد. این دستور هیچ تاثیری روی ثبات flag ندارد.

دستورات shift یا انتقال:

این دستورات به دو دسته زیر تقسیم می شوند:

1) شیفت منطقی (logical shift)

2) شیفت محاسباتی (arithmetic shift)

دستورات چرخش یا rotate:

این دستورات به دو دسته زیر تقسیم می شوند:

1) چرخش با کری                         2) چرخش بدون کری

دستورات شیفت و چرخش دارای فرم کلی زیر هستند:

Command destination,count

که در آن Command اسم دستورdestination مقصد و count تعداد دفعات تکرار عمل انتقال یا دوران است.

انتقال منطقی:

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

 

­­­­­­0          cf                                                                                             7

 

 

 

 

 

 

 

 

 

 

           0   

     

       
 
   
 

 

 

فرم کلی دستورآن به شکل زیر است:

فرم کلی: shr destination,count

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

                                                           0                                                                  7                  cf

0

 

 

 

 

 

 

 

 

 

 

               

       
   
 

 

 

 

فرم کلی آن به شکل زیر است:

shl destination,count

برای اعداد بی علامت می توان از شیفت منطقی استفاده کرد و خطایی نیز به وجود نمی آید اما در اعداد با علامت اگر تغییر علامت نا خواسته رخ دهد با خطای over flow مواجه می شود برای حل این مشکل از شیفت محاسباتی استفاده می کنیم.

انتقال محاسباتی:

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

cf                   0                                                                  7    

 

عمل انتقال به راست محاسباتی به شکل زیر است که در آن اولین بیت در cf قرار می گیرد و بیت علامت در خودش کپی می گردد و بدین وسیله از تغییر علامت ناخواسته جلوگیری می شود.                                                  

 

 

 

 

 

 

 

 

 

 

             

 

       
 
   
 

 

 

فرم کلی آن به شکل زیر است:

Sar destination,count

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

 

 

                                                           0                                                                  7                  cf

0

 

 

 

 

 

 

 

 

 

 

               

 

           
   
   
 

 

 

فرم کلی آن به شکل زیر است:

Sal destination,count

نکته ها:

1) عمل انتقال به چپ محاسباتی و منطقی کاملا شبیه به هم می باشند. توجه کنید که در انتقال به چپ محاسباتی بیت علامت وارد cf می شود و بنابراین خودکار می تواند مثبت یا منفی بودن عدد را با توجه به مقدار cf تشخیص دهد.

2) هر شیفت به راست محاسباتی یا منطقی معادل با تقسیم صحیح آن عدد بر2و هر عمل شیفت به چپ محاسباتی یا منطقی معادل با ضرب آن عدد در2می باشد.

3) مقدار cout در این دستورات می تواند یک مقدار ثابت یا ثبات cl باشد.

چرخش بدون کری:

عمل چرخش به راست بدون کری به شکل زیر است که در آن اولین بیت هم در cf و هم در بیت آخر قرار می گیرد.

                            cf         0                                                                    7

 

 

 

 

 

 

 

 

 

 

               

 

                            Cf         

 

Ror destination,count :فرم کلی

عمل چرخش به چپ بدون کری به شکل زیر است که در آن بیت آخر هم در cf و هم در بیت اول قرار می گیرد.

                                                            o                                                                  7                  cf

 

 

 

 

 

 

 

 

 

 

 

               

 

           
   
   

 

 

 

Rol destination,count :فرم کلی

عمل چرخش به راست با کری به شکل زیر است که درآن اولین بیت در carry و کری در بیت آخر قرار می گیرد.

 

cf                                                                           o                                                                     7

 

 

 

 

 

 

 

 

 

 

               

 

       
 
   

 

 

فرم کلی آن به شکل زیر است:

Rcr destination,count

             عمل چرخش به چپ با کری به شکل زیر است که در آن آخرین بیت در کری و کری در بیت اول قرار می گیرد.

                                                          0                                                                  7                  cf

 

 

 

 

 

 

 

 

 

 

               

 

           
   
   

 

 

فرم کلی آن به شکل زیر است:

Rcl destination,count

نکته ها:

1) عمل چرخش بر خلاف عمل انتقال ارزش محاسباتی ندارد.

2) مقدار count در این دستورات می تواند یک مقدار ثابت یا ثبات cl باشد.

30/9/84

دستورات انشعاب branch:

این دستورات به دو دسته تقسیم می گردند :

1) انشعاب غیر شرط (unconditional branch).

2) انشعاب شروط (conditional branch).

در انشعاب غیر شروط مقدار ip بدون هیچ شرط خاصی عوض می گردد در حالی که در انشعاب شروط مقدار ip در صورتی عوض می شود که شرط خاصی برقرار باشد این دستورات دارای فرم کلی زیر می باشند:

Jx address

توجه کنید که انشعاب باید درون سگمنتی باشد یعنی نمی توان از یک سگمنت به سگمنت دیگر انشعاب انجام داد.

انشعاب غیر شرطی:

Jmp [short] address

آدرس ذکر شده در این دستور همان label دستور خاص می باشد اگر از کلمه ی short استفاده شود حداکثر تغییر ممکن در مقدار ip بین 127 و 128 – است یعنی آدرس ذخیره شده در ip حداکثر می تواند 127 بایت و حد اقل می توند 128 – بایت جابجا شود در صورتی که تغییر آدرس در ip بیشتر از بازه ی فوق باشد نباید از کلمه ی short استفاده کرد استفاده از کلمه ی short به منزله ی صرفه جویی در تولید یک بایت کد زبان ماشین هنگام تولید فایل اجرایی صورت می گیرد.

انشعاب شروطی:

دستورات انشعاب شرطی به سه دسته تقسیم می شوند:

1) انشعاب اعداد بی علامت

2) انشعاب روی اعداد با علامت

3) سایر انشعاب ها

تقسیم می شوند.

1) انشعاب روی اعداد بی علامت:

دستورات آن به فرم کلی زیر هستند:

کد زبان ماشین

شرط انتقال

شرح دستور

دستور

77

Cf=Zf=0

Jump if above

Ja addr

73

Cf=0

Jump if above or equal

Jae addr

72

Cf=1

Jump if below

Jb addr

76

Cf=1 or Z=1

jump if below or equal

Jbe addr

76

Cf or Zf=1

jump if not above

Jna addr

72

Cf=1

jump if not above or equal

Jnae addr

73

Cf=0

jump if not below

Jnb addr

77

Cf=Zf=0

jump if not below or equal

jnbe

 

 

 

 

 

 

2) انشعاب روی اعداد با علامت:

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

                                                         

کد زبان ماشین

شرط انتقال

شرح دستور

دستور

7f

Sf=of and zf=0

Jump if greater

Jg addr

7d

Sf=0f

Jump if greater or equal

Jge addr

7c

sf≠of

Jump if less

Jl addr

7e

sf≠of or zf=1

jump if less or equal

Jle addr

7c

sf≠of or zf=1

jump if not greater

Jng addr

7d

Sf=of

jump if not less

Jnl addr

7f

Sf=of and zf=0

jump if not less or equal

Jnle addr

 

3)انشعاب های دیگر:

کد زبان ماشین

شرح انتقال

شرح دستورات

دستور

72

Cf=1

Jump if carry

Jc addr

E3

Cx=0

jump if cx is ziro

Jcxz addr

74

Zf=1

jump if equal

Je addr

73

Cf=0

jump if not carry

Jnc addr

75

Zf=0

jump if not equal

Jne addr

71

Of=0

jump if not overflow

Jno addr

7b

Pf=0

jump if not parity

Jnp addr

79

Sf=0

jump if not sign

Jns addr

75

Zf=0

jump if not ziro

Jnz addr

70

Of=1

jump if overflow

Jo addr

7a

Pf=1

jump if parity

Jp addr

7a

Pf=1

jump if is even

Jpe addr

7b

Pf=0

jump if is odd

Jpo addr

78

Sf=1

jump if sign

Js addr

74

Zf=1

jump if ziro

Jz addr

 

دستور compare:

Cmp destination,source :فرم کلی

مبدا و مقصد این دستور مانند دستورات منطقی تعیین می شود. این دستور تغییری در مقصد حاصل نمی کند. و فقط flag ها را تغییر می دهد. در این تفضل مبدا و مقصد محاسبه شده و برا اساس flag ها تغییر می کند. بعد از دستور test و cmp حتما باید یک دستور انشعاب مشروط  یا عملکردی روی flag ها صورت بگیرد و گرنه با اجرای دستور دیگر flag ها تغییر خواهند کرد.

اعداد با علامت

اعداد بی علامت

شرط انتقال بعد از دستور cmp

jg

ja

Destination > source

jge

jae

destination >= source

jl

jb

destination < source

jle

jbe

destination <= source

je

je

destination = source

jne

jne

source destination

 

حلقه ها:

فرم کلی یک حلقه به شکل زیر است:

Label

دستورات حلقه

Loop label

در دستور loop انتساب مقدار اولیه به ثبات cx الزامی است. محتویات ثبات cx تعداد دفعات تکرار دستورات بدنه ی حلقه را مشخص می کند. با هر بار اجرای دستورات loop از ثبات cx یکی کم می شود و سپس اگر cx صفر نباشد کنترل به دستورل جلوی برچسب حلقه باز می گردد. ولی اگر ثبات cx صفر شده باشد حلقه تمام می شود و کنترل به دستور بعد دستور loop منتقل می شود.

نکته:

شمارنده حلقه یعنی ثبات cx را نمی توان داخل حلقه کم یا زیاد کرد.

بدون استفاده از دستور loop نیز می توان حلقه ها را شبیه سازی کرد. چون دستور loop معادل دو دستور jmp,jcxz می باشد .

؟

دستور loope/loopz:

همانند دستور loop می باشد با این تفاوت که 0cx و zf=1(zf=0) باشد.

 

 

منبع : سايت علمی و پژوهشي آسمان--صفحه اینستاگرام ما را دنبال کنید
اين مطلب در تاريخ: چهارشنبه 20 اسفند 1393 ساعت: 9:32 منتشر شده است
برچسب ها : ,
نظرات(0)

شبکه اجتماعی ما

   
     

موضوعات

پيوندهاي روزانه

تبلیغات در سایت

پیج اینستاگرام ما را دنبال کنید :

فرم های  ارزشیابی معلمان ۱۴۰۲

با اطمینان خرید کنید

پشتیبان سایت همیشه در خدمت شماست.

 سامانه خرید و امن این سایت از همه  لحاظ مطمئن می باشد . یکی از مزیت های این سایت دیدن بیشتر فایل های پی دی اف قبل از خرید می باشد که شما می توانید در صورت پسندیدن فایل را خریداری نمائید .تمامی فایل ها بعد از خرید مستقیما دانلود می شوند و همچنین به ایمیل شما نیز فرستاده می شود . و شما با هرکارت بانکی که رمز دوم داشته باشید می توانید از سامانه بانک سامان یا ملت خرید نمائید . و بازهم اگر بعد از خرید موفق به هردلیلی نتوانستیدفایل را دریافت کنید نام فایل را به شماره همراه   09159886819  در تلگرام ، شاد ، ایتا و یا واتساپ ارسال نمائید، در سریعترین زمان فایل برای شما  فرستاده می شود .

درباره ما

آدرس خراسان شمالی - اسفراین - سایت علمی و پژوهشی آسمان -کافی نت آسمان - هدف از راه اندازی این سایت ارائه خدمات مناسب علمی و پژوهشی و با قیمت های مناسب به فرهنگیان و دانشجویان و دانش آموزان گرامی می باشد .این سایت دارای بیشتر از 12000 تحقیق رایگان نیز می باشد .که براحتی مورد استفاده قرار می گیرد .پشتیبانی سایت : 09159886819-09338737025 - صارمی سایت علمی و پژوهشی آسمان , اقدام پژوهی, گزارش تخصصی درس پژوهی , تحقیق تجربیات دبیران , پروژه آماری و spss , طرح درس