Payamvdn/NorthPersian_fa_wiki huggingface dataset:
و برای نسل ۱۶ بیتی توسعه داده اند. ۸۰۸۶ و ۸۰۸۸ هر دو از گذرگاه آدرس ۲۰ بیتی و ثبات های داخلی ۱۶ بیتی استفاده می کردند؛ اما تفاوت هایی نیز داشتند، برای مثال، در حالی که ۸۰۸۶ دارای یک گذرگاه داده ۱۶ بیتی بود، ۸۰۸۸، به عنوان یک گزینهٔ کم هزینه تر برای برنامه های کاربردی نهفته و کامپیوترهای کوچک، از یک گذرگاه دادهٔ ۸ بیتی بهره می برد. زبان اسمبلی x86 انواع مختلفی از CPUها را پوشش می دهد از جمله: پردازنده های اینتلی مانند 80186، 80188، ۸۰۲۸۶، ۸۰۳۸۶، 80486، پنتیوم، پنتیوم پرو و غیره و همچنین پردازنده های غیر اینتلی AMD و Cyrix مانند پردازنده های 5x86 و K6 و NEC V20 (هرچند این پردازنده ها غالباً سازگار با اینتل هستند، دستورالعمل هایی را که ممکن است به سختی بخشی از زبان اسمبلی x86 در نظر گرفته شود را به مجموعه دستورالعمل های خود اضافه کرده اند؛ همانند دستورالعمل هایی که Zilog به Z80 اضافه کرد) اصطلاح x86 برای هر پردازنده ای که می تواند زبان اسمبلی اصلی را اجرا کند، مورد استفاده قرار می گیرد. مجموعهٔ جدید دستورالعمل های x86، یک ابرمجموعه از دستورالعمل های ۸۰۸۶ و مجموعه ای از افزونه های اضافه شده به این دستورالعمل هاست
که از میکروپروسسور اینتل ۸۰۰۸ آغاز شد. سازگاری عقبرو باینری تقریباً کاملی میان تراشهٔ اینتل از ۸۰۸۶ تا نسل فعلی پردازنده های x86 وجود دارد، اگر چه برخی از استثنائات وجود دارند. در عمل، استفاده از دستورالعمل هایی که روی هر پردازنده ای از اینتل ۸۰۳۸۶ یا پنتیوم به بعد اجرا شود، رایج است. اما در سال های اخیر، سیستم عامل های مختلف و برنامه های کاربردی نرم افزار به نیاز به پردازنده های مدرن تر پیدا کرده اند، پردازنده هایی که دست کم از تعدادی از افزونه هایی که به مجموعهٔ دستورالعمل ها اضافه شده اند، پشتیبانی کنند. (به عنوان مثال MMX، 3DNow!، SSE / SSE2 / SSE3). یادیارها و آپ کد ها. هر دستورالعمل مونتاژ x86 با یک یادیار نشان داده می شود که اغلب با یک یا چند عملوند ترکیب شده است و به یک یا چند بایت به نام آپ کد ترجمه می شود؛ به عنوان مثال دستور NOP به 0x90 ترجمه می شود و دستور HLT به 0xF4 ترجمه می شود. آپ کد های بالقوه ای وجود دارند که هیچ یادیار مستندی برای آن ها وجود ندارد. پردازنده های مختلف ممکن است این آپ کد ها را به طور متفاوتی از یکدیگر تفسیر کنند، برنامه ای که با استفاده از آن ها ایجاد شود، متناقض رفتار خواهد
کرد یا حتی در برخی از پردازنده ها یک استثنا ایجاد می کند. این آپ کد ها اغلب در مسابقه های کدنویسی به عنوان راهی برای کوچکتر، سریع تر و ظریف تر کردن کد استفاده می شوند یا تنها نشان دهندهٔ مهارت کدنویس می باشند. نحو. زبان اسمبلی x86 دارای دو شاخهٔ اصلی نحو است: "نحو اینتل"، که در اصل برای مستندسازی پلت فرم x86 استفاده می شود، و "نحو AT &amp; T." استفاده از "نحو اینتل" در دنیای MS-DOS و ویندوز غالب است و استفاده از "نحو AT &amp; T" در دنیای یونیکس، از آنجایی که یونیکس در آزمایشگاه های AT &amp; T Bell ایجاد شده است. در اینجا خلاصه ای از تفاوت های اصلی میان "نحو اینتل" و "نحو" "AT &amp; T" آمده است: بسیاری از اسمبلرهای x86 از "نحو اینتل" استفاده می "کنند"، از جمله NASM, FASM ,MASM ,TASM و YASM. اسمبلر GAS از نسخهٔ ۲٫۱۰ به بعد از طریق دایرکتیو .intel_syntax از هر دو نحو پشتیبانی می کند. ثبات ها. پردازنده های x86 دارای مجموعه ای از ثبات ها هستند که برای ذخیره سازی داده های باینری استفاده می شوند. در مجموع، ثبات های داده و ثبات های آدرس، ثبات های عمومی نامیده می شوند. هر ثباتی به جز آنچه که همهٔ ثبات ها می توانند ان
جام دهند، هدف خاصی نیز دارد: علاوه بر ثبات های عمومی، موارد زیر نیز وجود دارند: ثبات های x86 می توانند همراه دستورالعمل های MOV استفاده شوند. به عنوان مثال، در نحو اینتل: mov ax, 1234h ; copies the value 1234hex (4660d) into register AXmov bx, ax ; copies the value of the AX register into the BX register آدرس دهی قطعه بندی شده. معماری x86 در وضعیت حقیقی و مجازی ۸۰۸۶ از یک فرایند به نام قطعه بندی (به جای مدل حافظهٔ مسطح که در بسیاری از محیط های دیگر استفاده می شود) برای آدرس دهی حافظه استفاده می کند. قطعه بندی، شامل ساخت یک آدرس حافظه از دو بخش است: یک قطعه و یک افست؛ قطعه به نقطهٔ شروع یک گروه ۶۴ کیلوبایتی از آدرس ها اشاره می کند و افست تعیین می کند که آدرس مورد نظر در چه فاصله ای از این نقطهٔ شروع قرار دارد. در آدرس دهی قطعه بندی شده، برای ثبت آدرس کامل حافظه، دو رجیستر نیاز است. یکی برای نگه داشتن قطعه و دیگری برای نگه داشتن افست. به منظور ترجمه به یک آدرس مسطح؛ مقدار قطعه، چهار بیت به چپ (که معادل است با ضرب در 24 یا ۱۶) شیفت داده می شود و سپس به مقدار افست اضافه می شود تا آدرس کامل را ایجاد کند. این روش ا
جازه می دهد محدودیت آدرس دهی ۶۴ کیلوبایتی را از طریق انتخاب هوشمندانهٔ آدرس ها دور بزنیم. هرچند که برنامه نویسی را به مراتب پیچیده تر می کند. برای مثال، در وضعیت حقیقی/محافظت شده، اگر DS حاوی مقدار هگزادسیمال 0xDEAD بوده و DX حاوی مقدار 0xCAFE باشد، ای دو در کنار هم به آدرس حافظهٔ 0xDEAD * 0x10 + 0xCAFE = 0xEB5CE اشاره می کنند؛ بنابراین، CPU می تواند تا ۱۰۴۸۵۷۶ بایت (۱ مگابایت) را در وضعیت حقیقی آدرس دهی کند. با ترکیب مقادیر "قطعه" و "افست،" یک آدرس ۲۰ بیتی را خواهیم داشت. کامپیوتر اصلی آی بی ام برنامه ها را محدود به ۶۴۰ کیلوبایت می کرد، اما مشخصات حافظه گسترش یافته برای پیاده سازی یک طرح سوئیچینگ بانکی که سقوط از استفاده از زمانی که بعد از سیستم عامل، مانند ویندوز، استفاده از محدوده آدرس بزرگتر از پردازنده های جدید و استفاده از حافظه مجازی خود طرح ها حالت محافظت شده، که از اینتل ۸۰۲۸۶ آغاز شد، توسط OS / 2 مورد استفاده قرار گرفت. نقطه ضعف هایی مانند عدم قابلیت دسترسی به BIOS و عدم توانایی برای بازگشت به حالت واقعی بدون تنظیم مجدد پردازنده، مانع استفادهٔ گستردهٔ آن شد. ۸۰۲۸۶ همچنان محدود به آدرس دهی حافظه در ب
خش های ۱۶ بیتی بود، به این معنی که فقط 216 بایت (۶۴ کیلوبایت) در هر لحظه قابل دسترسی بود. برای دسترسی به قابلیت های گسترش یافتهٔ ۸۰۲۸۶، سیستم عامل، پردازنده را روی حالت محافظت شده تنظیم می کند، بنابراین آدرس دهی ۲۴ بیتی و نتیجتاً دسترسی به 224 بایت (۱۶ مگابایت) حافظه را امکان پذیر می کند. در حالت محافظت شده، انتخابگر قطعه را می توان به سه بخش تقسیم کرد: یک شاخص ۱۳ بیتی، یک "نشانگر جدول" یک بیتی که تعیین می کند ورودی در GDT قرار دارد یا در LDT و یک "سطح مجوز درخواستی" ۲ بیتی. در هنگام اشاره به یک آدرس مشخص شده با یک قطعه و یک افست، از نشانه گذاری قطعه:افست استفاده می شود، بنابراین در مثال فوق، "آدرس مسطح" 0xEB5CE می تواند یا به صورت 0xDEAD:0xCAFE نوشته شود یا به صورت یک جفت ثبات که یکی برای قطعه و دیگری برای افست است؛ DS:DX. اینتل ۸۰۳۸۶ دارای سه حالت کارکرد می باشد: حالت واقعی، حالت محافظت شده و حالت مجازی. حالت محافظت شده که در ۸۰۲۸۶ عرضه شد، به ۸۰۳۸۶ این امکان را می دادکه تا حداکثر ۴ گیگابایت حافظه در اختیار داشته باشد؛ حالت مجازی جدید 8086 ("VM86")، اجرای یک یا چند برنامهٔ حالت واقعی را در یک محیط محافظت شد
ه که عمدتاً مشابه حالت واقعی بود، امکان پذیر کرد، هر چند برخی از برنامه ها با این حالت سازگار نبودند. مدل حافظه مسطح ۳۲ بیتی در حالت حفاظت شدهٔ توسعه یافتهٔ ۸۰۳۸۶، احتمالاً مهم ترین ویژگی تغییر یافته در خانوادهٔ پردازنده x86 بود تا زمانی که ای ام دی، x86-64 را در سال ۲۰۰۳ منتشر کرد، ویندوز اکنون می تواند بسیاری از برنامه های کاربردی، از جمله برنامه های DOS، را با استفاده از حافظهٔ مجازی و چند اجرای توامان، به صورت هم زمان اجرا کند. حالت اجرا. پردازنده های x86 از پنج حالت عملکرد پشتیبانی می کنند: حالت حقیقی، حالت محافظت شده، حالت طولانی، حالت مجازی ۸۶ و حالت مدیریت سیستم، که در هر کدام از این حالت ها برخی دستورالعمل ها در دسترس بوده و برخی دیگر در دسترس نخواهند بود. یک زیر مجموعهٔ ۱۶ بیتی از دستورالعمل ها در حالت حقیقی در تمام پردازنده های x86 قابل استفاده هستند و در حالت محافظت شدهٔ ۱۶ بیتی (از ۸۰۲۸۶ به بعد) دستورالعمل های افزدوه شده مربوط به حالت محافظت شده هم در دسترس هستند. در ۸۰۳۸۶ و پردازنده های بعد از آن، دستورالعمل های ۳۲ بیتی نیز در همهٔ حالت ها، از جمله حالت واقعی قابل استفاده هستند. در این پردازنده
ها، حالت V86 و حالت حفاظت شدهٔ ۳۲ بیتی، همراه با دستورالعمل های اضافی ارائه شده در این حالت ها برای مدیریت امکانات این پردازنده ها، اضافه شده اند. SMM، با برخی از دستورالعمل خاص خود، در برخی از پردازنده های اینتل i386SL , i486 و بعد از این ها در دسترس است. در حالت طولانی (از ای ام دی Opteron به بعد)، دستورالعمل های ۶۴ بیتی و ثبات های بیشتری نیز در دسترس هستند. مجموعهٔ دستورالعمل ها در همهٔ حالت ها مشابه هم هستند اما آدرس دهی حافظه و اندازهٔ کلمات متفاوتند؛ در نتیجه برنامه نویسی در حالت های مختلف نیاز به استراتژی های برنامه نویسی متفاوت دارد. کد x86 می تواند در حالت های زیر اجرا شود: جابجایی بین حالت ها. پردازنده بلافاصله پس از روشن شدن در حالت واقعی اجرا می شود، بنابراین هستهٔ سیستم عامل یا برنامه های دیگر در صورتی که بخواهند در حالت دیگری به جز حالت واقعی اجرا شوند، باید به صورت صریح به آن حالت منتقل شوند. جابجایی بین حالت ها با تغییر دادن برخی بیت های مشخص از ثبات های کنترل کننده ی پردازنده، بعد از یک سری آماده سازی ها، انجام می شود و ممکن است تعدادی تنظیمات اضافی نیز بعد از جابجایی مورد نیاز باشد. انواع دس
تورالعمل ها. به طور کلی، ویژگی های مجموعه دستورالعمل های مدرن x86 عبارتند از: طول متغیر و همسایگی مستقل (کدگذاری شده به عنوان Endian کمی، همان طور که تمام داده ها در معماری x86) دستورالعمل های پشته. معماری x86 دارای پشتیبانی سخت افزاری برای اجرای مکانیسم های مربوط به پشته است. دستورالعمل هایی مانند codice_8، codice_9، codice_10 و codice_11 با کمک پشته اجرا می شوند و برای پاس دادن پارامترها، اختصاص دادن فضا به داده های محلی و ذخیره و بازیابی نقاط بازگشت دستور call استفاده می شود. دستورالعمل codice_12 وقتی به کار می رود که تابع صدا زده شده مسئولیت احیای فضای اشغال شدهٔ پشته توسط پارامترها را به عهده داشته باشد. برای تنظیم یک کادر پشته جهت نگهداری داده های محلی یک تابع بازگشتی چندین راه وجود دارد؛ اولین راه استفاده از دستورالعمل codice_13 (این دستور همراه با ۸۰۳۸۶ معرفی شد) است که می تواند سریعتر از بسیاری دستورالعمل های دیگر باشد (مانند codice_14 ؛ codice_15 ؛ codice_16). هرچند سریع تر بودن یا آهسته تر بودن این روش علاوه بر نوع پیاده سازی پردازندهٔ x86، وابسته به قراردادهای فراخوانی مربوط به کامپایلر، برنامه نو
یس یا کد خاص یک برنامه نیز خواهد بود. طیف گستردهٔ حالت های آدرس دهی (از جمله "بی واسطه" و "پایه + افست") برای دستورالعمل هایی مانند codice_8 و codice_9، استفادهٔ مستقیم از پشته را برای داده هایی مانند عدد صحیح، ممیز شناور و آدرس ساده تر می کند، همچنین، نگه داشتن مشخصات و مکانیزم ABI نسبت به برخی معماری های RISC ساده تر خواهد بود. دستورالعمل های مربوط به اعداد صحیح در ALU. اسمبلی x86 دارای عملیات های ریاضی استاندارد، مانند: codice_19، codice_20، codice_21، codice_22 عملگرهای منطقی مانندcodice_23 codice_24: codice_25، codice_26 ؛ عملیات شیفت ریاضی و منطقی: codice_27 / codice_28، codice_29 / codice_30 ؛ چرخش همراه با رقم نقلی و چرخش بدون رقم نقلی مانند: codice_31 / codice_32 codice_33 / codice_34، مکمل دستورالعمل های محاسبهٔ BCD , codice_35، codice_36، codice_37 و سایر دستورالعمل ها است. دستورالعمل های ممیز شناور. زبان اسمبلی x86 شامل دستورالعمل هایی برای یک واحد ممیز شناور مبتنی بر پشته (FPU) است. FPU در سری پردازنده های ۸۰۸۶ تا ۸۰۳۸۶، یک پردازندهٔ جداگانهٔ کمکی اختیاری بود، در سری پردازنده های ۸۰۴۸۶ یک ویژگی ا
ختیاری روی تراشه بود و از سری ۸۰۴۸۶ به بعد، یک ویژگی استاندارد در هر پردازنده Intel x86 است، که از پنتیوم آغاز شد. دستورالعمل های FPU شامل جمع، تفریق، نفی، ضرب، تقسیم، باقی مانده، ریشه های مربع، کوتاه سازی عدد صحیح، کوتاه سازی کسر و مقیاس کردن با توان دو است. این دستوالعمل ها همچنین شامل دستورالعمل های تبدیل هستند که می توانند یک مقدار را از حافظه در هر یک از فرمت های: دهدهی کدگذاری شده به صورت دودویی، صحیح ۳۲ بیتی، صحیح ۶۴ بیتی، ممیز شناور ۳۲ بیتی، ممیز شناور ۶۴ بیتی یا ممیز شناور ۸۰ بیتی (در هنگام بارگیری، مقدار مورد نظر به حالت ممیز شناور در حال حاضر استفاده شده تبدیل می شود) بارگذاری یا در حافظه ذخیره کنند. x86 همچنین شامل تعدادی از توابع غیرجبری، از جمله سینوس، کسینوس، تانژانت، آرکتانژانت، به توان رساندن با پایه ۲ و لگاریتم در مبنای های ۲، ۱۰، یا e، می شود. دستورالعمل هایی که مربوط به ثبات های پشته هستند معمولاً فرمتی به شکلcodice_38 یا codice_39 دارند که codice_40 معادل codice_41 می باشد و codice_42 یکی از ۸ رکورد پشته (codice_41، codice_44، …، codice_45). مانند دستورالعمل های مربوط به اعداد صحیح، اولین
عملوند هم اولین عملوند مبدأ است و هم عملوند مقصد. codice_46 و codice_47 باید قبل از انجام تفریق یا تقسیم، اولی مبادله اپراتورهای منبع را انتخاب کنند. دستورالعمل اضافه، تفریق، ضرب، تقسیم، ذخیره و مقایسه شامل دستورالعمل هایی است که بعد از عملیاتشان پشته بالای پشته می شوند؛ بنابراین، به عنوان مثال، codice_48 محاسبه codice_49، سپس codice_41 از بالای پشته حذف می کند، بنابراین نتیجه در codice_44 بالای پشته در codice_41 . دستورالعمل SIMD. CPUهای مدرن x86 شامل دستورالعمل های SIMD هستند که عمدتاً عملیات مشابه را به طور موازی در بسیاری از مقادیر کد گذاری شده در ثبت یک SIMD گسترده انجام می دهند. تکنولوژی های مختلف آموزش از عملیات های مختلف در مجموعه های ثبت نام مختلف پشتیبانی می کنند اما در کل کامل (از MMX به SSE4.2) شامل محاسبات عمومی در ریاضی عدد صحیح یا شناور (اضافه کردن، تفریق، ضرب، تغییر، حداقل، حداکثر سازی، مقایسه، تقسیم یا مربع ریشه) بنابراین برای مثال، codice_53 انجام ۴ موازی ۱۶ بیتی (نشان داده شده codice_54) عدد صحیح می افزاید (نشان داده شده codice_55) از codice_56 ارزش به codice_57 و در نتیجه در ذخیره codice_
56 . جریان SIMD Extensions یا SSE همچنین شامل یک حالت نقطه شناور است که در آن فقط تنها اولین مقدار از registers در واقع اصلاح شده است (گسترش در SSE2). برخی از دستورالعمل های غیرمعمول دیگر شامل مجموع اختلاف های مطلق (استفاده می شود برای برآورد حرکت در فشرده سازی ویدئو، مانند در MPEG انجام می شود) و دستورالعمل تجمع ۱۶ بیتی (مفید برای نرم افزار مبتنی بر ترکیب آلفا و فیلتر دیجیتال). SSE (از SSE3) و 3DNow! برنامه های افزودنی شامل دستورالعمل اضافه کردن و تفریق برای درمان مقادیر ذره شناور زوج مانند اعداد پیچیده است. این مجموعه دستورالعمل ها همچنین شامل دستورالعمل های چند کلمه ای ثابت متعدد برای شیفت دادن، قرار دادن و استخراج مقادیر درون ثبات ها هستند. علاوه بر این دستورالعمل هایی برای انتقال داده بین ثبات های عدد صحیح و ثبات های XMM (مورد استفاده در SSE) FPU (استفاده شده در MMX) دستورالعمل های دستکاری اطلاعات. پردازندهٔ x86 همچنین شامل حالت های پیچیدهٔ آدرس دهی حافظه با یک افست بی واسطه، یک ثبات، یک ثبات با یک افست، یک ثبات مقیاس پذیر با افست یا بدون افست، و یک ثبات با یک افست اختیاری و یک ثبات مقیاس پذیر؛ بنابراین،
برای مثال، می توان codice_59 را به عنوان یک دستور واحد که ۳۲ بیت داده را از آدرس محاسبه شده با افست codice_60 از codice_61 بارگذاری می کند و در ثبات eax ذخیره می کند. به طور کلی، پردازنده های x86 می توانند بارگذاری کرده و استفاده از حافظه سازگار با اندازه هر یک از ثبت نام آن عمل می کند. (دستورالعمل SIMD همچنین شامل دستورالعمل نیمه بار است) مجموعه آموزشی x86 شامل بار رشته، فروشگاه، حرکت، اسکن و مقایسه دستورالعمل (codice_62، codice_63، codice_64، codice_65 و codice_66) که انجام هر عملیات به یک اندازه مشخص (codice_67 برای بایت ۸ بیتی، codice_54 برای کلمه ۱۶ بیتی، codice_69 برای کلمهٔ ۳۲ بیتی دو برابر) پس از آن افزایش / کم می (بسته به DF، پرچم جهت) آدرس ثبت نام ضمنی (codice_70 برای codice_62، codice_72 برای codice_63 و codice_65، و هر دو برای codice_64 و codice_66). برای بار، فروشگاه و عملیات اسکن، ضمنی هدف / منبع / مقایسه ثبت نام در است codice_77، codice_78 یا codice_79 ثبت نام (بسته به اندازه). ثبات بخش ضمنی استفاده می شود codice_61 برای codice_70 و codice_82 برای codice_72 . ثبت نام codice_84 یا codice_85 به
عنوان یک شمارنده کاهش می یابد و عملیات زمانی که شمارنده برابر صفر می شود یا (برای اسکن و مقایسه ها) هنگامی که نابرابری شناسایی می شود، متوقف می شود. پشته با اشاره گر پشته ضمنی کاهش (افزایش) و افزایش (پاپ) قرار می گیرد. در حالت ۱۶ بیتی، این نشانگر پشته ضمنی به عنوان SS: [SP] خطاب شده است، در حالت ۳۲ بیت SS است: [ESP]، و در حالت ۶۴ بیتی [RSP] است. اشاره گر پشته عموماً به آخرین مقدار ذخیره شده اشاره می کند، با این فرض که اندازه آن با حالت عملیاتی پردازنده (یعنی ۱۶، ۳۲ یا ۶۴ بیت) مطابقت دارد با عرض پیش فرض codice_8 / codice_9 / codice_10 / codice_11 دستورالعمل. همچنین دستورالعمل ها codice_13 و codice_91 که ذخیره و حذف داده ها از بالای پشته در هنگام تنظیم یک اشاره گر قاب پشته در codice_92 / codice_1 / codice_2 . با این حال، تنظیم مستقیم، یا جمع و تفریق به ثبت codice_95 / codice_96 / codice_97 نیز پشتیبانی می شود، بنابراین دستورالعمل codice_13 / codice_91 به طور کلی غیر ضروری است. این کد در آغاز یک تابع نوشته می شود: push ebp ; save calling function's stack frame (ebp) mov ebp, esp ; make a new stack frame on top o
f our caller's stack sub esp, 4 ; allocate 4 bytes of stack space for this function's local variables … که به لحاظ عملکردی برابر است با: enter 4, 0 دستورالعمل های دیگر برای دستکاری پشته شامل codice_100 / codice_101 برای ذخیره و بازیابی (E) FLAGS، دستورالعمل codice_102 / codice_103 برای ذخیره و بازیابی تمامی ثبات های صحیح در پشته، می باشد. فرض بر این است که ارزش برای یک بار یا فروشگاه SIMD در موقعیت های مجاور برای ثبت SIMD بسته بندی می شود و آن ها را در ترتیبی از ترتیب کمی محدود می کند. بعضی از دستورالعمل های بارگذاری و ذخیره SSE به درستی عمل می کنند تا هماهنگ سازی ۱۶ بایت انجام شود. دستورالعمل های SIMD همچنین شامل دستورالعمل پیشفرشی هستند که بار را انجام می دهند اما هیچ ثبتی را هدف قرار نمی دهند، که برای بارگیری کش استفاده می شود. دستورالعمل های SSE همچنین شامل دستورالعمل های فروشگاه غیر زمانی هستند که فروشگاه ها را مستقیماً به حافظه بدون انجام کش کش اختصاص می دهند اگر مقصد قبلاً ذخیره نگردد (در غیر این صورت مانند یک فروشگاه منظم رفتار خواهد کرد) بیشترین دستورالعمل عدد صحیح عمومی و شناور (اما بدون SIMD) می تو
اند از یک پارامتر به عنوان یک منبع پیچیده به عنوان پارامتر منبع دوم استفاده کند. دستورالعمل های عدد صحیح نیز می توانند یک پارامتر حافظه را به عنوان یک عملگر مقصد اعمال کنند. مأموریت x86 دارای عملیات پرش بدون قید و شرط، codice_104 که می تواند یک آدرس فوری، یک ثبت یا یک آدرس غیرمستقیم به عنوان یک پارامتر (توجه داشته باشید که اکثر پردازنده های RISC فقط از یک پرونده لینک یا یک جابجایی فوری کوتاه برای پریدن حمایت می کنند). همچنین پشتیبانی می شود چند جهش مشروط، از جمله codice_105 (پرش به صفر)، codice_106 (پرش در غیر صفر)، codice_107 (پرش در بزرگتر از، امضا)، codice_108 (پرش در کمتر از، امضا)، codice_109 (پرش در بالا / بزرگتر از، بدون علامت)، codice_110 (پرش در زیر / کمتر از، unsigned). این عملیات مشروط بر اساس بیت مشخص در ثبت (E) FLAGS بنا شده است. بسیاری از عملیات ریاضی و منطقی، بسته به نتیجه آنها، این پرچم ها را مشخص یا تکمیل می کنند. مقایسه مقادیر codice_111 (مقایسه) و دستورالعمل های codice_112، پرچم ها را به گونه ای تنظیم می کند که به ترتیب، آن ها را به طور جداگانه یا عملیات bitwise AND انجام داده اند، بدون تغی
یر مقادیر عملان. همچنین دستورالعمل هایی مانند codice_113 (پرچم حمل روشن) و codice_114 (پرچم تکمیل حمل) وجود دارد که به طور مستقیم بر روی پرچم ها کار می کند. شناور مقایسه نقاط از طریق انجام codice_115 یا codice_116 دستورالعمل که در نهایت باید به پرچم عدد صحیح تبدیل می شود. هر عمل پرش به سه شکل متفاوت است: بسته به اندازه اپنج. پرش "کوتاه" از عملیات امضا شده ۸ بیتی استفاده می کند که از دستورالعمل فعلی جبران می شود. پرش "نزدیک" شبیه یک پرش کوتاه است اما با استفاده از عملگر ۱۶ بیتی امضا شده (در حالت واقعی یا محافظت شده) یا عمل ۳۲ بیتی امضا شده (فقط در حالت محافظت شده ۳۲ بیتی). پرش به "مراتب" یکی است که از پایه کامل بخش استفاده می کند: مقدار افست به عنوان آدرس مطلق. اشکال غیرمستقیم و نمایه شده از هر کدام نیز وجود دارد. علاوه بر عملیات پرش ساده، codice_10 (call subroutine) و codice_11 (return from subroutine) دستورالعمل ها هستند. قبل از انتقال کنترل به زیر فرعی، codice_10 را فشار دهید آدرس offset بخش دستورالعمل زیر codice_10 به پشته؛ codice_11 این مقدار را از پشته باز می کند و به آن می پیوندد، به طور مؤثر بازگشت جری
ان کنترل به آن قسمت از برنامه. در مورد codice_122، پایه بخش تحت فشار قرار می گیرد؛ codice_123 می آید افست و سپس پایه بخش به بازگشت. همچنین دو دستورالعمل مشابه وجود دارد: codice_124 (interrupt)، که موجب صرفه جویی در مقدار فعلی (E) FLAGS ثبت شده در پشته می شود، سپس یک codice_122 انجام می دهد، به جز آن که به جای آدرس، از یک "بردار وقفه"، یک شاخص به یک جدول استفاده می کند از آدرس های پردازش وقفه. به طور معمول، پردازنده وقفه موجب صرفه جویی در تمام سایر پردازنده های ثبت شده مورد استفاده می شود، مگر اینکه آن ها برای بازگشت نتیجه عملیات به برنامه تماس (در نرم افزار به نام وقفه ها) مورد استفاده قرار گیرد. بازگشت تطبیقی از دستورالعمل وقفه codice_126، که پس از بازگشت، پرچم ها را بازیابی می کند. "قطعهای نرم" از نوع توصیف شده در بالا بعضی از سیستم عامل ها برای تماس های سیستم استفاده می شود و همچنین می تواند در اشکال زدایی مدرسان وقفه های سخت استفاده شود. "وقفه های سخت" باعث وقایع سخت افزاری خارجی می شوند و باید تمام مقادیر ثبت را حفظ کنند به عنوان وضعیت برنامه فعلی اجرای ناشناخته است. در حالت حفاظت شده، وقفه ممکن است توسط
سیستم عامل برای راه اندازی یک سوئیچ کار، که به طور خودکار تمام ثبت نام از کار فعال را ذخیره کنید. مثال ها. برنامهٔ "سلام دنیا!" برای DOS در اسمبلی به سبک MASM. از وقفهٔ 21h برای نمایش خروجی استفاده می شود، مثال های دیگر از printf برای نمایش خروجی استفاده می کنند . .model small .stack 100h .data msg db 'Hello world!$' .code start: mov ah, 09h ; Display the message lea dx, msg int 21h mov ax, 4C00h ; Terminate the executable int 21h end start برنامهٔ "سلام دنیا!" برای ویندوز در اسمبلی به سبک MASM. .386 .model small,c .stack 1000h .data msg db "Hello world!",0 .code includelib libcmt.lib includelib libvcruntime.lib includelib libucrt.lib includelib legacy_stdio_definitions.lib extrn printf:near extrn exit:near public main main proc push offset msg call printf push 0 call exit main endp end برنامهٔ "سلام دنیا!" برای ویندوز در اسمبلی به سبک NASM. %define RVA(x) (x-0x00400000) section .text push dword hello call dword [printf] push byte +0 call dword [exit] ret section .data hello db "Hello world!" section .idata
dd RVA(msvcrt_LookupTable) dd -1 dd 0 dd RVA(msvcrt_string) dd RVA(msvcrt_imports) times 5 dd 0 ; جدول را تمام می کند msvcrt_string dd "msvcrt.dll", 0 msvcrt_LookupTable: dd RVA(msvcrt_printf) dd RVA(msvcrt_exit) dd 0 msvcrt_imports: printf dd RVA(msvcrt_printf) exit dd RVA(msvcrt_exit) dd 0 msvcrt_printf: dw 1 dw "printf", 0 msvcrt_exit: dw 2 dw "exit", 0 dd 0 برنامهٔ "سلام دنیا!" برای لینوکس در اسمبلی به سبک NASM. section .data ; section for initialized data str: db 'Hello world!', 0Ah ; message string with new-line char at the end (10 decimal) str_len: equ $ - str ; calcs length of string (bytes) by subtracting the str's start address ; from this address ($ symbol) section .text ; this is the code section global _start ; _start is the entry point and needs global scope to be 'seen' by the ; linker --equivalent to main() in C/C++ _start: ; definition of _start procedure begins here mov eax, 4 ; specify the sys_write function code (from OS vector table) mov ebx, 1 ; specify file descriptor stdout --in gnu/li
nux, everything's treated as a file, ; even hardware devices mov ecx, str ; move start _address_ of string message to ecx register mov edx, str_len ; move length of message (in bytes) int 80h ; interrupt kernel to perform the system call we just set up - ; in gnu/linux services are requested through the kernel mov eax, 1 ; specify sys_exit function code (from OS vector table) mov ebx, 0 ; specify return code for OS (zero tells OS everything went fine) int 80h ; interrupt kernel to perform system call (to exit) برنامهٔ "سلام دنیا!" برای لینوکس در اسمبلی به سبک NASM با استفاده از کتابخانه استاندارد C. global main ;main must be defined as it being compiled against the C-Standard Library extern printf ;declares use of external symbol as printf is declared in a different object-module. ;Linker resolves this symbol later. segment .data ;section for initialized data string db 'Hello world!', 0Ah, 0h ;message string with new-line char (10 decimal) and the NULL terminator ;string now refers to the starting address at
which 'Hello, World' is stored. segment .text main: push string ;push the address of first character of string onto stack. This will be argument to printf call printf ;calls printf add esp, 4 ;advances stack-pointer by 4 flushing out the pushed string argument ret ;return برنامهٔ "سلام دنیا!" برای لینوکس ۶۴ بیتی در اسمبلی به سبک NASM. BITS 64 SECTION .data Hello: db "Hello world!",10 len_Hello: equ $-Hello SECTION .text global _start _start: mov rax,1 ; write syscall (x86_64) mov rdi,1 ; fd = stdout mov rsi,Hello ; *buf = Hello mov rdx,len_Hello ; count = len_Hello syscall mov rax,60 ; exit syscall (x86_64) mov rdi,0 ; status = 0 (exit normally) syscall استفاده از ثبات های پرچم. پرچم ها در معماری x86 برای عمل مقایسه بسیار مورد استفاده قرار می گیرند. هنگام مقایسهٔ بین دو داده، CPU، مقدار پرچم یا پرچم مربوطه را تنظیم می کند. با توجه به مقادیر قرار گرفته در پرچم ها، دستورالعمل های پرش شرطی انجام می شوند و برنامه به کدی که باید انجام شود پرش می کند، به عنوان مثال: cmp eax, ebx jne do_something do_something: پرچم