قسمت های تشکیل دهنده واحد پردازش مرکزی:
۱) خطوط ورودی خروجی داده ( گذرگاه مشترک) Data Bus.
2) خطوط آدرس(گذرگاه آدرس) Adress Bus.
3) واحد محاسبه و منطق Alu.
4) واحد حافظه Memory Unit.

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

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

۸۰۸۶: 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

در ۸۰۲۸۶ از تکنولوژی ISA استفاده می کنند در ۸۰۳۸۶ از تکنولوژی EISA استفاده می کنند در ۸۰۴۸۶ از تکنولوژی EISA,VESA استفاده می کنند در ۸۰۵۸۶ از تکنولوژی PCI استفاده می کنند .
تکنولوژی جدیدی که در X586 استفاده می شود تکنولوژی AGP نامیده می شود.

ثبات یا Register:
محلی است که در CPU قرار دارد و اطلاعات را به طور موقت در خود ذخیره می کند ثبات از سلول های حافظه به نام فلیپ فلاپ (flipflap) تشکیل شده است یک فلیپ فلاپ می تواند دارای مقدادیر صفر یا یک باشد یعنی کار یک بیت را انجام میدهد.
خواص ثبات:
۱) قابلیت Load داشته باشد. یعنی بتوانیم به ثبات مقدار اولیه بدهیم.
۲) قابلیت Regist داشته باشد. یعنی بتوانیم داده ها را در آن ذخیره کنیم.
۳) قبلیت Change داشته باشد. یعنی بتوانیم مقدار آن را تغییر بدهیم این تغییرات عبارتند از:
الف) بتواند setشود. یعنی تمام بیت هایش به یک تبدیل شود.
ب) بتواند clear شود . یعنی تمام بیت هایش به صفر تبدیل شود.
ج) بتواند complement شود. یعنی بتواند یک واحد از آن کم شود.
د) بتواند incerement شود. یعنی بتواند یک واحد به آن اضافه شود.
ه) بتواند shift شود. یعنی قابلیت انتقال داشته باشد.

انواع ثبات:
۱) ثبات های عمومی (general- pwpose register).
2) ثبات های خاص (special-pwpose register).
ثبات های عمومی ثبات هایی هستند که برای آن ها کار خاصی در نظر نمی گیریم و در همه ی کار های cpu قرار می گیرند. این ثبات ها قابلیت و توانایی تمام ثبات های دیگر را نیز دارد و می توان به جای هم مورد استفاده قرار گیرند.

ثبات های خاص ثبات هایی هستند که یک کاربر با وظیفه ی خاص دارند یعنی بسته به نوع کاری که انجام می دهیم ممکن است اجازه استفاده از آن ثبات را داشته باشیم یا خیر . ثبات های این خانواده دارای وضعیت بحرانی (critical) می باشند.
انواع ثبات های عمومی:
۸bit: 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 یا اشاره گر پایه:
از این ثبات ۳۲بیتی برای آدرس دهی بخشهای مختلف حافظه و به عنوان مرکزی برای برداشت اطلاعات استفاده می کند.
eip یا instruction pointer یا اشاره گر دستور:

از این ثبات ۳۲بیتی برای دسترسی به دستور العملی که هم اکنون باید اجرا گردد استفاده می شود این اشاره گر همواره به ابتدای یک بخش از حافظه که دستور العمل در آن دارد اشاره می کند بسته به نوع عمل اجرا شده eip ممکن است یک یا چند خانه افزایش یابد.
esp یا stack pointer یا اشاره گر پشته:
از این ثبات ۳۲بیتی برای دسترسی به بخش حافظه موقت یا پشته در یک برنامه زبان اسمبلی استفاده می شود.
ب) ثبات های شاخص یا index register:
این ثبات ها عبارتند از esi,edi:

edi یا destination index یا شاخص مقصد و esi یا source index یا شاخص مبدا:
این ثبات های ۳۲بیتی به صورت جفت در نقل و انتقال اطلاعات بین بخش های مختلف حافظه استفاده میشود همچنین از این دو ثبات برای ساخت آدرس استفاده می گردد محتویات این دو ثبات فقط آدرس اند نه داده.
ج) ثبات های eflag:
این ثبات ۳۲ بیتی ثباتی است که وظیفه ی اعلام وضعیت داخلی cpu به استفاده کننده است و شامل شرایطی همچون وجود یا عدم وجود بیت نقلی (cary) بیت توازن(parity) بیت نقلی کمکی(auxiliary) بیت صفر(ziro) بیت علامت(sign) بیت اجرای دستورات(trap) بیت وجود وقفه(intter up) بیت جهت انتقال(direction) بیت سریز(overflow) بیت ها مربوط به کارکردن cpu در وظعیت حفاظت شده (mode protected ) می باشد.

ساختار eflag:
cf 0 pf 0 af 0 zf sf tf if df of io dl nt 0
cf(carry flag):
این بیت وجود یا عدم وجود کری در یک بیت نقلی را نشان می دهد این بیت همواره به عنوان بالاترین بیت در اعداد بی علامت از نظر ارزش است این بیت فقط برای اعداد بی علامت و فقط برای eax تعریف شده است .
توازن(parity):
از جزوه ی مدار منطقی

یکی از راه های یافت خطا استفاده از بیت توازن است بیت توازن وضعیت تعداد بیت ها را مشخص می کند.
انواع توازن:
۱) توازن فرد (odd parity):
اگر تعداد بیت های قالب ارسال شده فرد باشد بیت توازن صفر و در غیر این صورت یک است.
۲) توازن زوج (even parity):
اگر تعداد یک های قالب ارسالی زوج باشد بیت توازن صفر و در غیر این صورت یک خواهد شد.
Pf(parity flag):
این بیت وضعیت توازن اطلاعات ارسال شده یا دریافت شده را که در eax قرار گرفته را نشان می دهد. توازن به کار رفته به صورتی است که اگر تعداد یک ها فرد باشد بیت توازن یک خواهد شد (توازن زوج). علت این که cpu از توازن زوج استفاده می کند به ساختارalu برمی گردد چرا که درalu گیت xor قرار گرفته است.
Af(auxiliary flag):
این بیت وجود یا عدم وجود بیت نقلی را در محاسبه حاصل جمع بیت شماره ۳از دو ثبات نشان می دهد این بیت در محاسبات 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 بر دو نوع است:
۱) وقفه قابل صرفه نظر شدن یا 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 های ۸۰۲۸۶ به بالا:
۱) وضعیت read mode :
اینکه هر cpu می تواند دستور العمل های ۸۰۸۶ را اجرا کند. در این صورت حافظه به چهار بخش ۶۴ کیلو بایتی تقسیم می شود.
۲) وضعیت protected mode :

دراین وضعیت cpu می تواند حافظه را به طور کامل تقسیم کرده و در هر قسمت یک برنامه مجزا را اجرا کند. در این صورت هر بخش از حافظه اصلی مانند یک حافظه مجزا عمل می کند.
۳) وضعیت virtual mode:
در این وضعیت cpu می تواند که آدرس دهی مجازی انجام دهد پس می تواند حجم حافظه را به طور مجازی افزایش دهد.
د)ثبات های بخشsegment registers:
این ثبات ها برای ساخت آدرس بخش های حافظه استفاده می شود حافظه اصلی برای اجرای برنامه به چهار بخش تقسیم می شود.
۱) بخش دستورات(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 ،۱۶ بیتی هستند.

CS:
Cs ثباتی ۱۶ بیتی است به آدرس شروع بخش دستور در حافظه اصلی را برای برنامه ای که در حال اجرا است در خود دارد. بخش دستورشامل کلیه دستورات برنامه نویسی شده که با مشخص کردن آدرس شروع بخش دو آغاز شده و به دستورend ختم می شود. برای ساخت آدرس در وضعیت read mode باید محتوای cs در f ضرب شده و حاصل به عنوان بخش ثابت در ساخت آدرس مورد استفاده قرار گیرد به عبارت دیگر:
Effective address = cf f + ip
با ضربf در cs چهار بیت صفر درسمت راست خواهیم داشت.
آدرس موثر آدرس دسته ی به یک خانه حافظه است.
Offset همواره فاصله از آغاز یک بخش خواهد بود.
مراحل اجرای یک دستورالعمل در cpu:
1) fetch: یعنی برداشت دستورالعمل از حافظه که توسط address unit, bus unit انجام می گیرد.
۲) decode: یعنی برگرداندن کد دستورالعمل که توسط execution uint انجام می گیرد.
۳) execute: یعنی اجرای یکی دستورالعمل.

بخش های یک cpu:
1) bus unit : کار نقل و انتقال داده ها و دستورات است.
۲) address unit: کار این قسمت ساخت آدرس دستورالعمل است.
۳) exe cution unit: کار این قسمت اجرای یک دستورالعمل است.
این بخش شامل دو قسمت است:
الف) insttraction queue:
ب) execution unit:

هر چه حجم صف یا queue در cpu بیشتر باشد سرعت اجرا بیشتر است معمولا بین هشت یا چهارده دستورالعمل در cpu کدشان برای اجرا آماده می شود.
Ds:
ثباتی ۱۶ بیتی است که از آن برای مشخص کردن آدرس شروع بخش داده در حافظه اصلی استفاده می شود. بخش داده حاوی کلیه داده ها و احتمالا محل هایی است که به عنوان متغیر برنامه نویسی مورد نیاز می باشد. برای دسترسی به داده هایی ذخیره شده در این بخش نیز آدرس موثر با فرمول زیر بدست می آید:

این offset بسته به نوع آدرس دهی می توان edi,bp یا es باشد در بخش داده می توان ثابت ها و متغیرها را ذخیره کرد.
Ss:
ثباتی ۱۶ بیتی است که می توان آدرس شروع حافظه پشته در هنگام برنامه نویسی را در خود ذخیره کند. برای آدرس دهی به stack و یا ذخیره و بازیابی اطلاعات در آن داریم.

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

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

۱) فایل های exe هر چهار بخش es ,ss , ds ,cs را دارد.
۲) حجم فایل های exe محدود نیست یعنی فایل exe می تواند تا maximom حجم حافظه حجم داشته باشد بنابراین فقط از ۲۵۶KB استفاده نمی کند بلکه کل حافظه پایه را (حافظه اصلی) به چهار بخش تقسیم می کند.
۳) آدرس شروع آن ها ثابت نیست یعنی بخش ها در فایل exe دارای آدرس ثابت نیستند بلکه دارای آدرس شناوراند و در هر جای حافظه می توانند قرار گیرند. پس فایل exe اصطلاحا یک فایل reloeatable است.

خصوصیات فایل های com:
1) فایل های com فقط یک بخش دارند یعنی es ,ss , ds ,cs همه یکی هستند.
۲) حجم فایل com حداکثر ۶۴KB است چون یک بخش بیشتر نداریم.
۳) آدرس شروع آن ثابت است یعنی برای ساخته شدن آدرس نیازی به ساخت آن نداریم. آدرس شروع هر برنامه از نوع com.100hex است به عبارت دیگر اولین مقداری که ip می گیرد ۱۰۰hex است.

۴) برای فایل com به هیچ عنوان نباید بخش پشته تعریف شود یعنی ss نباید در متن برنامه اسمبلی تعریف شود چرا که پشته را خود سیستم تعریف می کند.
الویت بندی اجرای فایل ها در سیستم:
۱) فایل های com 2) فایل های exe 3) فایل های bat
نکته: header(یک اطلاعات عمومی درباره فایل می دهد) فایل های ۲۵۶ ,exe بایت وheader فایل ۵۱۲b است .
نکته: فایل های exe اگر خیلی بزرگ باشند می توان در کنار آن ها فایل هایی با پسوند (over lait file)ovl ایجاد کرد.
این فایل ها دنباله فایل exe هستند که دارای header نیست.
نکته: در هنگام ایجاد یک فایل com چون stack تعریف نشده هنگام link کردن لینکرپیام خطای no stack defined را خواهد داد البته لینکر فایل exe را تولید خواهد کرد.
۴/۸/۸۴

انواع خطاها در ماکرو اسمبلر و لینکر:
۱) خطاهای اساسی:
خطاهایی هستند که روال تبدیل را متوقف می کند یعنی اگر در هنگام تولید یک فایل object یک خطای اساسی رخ دهد دیگر فایل object تولید نخواهد شد در این صورت پیام خطا و نوع خطا به همراه توضیح آن چاپ خواهد شد.
۲) خطاهای هشداری:
این خطاها روال تبدیل را متوقف نمی کند مثلا خطای no stack defind از نوع خطاهای هشداری است.
فرم کلی دستورات در زبان اسمبلی

[label:] mnemonic [operand(s)] [;commed]
Label (برچسب):
فایلی است که برای یک دستور در نظر گرفته می شود. این نام حداکثر ۳۲ فرمی است و حتما به علامت : ختم می شود و می تواند شامل حروف a..z , c..z ارقام ۰٫٫۹و برخی علائم خاص باشد مانند:
۰,?,@,_,$
این نام نمی تواند یکی از دستورات زبان اسمبلی یا نام یک ثابت باشد مکان خالی یا blank در چسب مجاز نیست. برچسب نباید با رقم شروع می شود و نقطه می تواند فقط در آخر برچسب باشد.
نکته: اسمبلی حساس به متن نیست (یعنی حروف بزرگ و کوچک فرقی نمی کند).
Mnemonic (کد دستور):

که معادل زبان اسمبلی که برای هر دستور در زبان ماشین قرار می گیرد و حداقل یک حرفی و حداکثر ۷ حرفی است.
Operand (مولفه):
هر دستور موجود در زبان اسمبلی بسته به نوع و روش آدرس دهی ممکن است دارای صفرتا سه مولفه باشد این مولفه یا یک ثابت است یا هم خانه ای از حافظه است یا یک مقدار ثابت است.
داده ها یی که مربوط به اسم خانه ای از حافظه است به طور کلی به یکی از صورت های زیر نشان می دهیم:
آدرس خانه ای از حافظه که ۳۲ بیتی mem-32:
آدرس خانه ای از حافظه که ۱۶ بیتی mem-16:
آدرس خانه ای از حافظه که ۸ بیتی mem-8:
می توان بجای اسم خانه ای از حافظه آدرس خانه ای از حافظه را در دستور قرار داد که در این صورت بین قرار می گیرد. در این صورت [address]محتوای آن آدرس را نشان خواهد داد.
ثوابت به دو دسته تقسیم می شوند:
۱) عددی:

ثوابت عددی به سه دسته تقسیم می شوند:
الف) decimal ب) hexa decimal ج) binerg
ثابت decimal ثابتی است که در انتهای آن حرف d ذکر شود مانند:
(یعنی ۸۹ یکی واحد دهی) ۸۹d
طبق قرارداد می توان حرف d را حذف کرد بنابراین عددی که در انتهای آن حرفی نباشد یک عدد را decimalاست.
۸۹
ثابت hexadecimal ثابتی است که در انتهای آن حرف h ظاهر شود مانند:
۸۹h 8a (یک بیت اضافه می شود)

ثابت باینری ثابتی است که در انتهای آن حرف b قرار گیرد.
۰۱۰۱۱۱۰۱b
نکته: اگر یک داده و محلی که قرار است داده در آن قرار گیرد انطباق برقرار نباشد خطای mis matchرخ می دهد. مانند هنگامی که بخواهیم یک مقدار ۱۶ بیتی را در ثبات ah قرار دهیم.
نکته: برای اعداد علامت دار منفی دسیمال گذاشتن علامت منفی در پشت عدد کفایت می کند اما اعداد منفی باینری و hexadecimal حتما باید به فرم مکمل دو باشند.
۲) کاراکتری:
مجموعه ای از کاراکترها که در داخل علامت های’ ‘ قرار گیرد ثابت کاراکتری است. یک ثابت کاراکتری در زبان اسمبلی همواره یک بایت است بدون توجه به تعداد کاراکترها.
Comment (توضیح):

هر توضیح با منفی که لازم باشد به دستور اضافه کنیم تا دستور واضح شود هر توضیح حتما باید بعد از علامت ؛ قرار گیرد. توضیحات در هنگام تبدیل به زبان ماشین در نظر گرفته نخواهد شد.
روش های آدرس دهی در real mod:
1) آدرس دهی ثباتی (register addressing)
در این روش آدرس دهی مولف های دستور به کار رفته حتما ثبات های cpu هستند معمولا ما برای هر دستورالعمل یک مبدا (source) و یک مقصد (destination). در این روش آدرس دهی هم مبدا و هم مقصد باید ثبات باشند. شکل کلی این نوع آدرس دهی به فرم زیر است:
Instruction register, register
2) آدرس دهی فوری (immediate addressing)
اگر در عمل انتسال مبدا یک مقدار ثابت هشت بیتی، ۱۶ بیتی یا ۳۲ بیتی باشد عمل آدرس دهی بلافصل (فوری) را خواهیم داشت. شکل کلی آن به فرم زیر است:
Instruction destination , constant
مثال)
Mov ax,100 ; ax = 100;
مقصد می تواند یک ثبات cpu و یا یک خانه از حافظه باشد از این روش معمولا برای مقدار دهی اولیه ثبات ها استفاده می کنند.
۳) آدرس دهی مستقیم (direct addressing)
در این روش آدرس دهی آدرس مولفه با نامی که برای مولفه در حافظه قرار داده ایم به طور مستقیم در دستورالعمل ذکر می شود. شکل کلی آن به فرم زیر است:
Instruction register , soure

مبدا نام یک خانه از حافظه است که حتما باید در بخش داده تعریف شده باشد. بسته به نوع ثبات از آدرس داده برداشته می شود به عنوان مثال برای ثبات ax دو بایت از حافظه برداشته می شود.
۴) آدرس دهی غیر مستقیم با ثبات (register indirect addressing)
در این نوع آدرس دهی cpu آدرس موثر را از جمع محتوای یکی از ثبات های di,bp,bx و یا si یا محتوای ثبات ds (که به ابتدای segment داده اشاره می کند) به دست می آید. در این صورت باید ثبات را در قرار دهیم. شکل کلی آن به فرم زیر است:
Instruction register,[register]
; ax=[ds+bx] Mov ax,[bx]

در مثال فوق محتوای bx آدرس نسبی است و [bx] به داده ی ذخیره شده در آن آدرس اشاره می کند.
۵) آدرس دهی نسبی با ثبات پایه(base relative addressing):
در این آدرس دهی cpu آدرس موثررا از جمع محتوای ثبات bp,ds یا bx و یک مقدار ثابت بدست می آورد.
Instruction register,[register+constant]
Mov ax,[bp+100]

تمرین: در مورد ۲ نوع آدرس دهی دیگر یعنی:
۶) آدرس دهی مستقیم با ثبات شاخص(direct index addressing).
7) آدرس دهی شاخص دار با ثبات پایه(base indexed dressing).
تحقیق کنید؟
شبه دستورات pseudo- code:
انواع دستورات در اسمبلی:

الف) دستورات اجرایی
ب) دستورات غیر اجرایی (شبه دستورات)
دستورات اجرایی دستوراتی هستند که اسمبلر در زمان ترجمه برنامه معادل زبان ماشین آن را تولید می کند ولی دستورات غیر اجرایی دستوراتی هستند که معادل زبان ماشین ندارند و اسمبلر کدی برای این دستورات تولید نمی کند.
۱۱/۸/۸۴
الف) شبه دستورات تعریف داده:
تعریف ثوابت: برای تعریف ثوابت از دستور 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:مانند
اختصاص فضای بیش از ۱۰ بایت مستلزم استفاده از فیلد تکرار یا dup است.
در این صورت data ضریب تکرار برای داده مشخص می کند و در داخل پرانتز جلوی dup مقداری که باید تکرار شود را قرار می دهیم.
مثال)
Data7 db 5,5,10,10,10,10,10,8,8,8 ; data7 db 2dup(5),5dup(5),3dup(8)
آرایه ای به طول ۱۰۰ کلمه یا ۲۰۰ بایت بدون مقدار اولیه 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 :فرم کلی

این شبه دستور باعث الحاق محتویات فایل ذکر شده در دستور به برنامه فعلی خواهد شد. نحوه ی عمل این گونه است که اسمبلر در زمان ترجمه هنگامی که به این شبه دستور برسد محتوای فایل ذکر شده در دستور را خوانده و آنرا جانگزین شبه دستور نموده و سپس عمل ترجمه را ادامه می دهد.
۱۸/۸/۸۴
ج) شبه دستورات تعریف سگمنت:
شکل کلی تعریف سگمنت به فرم زیر است:
Seq-name segment [aligm-typy] [combin] [class]
مجموعه دستورات یا داده ها

Seg-name ends
با این دستور می توان یک سگمنت را تعریف و ابتدا و انتهای آن را مشخص کنید.
Align-typy یا نوع هم ترازی:
از عملوند برای تعیین و انطباق شروع یک سگمنت با آدرس حافظه بکار می رود و دارای حالات زیر است:
الف) byte: سگمنت از هر آدرسی می توند شروع شود.
ب) word: سگمنت از هر آدرس زوجی می تواند شروع شود.
ج) para: سگمنت از هر آدرس که قابلیت تقسیم بر ۱۶ را داشته باشد می تواند شروع شود.
د) page: سگمنت از هر آدرسی که قابلیت تقسیم بر ۲۵۶ را داشته باشد می تواند شروع شود.
در صورتی که نوع هم ترازی ذکر نشود حالت پیش فرض 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 ( یا دستورالعمل فراخواننده روال ) منتقل می کند.

۲۵/۸/۸۴
هـ) شبه دستور کنترل اجرای برنامه شبه دستور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 حتما از این نوع آدرس باید شروع و اجرا شود.
۲/۹/۸۴
دستورات انتقال داده ها:
این مجموعه دستورات عمل انتقال داده و یا آدرس بین ثبات های مختلف cpu و یا ثبات ها و حافظه و یا ثبات ها و io را انجام می دهند این مجموعه دستورات به چهار دسته کلی تقسیم می شوند.
۱) دستورات عمومی ۲) دستورات io 3 ) انتقال آدرس ۴) انتقال flag
دستورmove:
یکی از دستورات عمومی برای انتقال داده بین بخش های مختلف cpu حافظه و یا io است.
Mov destination,source
دستورات move حتما دارای دو مولفه است. مقصد در دستورmove می توان ثبات cpu و یا محلی از حافظه باشد، مبدا نیز می تواند ثبات cpu، محلی از حافظه و یا مقدار ثبات باشد.
نکته۱) دستورmove بین دوبخش از حافظه نمی تواند مقدار جابجا کند.
Move datal,data2
هم مبدا و هم مقصد نمی تواند آدرس محلی از حافظه باشد.
نکته۲) در دستور move حتما باید انطباق بین مبدا و مقصد برقرار باشد.