زبان اسمبلی

از ویکیپدیا، دانشنامه آزاد
پرش به ناوبری پرش به جستجو

زبان اسمبلی
Motorola 6800 Assembly Language.png
خروجی ثانویه معمولی از اسمبلر - نمایش زبان اسمبلی اصلی (راست) برای موتورولا MC6800 و فرم اسمبلی
الگوضروری ، بدون ساختار
اولین بار ظاهر شد1949 ; 72 سال پیش ( 1949 )

در برنامه نویسی کامپیوتر ، زبان اسمبلی (یا زبان اسمبلر[1] گاهی اوقات به اختصار asm ، هر زبان برنامه نویسی سطح پایینی است که در آن تطابق بسیار قوی بین دستورالعمل های موجود در زبان و دستورالعمل های کد ماشین معماری وجود دارد . [2] زبان اسمبلی معمولاً دارای یک دستور در هر دستورالعمل ماشین (1:1) است، اما ثابت‌ها، نظرات ، دستورالعمل‌های اسمبلر ، [3] برچسب‌های نمادین مکان‌های برنامه و حافظه ، و ماکروها [4] [1] نیز به طور کلی پشتیبانی می شوند.

کد اسمبلی توسط یک برنامه کاربردی به نام اسمبلر به کد ماشین اجرایی تبدیل می شود . اصطلاح اسمبلر عموماً به ویلکس ، ویلر و گیل در کتابشان در سال 1951 با عنوان «آماده سازی برنامه ها برای رایانه دیجیتال الکترونیکی» نسبت داده می شود ، [5] که با این حال، این اصطلاح را به معنای «برنامه ای که برنامه دیگری را که از چندین برنامه مونتاژ می کند، استفاده می کنند. بخش ها را در یک برنامه واحد». [6] فرآیند تبدیل است به عنوان مونتاژ ، به عنوان در مونتاژ کد منبع . مرحله محاسباتی زمانی که یک اسمبلر در حال پردازش یک برنامه است نامیده می شودزمان مونتاژ . زبان اسمبلی ممکن است رمز ماشین نمادین نیز نامیده شود . [7] [8]

از آنجایی که اسمبلی به دستورالعمل‌های کد ماشین بستگی دارد، هر زبان اسمبلی مختص یک معماری کامپیوتر خاص و گاهی اوقات برای یک سیستم عامل است . [9] با این حال، برخی از زبان‌های اسمبلی دستور خاصی را برای تماس‌های سیستم عامل ارائه نمی‌کنند ، و بیشتر زبان‌های اسمبلی را می‌توان به صورت جهانی با هر سیستم‌عاملی استفاده کرد، زیرا این زبان دسترسی به تمام قابلیت‌های واقعی پردازنده را فراهم می‌کند ، که بر اساس آن همه سیستم‌ها تماس می‌گیرند. مکانیسم ها در نهایت استراحت می کنند. برخلاف زبان‌های اسمبلی، بیشتر زبان‌های برنامه‌نویسی سطح بالا معمولاً در چندین معماری قابل حمل هستند، اما بهتفسیر یا کامپایل ، کاری بسیار پیچیده تر از مونتاژ است.

نحو زبان اسمبلی

زبان اسمبلی با استفاده از یک حافظه ای به نمایندگی از هر سطح پایین دستورالعمل ماشین یا شناسنده ، به طور معمول نیز هر معماری ثبت نام ، پرچم ، و غیره بسیاری از عملیات نیاز به یک یا چند عملوند به منظور تشکیل یک دستورالعمل کامل است. اکثر اسمبلرها ثابت ها، ثبات ها و برچسب های نامگذاری شده را برای مکان های برنامه و حافظه مجاز می دانند و می توانند عبارات عملوندها را محاسبه کنند . بنابراین، برنامه نویسان از محاسبات تکراری خسته کننده رها می شوند و برنامه های اسمبلر بسیار خواناتر از کد ماشین هستند. بسته به معماری، این عناصر همچنین ممکن است برای دستورالعمل های خاص یا حالت های آدرس دهی ترکیب شوندبا استفاده از افست یا داده های دیگر و همچنین آدرس های ثابت. بسیاری از اسمبلرها مکانیسم های اضافی را برای تسهیل توسعه برنامه، کنترل فرآیند مونتاژ و کمک به اشکال زدایی ارائه می دهند .

اصطلاحات

  • نصب ماکرو اسمبلر که شامل یک است درشت دستور تسهیلات به طوری که (پارامتر) متن زبان اسمبلی را می توان با یک نام نشان داده، و این نام می توان مورد استفاده برای وارد کردن متن گسترش یافته را به کد دیگر.
  • یک اسمبلر متقابل (همچنین به کامپایلر متقابل مراجعه کنید ) اسمبلری است که بر روی یک کامپیوتر یا سیستم عامل ( سیستم میزبان ) از نوع متفاوتی از سیستمی که کد به دست آمده روی آن اجرا می شود ( سیستم هدف ) اجرا می شود. مونتاژ متقابل توسعه برنامه‌ها را برای سیستم‌هایی که منابعی برای پشتیبانی از توسعه نرم‌افزار ندارند، مانند یک سیستم تعبیه شده یا یک میکروکنترلر، تسهیل می‌کند . در چنین حالتی، کد شی به دست آمده باید از طریق حافظه فقط خواندنی (ROM، EPROM ، و غیره)، یک برنامه نویس به سیستم هدف منتقل شود .(زمانی که حافظه فقط خواندنی در دستگاه ادغام شده است، مانند میکروکنترلرها)، یا یک پیوند داده با استفاده از یک کپی بیت به بیت دقیق از کد شی یا یک نمایش متنی از آن کد (مانند هگز اینتل) یا Motorola S-record ).
  • نصب سطح بالا برنامه ای است که فراهم می کند انتزاعی زبان بیشتر با زبان های سطح بالا، مانند ساختارهای کنترل پیشرفته (مرتبط است اگر / پس / دیگری ، آیا مورد، و غیره) و سطح بالا از انواع داده انتزاعی، از جمله سازه / رکوردها، اتحادیه ها، کلاس ها و مجموعه ها.
  • microassembler برنامه ای است که آماده سازی یک کمک می کند تا ریز ، به نام سیستم عامل ، برای کنترل عملیات سطح پایین از کامپیوتر است.
  • متا نصب است "برنامه ای است که به شرح نحوی و معنایی از یک زبان اسمبلی را می پذیرد، و تولید یک اسمبلر برای آن زبان". [10] اسمبلرهای "Meta-Symbol" برای کامپیوترهای سری 9 SDS و SDS Sigma متا اسمبلر هستند. [11] [nb 1] Sperry Univac همچنین یک Meta-Assembler برای سری UNIVAC 1100/2200 ارائه کرد . [12]
  • اسمبلر درون خطی (یا اسمبلر تعبیه شده ) کد اسمبلری است که در یک برنامه زبان سطح بالا موجود است. [13] این اغلب در برنامه های سیستمی استفاده می شود که نیاز به دسترسی مستقیم به سخت افزار دارند.

مفاهیم کلیدی

اسمبلر

یک برنامه اسمبلر با ترجمه ترکیبی از یادگاری و نحو برای عملیات و آدرس دهی حالت ها به معادل های عددی ، کد شی ایجاد می کند . این نمایش معمولاً شامل یک کد عملیات (" opcode ") و همچنین سایر بیت ها و داده های کنترلی است . اسمبلر همچنین عبارات ثابت را محاسبه می کند و نام های نمادین مکان های حافظه و موجودیت های دیگر را حل می کند . [14] استفاده از ارجاعات نمادین یکی از ویژگی های کلیدی اسمبلرها است که محاسبات خسته کننده و به روز رسانی آدرس دستی پس از تغییرات برنامه را ذخیره می کند. اکثر اسمبلرها نیز شاملتسهیلات کلان برای انجام جایگزینی متن - به عنوان مثال، ایجاد توالی کوتاه معمولی از دستورالعمل ها به صورت خطی ، به جای زیر روال نامیده شده .

برخی اسمبلر همچنین ممکن است قادر به انجام برخی از انواع ساده باشد مجموعه دستورات خاص بهینه سازی . یک مثال عینی از این ممکن است اسمبلرهای x86 در همه جا از فروشندگان مختلف باشد. به نام jump-sizing ، [14] اکثر آنها قادر به انجام جایگزینی آموزش پرش (پرش های بلند جایگزین شده با پرش های کوتاه یا نسبی) در هر تعداد پاس، در صورت درخواست هستند. برخی دیگر حتی ممکن است بازآرایی ساده یا درج دستورالعمل‌ها را انجام دهند، مانند برخی اسمبلرها برای معماری‌های RISC که می‌توانند به بهینه‌سازی زمان‌بندی دستورالعمل معقول برای بهره‌برداری از خط لوله CPU تا حد امکان مؤثر کمک کنند. [استناد مورد نیاز ]

اسمبلرها از دهه 1950 به عنوان اولین مرحله بالاتر از زبان ماشین و قبل از زبان های برنامه نویسی سطح بالا مانند Fortran ، Algol ، COBOL و Lisp در دسترس بوده اند . همچنین چندین کلاس از مترجم‌ها و تولیدکننده‌های کد نیمه خودکار با ویژگی‌های مشابه به زبان‌های اسمبلی و سطح بالا وجود داشته است که Speedcode شاید یکی از نمونه‌های شناخته‌شده‌تر باشد.

ممکن است چندین اسمبلر با نحو متفاوت برای یک CPU خاص یا معماری مجموعه دستورالعمل وجود داشته باشد . به عنوان مثال، یک دستورالعمل به اضافه کردن اطلاعات حافظه را به یک ثبت نام در یک معماری x86 پردازنده خانواده ممکن است add eax,[ebx]، در اصلی ساختار اینتل ، در حالی که این امر می تواند نوشته شده addl (%ebx),%eaxدر ساختار AT & T با استفاده گنو اسمبلر . علیرغم ظاهرهای مختلف، اشکال نحوی مختلف معمولاً کد ماشین عددی یکسانی را تولید می کنند . یک اسمبلر واحد همچنین ممکن است حالت های مختلفی برای پشتیبانی از تغییرات در اشکال نحوی و همچنین تفسیرهای معنایی دقیق آنها داشته باشد (مانند FASM - syntax,TASM - نحو، حالت ایده آل و غیره، در مورد خاص برنامه نویسی اسمبلی x86 ).

تعداد پاس‌ها

دو نوع اسمبلر وجود دارد که بر اساس تعداد عبور از منبع (چند بار که اسمبلر منبع را می خواند) برای تولید فایل شی مورد نیاز است.

  • اسمبلرهای تک گذری یکبار کد منبع را مرور می کنند. هر نمادی که قبل از تعریف استفاده می‌شود، در انتهای کد شی (یا حداقل زودتر از نقطه‌ای که نماد تعریف می‌شود) به "اشتباه" نیاز دارد که به پیوند دهنده یا بارکننده می‌گوید "به عقب برگردد" و یک را بازنویسی کند. مکان نگهدار که در جایی که نماد هنوز تعریف نشده استفاده می شد، رها شده بود.
  • اسمبلرهای چند گذری یک جدول با تمام نمادها و مقادیر آنها در اولین پاس ها ایجاد می کنند، سپس از جدول در پاس های بعدی برای تولید کد استفاده می کنند.

در هر دو مورد، اسمبلر باید بتواند اندازه هر دستورالعمل را در گذرهای اولیه تعیین کند تا آدرس نمادهای بعدی را محاسبه کند. این بدان معناست که اگر اندازه عملیاتی که به عملوندی که بعداً تعریف می‌شود بستگی به نوع یا فاصله عملوند داشته باشد، اسمبلر هنگام اولین برخورد با عملیات تخمین بدبینانه‌ای انجام می‌دهد و در صورت لزوم، آن را با یک یا چند « نه » پر می‌کند. -عملیات "دستورالعمل در گذر بعدی یا اشتباه. در اسمبلر با بهینه‌سازی چشم‌انداز ، آدرس‌ها ممکن است بین پاس‌ها مجدداً محاسبه شوند تا امکان جایگزینی کد بدبینانه با کد متناسب با فاصله دقیق از هدف فراهم شود.

دلیل اصلی استفاده از اسمبلرهای یک گذر، اندازه حافظه و سرعت مونتاژ بود - اغلب یک پاس دوم مستلزم ذخیره کردن جدول نمادها در حافظه (برای مدیریت ارجاعات رو به جلو )، بازپیچیدن و بازخوانی منبع برنامه روی نوار ، یا بازخوانی یک عرشه کارت یا نوار کاغذی پانچ شده . رایانه‌های بعدی با حافظه‌های بسیار بزرگ‌تر (مخصوصاً فضای ذخیره‌سازی دیسک)، فضای لازم برای انجام تمام پردازش‌های لازم را بدون چنین بازخوانی داشتند. مزیت اسمبلر چند گذری این است که عدم وجود خطا باعث می شود فرآیند پیوند (یا بارگذاری برنامه در صورتی که اسمبلر مستقیماً کد قابل اجرا تولید می کند) سریعتر شود. [15]

به عنوان مثال: در قطعه کد زیر، یک اسمبلر تک گذری می تواند آدرس BKWD مرجع معکوس را هنگام مونتاژ دستور S2 تعیین کند ، اما نمی تواند آدرس FWD مرجع رو به جلو را هنگام مونتاژ دستور شاخه S1 تعیین کند. ; در واقع، FWD ممکن است تعریف نشده باشد. یک اسمبلر دو پاس هر دو آدرس را در پاس 1 تعیین می کند، بنابراین هنگام تولید کد در پاس 2 مشخص می شوند.

S1    B     FWD
  ...
FWD    EQU *
  ...
BKWD   EQU *
  ...
S2     B    BKWD

اسمبلرهای سطح بالا

اسمبلرهای سطح بالا پیچیده تر انتزاعات زبانی مانند:

  • اعلامیه‌ها و فراخوان‌های رویه/عملکرد سطح بالا
  • ساختارهای کنترلی پیشرفته (IF/THEN/ELSE، SWITCH)
  • انواع داده های انتزاعی سطح بالا، از جمله ساختارها/ رکوردها، اتحادیه ها، کلاس ها و مجموعه ها
  • پردازش ماکرو پیچیده (اگرچه از اواخر دهه 1950 برای اسمبلرهای معمولی برای سری IBM 700 و سری IBM 7000 و از دهه 1960 برای IBM System/360 (S/360) در میان سایر ماشین‌ها در دسترس است.
  • ویژگی های برنامه نویسی شی گرا مانند کلاس ها ، اشیاء ، انتزاع ، چندشکلی و وراثت [16]

مشاهده طراحی زبان زیر برای جزئیات بیشتر.

زبان اسمبلی

یک برنامه نوشته شده به زبان اسمبلی شامل یک سری از حفظی دستورالعمل پردازنده و متا اظهارات (گوناگون و به عنوان دستورات، شبه دستورالعمل ها، و شبه عملیات شناخته می شود)، نظرات و داده ها. دستورالعمل‌های زبان اسمبلی معمولاً از یک حافظه رمزی کد opcode به دنبال یک عملوند تشکیل شده‌اند که ممکن است فهرستی از داده‌ها، آرگومان‌ها یا پارامترها باشد. [17] برخی از دستورالعمل‌ها ممکن است "ضمنی" باشند، به این معنی که داده‌ای که دستورالعمل بر اساس آن عمل می‌کند به طور ضمنی توسط خود دستورالعمل تعریف می‌شود - چنین دستوری عملوند نمی‌گیرد. دستور به دست آمده توسط یک اسمبلر به دستورالعمل های زبان ماشین ترجمه می شود که می تواند در حافظه بارگذاری و اجرا شود.

به عنوان مثال، دستور زیر به می گوید معماری x86 / IA-32 پردازنده به حرکت یک مقدار 8 بیتی را به یک ثبت نام . کد باینری برای این آموزش است 10110 و پس از یک شناسه 3 بیتی که ثبت نام برای استفاده. شناسه رجیستر AL 000 است، بنابراین کد ماشین زیر رجیستر AL را با داده 01100001 بارگیری می کند. [17]

10110000 01100001

این کد کامپیوتری باینری را می توان با بیان آن به صورت هگزادسیمال به صورت زیر برای انسان خواناتر کرد .

B0 61

در اینجا، B0به معنای انتقال یک کپی از مقدار زیر به AL است ، و 61یک نمایش هگزادسیمال از مقدار 01100001 است که در اعشار 97 است . زبان اسمبلی برای 8086 خانواده فراهم می کند حفظی MOV (مخفف حرکت ) برای دستورالعمل مانند این، به طوری که کد ماشین بالا می تواند به عنوان در زبان اسمبلی، کامل با نظر توضیحی زیر در صورت لزوم، پس از نقطه و ویرگول نوشته شده است. خواندن و به خاطر سپردن این بسیار آسان تر است.

MOV  AL ,  61h        ; بارگذاری AL با اعشار 97 (61 هگز)

در برخی از زبان‌های اسمبلی (از جمله این زبان)، همان یادگاری، مانند MOV، ممکن است برای خانواده‌ای از دستورالعمل‌های مرتبط برای بارگیری، کپی و جابجایی داده‌ها استفاده شود، خواه این‌ها مقادیر فوری، مقادیر در ثبات‌ها یا مکان‌های حافظه باشند که توسط مقادیر در رجیسترها یا آدرس‌های فوری (معروف به مستقیم). اسمبلرهای دیگر ممکن است از یادداشت های رمز عملیاتی جداگانه مانند L برای "حافظه را به ثبت نام"، ST برای "انتقال رجیستر به حافظه"، LR برای "انتقال ثبت به ثبت"، MVI برای "انتقال عملوند فوری به حافظه" و غیره استفاده کنند.

اگر از همان یادگاری برای دستورالعمل‌های مختلف استفاده شود، به این معنی است که یادگاری با چندین کد دستورالعمل باینری مختلف، به استثنای داده‌ها (مثلاً 61hدر این مثال)، بسته به عملوندهایی که از یادگار پیروی می‌کنند، مطابقت دارد. برای مثال، برای پردازنده‌های x86/IA-32، نحو زبان اسمبلی اینتل MOV AL, AHدستورالعملی را نشان می‌دهد که محتویات ثبات AH را به رجیستر AL منتقل می‌کند . [NB 2] فرم هگزادسیمال از این دستورالعمل است:

88 E0

بایت اول، 88h، حرکت بین یک ثبات بایتی و یک ثبات یا حافظه دیگر را مشخص می کند، و بایت دوم، E0h، کدگذاری می شود (با سه فیلد بیتی) تا مشخص کند که هر دو عملوند ثبات هستند، منبع AH است. و مقصد AL است .

در موردی مانند این که همان یادگاری می‌تواند بیش از یک دستور دودویی را نشان دهد، اسمبلر با بررسی عملوندها تعیین می‌کند که کدام دستورالعمل را تولید کند. در مثال اول، عملوند 61hیک ثابت عددی هگزادسیمال معتبر است و یک نام رجیستر معتبر نیست، بنابراین فقط B0دستورالعمل می تواند قابل اجرا باشد. در مثال دوم، عملوند AHیک نام رجیستر معتبر است و نه یک ثابت عددی معتبر (هگزا دسیمال، اعشاری، هشتی یا باینری)، بنابراین فقط 88دستورالعمل می تواند قابل اجرا باشد.

زبان‌های اسمبلی همیشه به گونه‌ای طراحی می‌شوند که این نوع ابهام به طور جهانی توسط نحو آنها اعمال شود. به عنوان مثال، در زبان اسمبلی x86 اینتل، یک ثابت هگزادسیمال باید با یک رقم اعدادی شروع شود، به طوری که عدد هگزادسیمال 'A' (برابر با ده اعشاری) به صورت 0Ahیا 0AH، نه AH، به طور خاص نوشته شود تا به نظر نرسد. نام ثبت ق . (همین قانون همچنین از ابهام در نام ثبات‌های BH ، CH ، و DH و همچنین هر نماد تعریف‌شده توسط کاربر که با حرف H ختم می‌شود و در غیر این صورت فقط شامل کاراکترهایی است که ارقام هگزا دسیمال هستند، مانند کلمه «BEACH» جلوگیری می‌کند. ".)

با بازگشت به مثال اصلی، در حالی که opcode x86 10110000 ( B0) یک مقدار 8 بیتی را در رجیستر AL کپی B1می کند ، 10110001 ( ) آن را به CL و 10110010 ( B2) به DL منتقل می کند . مثال‌های زبان اسمبلی برای این موارد در زیر آمده است. [17]

MOV  AL ,  1h         ; بارگذاری AL با مقدار فوری 1 
MOV  CL ,  2h         ; بارگیری CL با مقدار فوری 2 
MOV  DL ,  3h         ; DL را با مقدار فوری 3 بارگیری کنید

نحو MOV همچنین می تواند پیچیده تر باشد همانطور که مثال های زیر نشان می دهد. [18]

MOV  EAX ,  [ EBX ] 	  ; 4 بایت حافظه را در آدرس موجود در EBX به EAX 
MOV  [ ESI + EAX ],  CL منتقل کنید  . محتویات CL را به بایت در آدرس ESI+EAX 
MOV  DS ،  DX منتقل کنید         . محتویات DX را به بخش ثبات DS منتقل کنید

در هر مورد، یادداشت MOV مستقیماً توسط یک اسمبلر به یکی از کدهای عملیاتی 88-8C، 8E، A0-A3، B0-BF، C6 یا C7 ترجمه می شود و برنامه نویس معمولاً مجبور نیست بداند یا به خاطر بسپارد که کدام. [17]

تبدیل زبان اسمبلی به کد ماشین کار یک اسمبلر است و معکوس آن حداقل تا حدی توسط یک دی اسمبلر قابل دستیابی است . برخلاف زبان‌های سطح بالا ، بین بسیاری از دستورات اسمبلی ساده و دستورالعمل‌های زبان ماشین مطابقت یک به یک وجود دارد . با این حال، در برخی موارد، یک اسمبلر ممکن است شبه دستورالعمل هایی را ارائه دهد(در اصل ماکروها) که به چندین دستورالعمل زبان ماشین گسترش می یابند تا عملکردهای مورد نیاز را ارائه دهند. به عنوان مثال، برای ماشینی که فاقد دستورالعمل "شاخه اگر بزرگتر یا مساوی" است، یک اسمبلر ممکن است یک شبه دستورالعمل ارائه دهد که به "مجموعه اگر کمتر از" و "شاخه اگر صفر (در نتیجه دستورالعمل مجموعه)" گسترش می یابد. . اکثر اسمبلرهای با امکانات کامل یک ماکرو غنی نیز ارائه می دهندزبان (در زیر مورد بحث قرار می گیرد) که توسط فروشندگان و برنامه نویسان برای تولید کدهای پیچیده تر و توالی داده ها استفاده می شود. از آنجایی که اطلاعات مربوط به شبه دستورالعمل ها و ماکروهای تعریف شده در محیط اسمبلر در برنامه شی وجود ندارد، یک disassembler نمی تواند فراخوانی های ماکرو و شبه دستورالعمل را بازسازی کند، بلکه فقط می تواند دستورالعمل های واقعی ماشین را که اسمبلر از آن موجودیت های انتزاعی به زبان اسمبلی ایجاد کرده است، جدا کند. به همین ترتیب، از آنجایی که نظرات در فایل منبع زبان اسمبلی توسط اسمبلر نادیده گرفته می شود و هیچ تاثیری بر روی کد شی که تولید می کند ندارد، یک disassembler همیشه به طور کامل قادر به بازیابی نظرات منبع نیست.

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

مجموعه‌های متعددی از یادگاری یا نحو زبان اسمبلی ممکن است برای یک مجموعه دستورالعمل وجود داشته باشد که معمولاً در برنامه‌های اسمبلر مختلف نمونه‌سازی می‌شود. در این موارد، محبوب‌ترین مورد معمولاً تولیدکننده CPU است که در مستندات آن استفاده می‌شود.

دو نمونه از CPUهایی که دارای دو مجموعه مختلف حافظه هستند، خانواده Intel 8080 و Intel 8086/8088 هستند. از آنجایی که اینتل ادعای کپی رایت در یادداشت های زبان اسمبلی خود را داشت (حداقل در هر صفحه از اسناد آنها که در دهه 1970 و اوایل دهه 1980 منتشر شد)، برخی از شرکت هایی که به طور مستقل CPU های سازگار با مجموعه دستورالعمل های اینتل را تولید کردند، یادداشت های خود را اختراع کردند. Zilog بود Z80 پردازنده، افزایش از اینتل 8080A ، پشتیبانی از تمام دستورالعمل 8080A به همراه بسیاری دیگر. Zilog یک زبان اسمبلی کاملاً جدید نه تنها برای دستورالعمل های جدید بلکه برای تمام دستورالعمل های 8080A اختراع کرد. به عنوان مثال، جایی که اینتل از حافظه های MOV ، MVI ، LDA ، STA استفاده می کند ،LXI ، LDAX ، STAX ، LHLD ، و SHLD برای دستورالعمل های مختلف انتقال داده، زبان اسمبلی Z80 از LD یادگاری برای همه آنها استفاده می کند. مورد مشابه CPU های NEC V20 و V30 هستند که به ترتیب نسخه های پیشرفته 8086 و 8088 اینتل هستند. مانند Zilog با Z80، NEC برای تمام دستورالعمل‌های 8086 و 8088، یادداشت‌های جدیدی اختراع کرد تا از اتهامات نقض حق چاپ اینتل جلوگیری کند. (این مورد سوال است که آیا چنین حق چاپی می تواند معتبر باشد، و شرکت های CPU بعدی مانند AMD [nb 3] و Cyrixیادداشت های دستورات x86/IA-32 اینتل را دقیقاً بدون مجوز و مجازات قانونی مجدداً منتشر کرد. از آنجایی که هر دو زبان اسمبلی برای معماری مجموعه دستورالعمل یکسانی هم شکل هستند (تا حدودی مانند انگلیسی و پیگ لاتین )، هیچ الزامی برای استفاده از زبان اسمبلی منتشر شده خود سازنده با محصولات آن سازنده وجود ندارد.

طراحی زبان

عناصر اساسی

درجه زیادی از تنوع در روش دسته بندی نویسندگان اسمبلرها و در نامگذاری که استفاده می کنند وجود دارد. به طور خاص، برخی هر چیزی را غیر از یک حافظه ماشینی یا حافظه توسعه یافته به عنوان یک شبه عملیات (شبه عملیات) توصیف می کنند. یک زبان اسمبلی معمولی شامل 3 نوع دستور دستور است که برای تعریف عملیات برنامه استفاده می شود:

  • اپکد یادگاری
  • تعاریف داده
  • بخشنامه های مجمع

اپکد یادگاری و یادگاری توسعه یافته

دستورالعمل‌ها (گزاره‌ها) در زبان اسمبلی بر خلاف دستورالعمل‌های زبان‌های سطح بالا ، عموماً بسیار ساده هستند . به طور کلی، یادگاری یک نام نمادین برای یک دستورالعمل زبان ماشین قابل اجرا (یک opcode ) است و حداقل یک حافظه رمز برای هر دستور زبان ماشین تعریف شده است. هر دستورالعمل معمولاً از یک عملیات یا کد عملیاتی به اضافه صفر یا چند عملوند تشکیل شده است. بیشتر دستورالعمل ها به یک مقدار یا یک جفت مقدار اشاره می کنند. عملگرها می توانند فوری (مقدار کدگذاری شده در خود دستورالعمل)، رجیسترهای مشخص شده در دستورالعمل یا ضمنی، یا آدرس داده های موجود در جای دیگری در ذخیره سازی باشند. این توسط معماری اصلی پردازنده تعیین می شود: اسمبلر صرفاً نحوه عملکرد این معماری را منعکس می کند. یادداشت های توسعه یافته اغلب برای تعیین ترکیبی از یک کد عملیاتی با یک عملوند خاص استفاده می شود، به عنوان مثال، اسمبلرهای System/360 Bبه عنوان یک یادگاری توسعه یافته برای BCبا ماسک 15 و NOP("NO OPeration" - هیچ کاری برای یک مرحله انجام نمی دهند) برای BCبا استفاده می شود. ماسک 0.

یادداشت های توسعه یافته اغلب برای پشتیبانی از کاربردهای تخصصی دستورالعمل ها، اغلب برای اهدافی که از نام دستورالعمل مشخص نیست، استفاده می شود. به عنوان مثال، بسیاری از CPU ها دستورالعمل NOP صریح ندارند، اما دستورالعمل هایی دارند که می توانند برای این منظور مورد استفاده قرار گیرند. در CPUهای 8086 از دستورالعمل برای کد استفاده می‌شود ، که یک کد اپکد برای رمزگذاری دستورالعمل است . برخی از جداکننده‌ها این را می‌شناسند و دستورالعمل را به صورت رمزگشایی می‌کنند. به طور مشابه، اسمبلرهای IBM برای System/360 و System/370 از یادداشت های توسعه یافته و برای و با ماسک صفر استفاده می کنند. برای معماری SPARC، این دستورالعمل‌ها به عنوان دستورالعمل‌های مصنوعی شناخته می‌شوند .xchg ax,axnopnopxchg ax,axxchg ax,axnopNOPNOPRBCBCR[19]

برخی اسمبلرها همچنین از دستورالعمل های ماکرو داخلی ساده پشتیبانی می کنند که دو یا چند دستورالعمل ماشین را تولید می کنند. به عنوان مثال، در برخی از اسمبلرهای Z80، دستورالعمل ld hl,bcتولید ld l,cو به دنبال آن ld h,b. [20] این کدها گاهی اوقات به عنوان کدهای کاذب شناخته می شوند .

یادگاری ها نمادهای دلخواه هستند. در سال 1985 IEEE استاندارد 694 را برای مجموعه ای یکنواخت از یادگاری منتشر کرد تا توسط همه اسمبلرها استفاده شود. استاندارد از آن زمان پس گرفته شده است.

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

دستورالعمل هایی برای تعریف عناصر داده برای نگهداری داده ها و متغیرها وجود دارد. آنها نوع داده، طول و تراز داده ها را تعریف می کنند. این دستورالعمل‌ها همچنین می‌توانند تعیین کنند که آیا داده‌ها برای برنامه‌های خارجی (برنامه‌هایی که به طور جداگانه جمع‌آوری شده‌اند) در دسترس است یا فقط برای برنامه‌ای که بخش داده در آن تعریف شده است. برخی از اسمبلرها اینها را به عنوان شبه عملیات طبقه بندی می کنند.

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

دستورات اسمبلی که کدهای شبه، عملیات شبه یا شبه عملیات نیز نامیده می شوند، دستوراتی هستند که به اسمبلر داده می شود "آن را برای انجام عملیاتی غیر از دستورات مونتاژ" هدایت می کند. [14] دستورالعمل‌ها بر نحوه عملکرد اسمبلر تأثیر می‌گذارند و «ممکن است روی کد شی، جدول نمادها، فایل فهرست‌بندی و مقادیر پارامترهای اسمبلر داخلی تأثیر بگذارند». گاهی اوقات اصطلاح شبه آپکد برای دستورالعمل هایی که کد شی تولید می کنند، مانند آنهایی که داده تولید می کنند، محفوظ است. [21]

نام شبه عملیات ها اغلب با یک نقطه شروع می شود تا آنها را از دستورالعمل های ماشین متمایز کند. شبه عملیات می تواند مونتاژ برنامه را به پارامترهای ورودی توسط یک برنامه نویس وابسته کند، به طوری که یک برنامه را می توان به روش های مختلف، شاید برای کاربردهای مختلف، مونتاژ کرد. یا، شبه عملیات را می توان برای دستکاری ارائه یک برنامه به منظور تسهیل خواندن و نگهداری آن استفاده کرد. یکی دیگر از کاربردهای رایج شبه عملیات، رزرو مناطق ذخیره سازی برای داده های زمان اجرا و مقداردهی اولیه محتوای آنها به مقادیر شناخته شده است.

اسمبلرهای نمادین به برنامه نویسان اجازه می دهند نام های دلخواه ( برچسب ها یا نمادها ) را با مکان های حافظه و ثابت های مختلف مرتبط کنند. معمولاً به هر ثابت و متغیر یک نام داده می‌شود تا دستورالعمل‌ها بتوانند آن مکان‌ها را با نام ارجاع دهند، بنابراین کدهای خود مستندسازی را ارتقا می‌دهند . در کدهای اجرایی، نام هر زیربرنامه با نقطه ورودی آن مرتبط است، بنابراین هر فراخوانی به یک زیربرنامه می تواند از نام آن استفاده کند. در داخل برنامه های فرعی، به مقاصد GOTO برچسب هایی داده می شود. برخی از اسمبلرها از نمادهای محلی پشتیبانی می کنند که اغلب از نظر لغوی از نمادهای معمولی متمایز هستند (مثلاً استفاده از "10$" به عنوان مقصد GOTO).

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

زبان‌های اسمبلی، مانند بسیاری از زبان‌های کامپیوتری دیگر، اجازه می‌دهند نظراتی به کد منبع برنامه اضافه شوند که در طول اسمبلی نادیده گرفته می‌شوند. اظهار نظر عاقلانه در برنامه های زبان اسمبلی ضروری است، زیرا تعیین معنی و هدف دنباله ای از دستورالعمل های ماشین دودویی می تواند دشوار باشد. زبان اسمبلی «خام» (بدون نظر) که توسط کامپایلرها یا جداکننده‌ها تولید می‌شود، زمانی که باید تغییراتی ایجاد شود، خواندن بسیار دشوار است.

ماکروها

بسیاری از اسمبلرها از ماکروهای از پیش تعریف شده پشتیبانی می کنند و برخی دیگر از ماکروهای تعریف شده توسط برنامه نویس (و به طور مکرر قابل تعریف مجدد) پشتیبانی می کنند که شامل دنباله هایی از خطوط متنی است که متغیرها و ثابت ها در آن جاسازی شده اند. تعریف کلان معمولاً [nb 4] است.ترکیبی از دستورات اسمبلر، به عنوان مثال، دستورالعمل ها، دستورالعمل های ماشین نمادین، و الگوهایی برای دستورات اسمبلر. این دنباله از خطوط متن ممکن است شامل کدهای عملیاتی یا دستورالعمل ها باشد. هنگامی که یک ماکرو تعریف شد، می توان نام آن را به جای یادداشت استفاده کرد. هنگامی که اسمبلر چنین عبارتی را پردازش می کند، عبارت را با خطوط متنی مرتبط با آن ماکرو جایگزین می کند، سپس آنها را به گونه ای پردازش می کند که گویی در فایل کد منبع وجود دارند (از جمله، در برخی اسمبلرها، بسط هر ماکرو موجود در متن جایگزین). . ماکروها از این نظر به کدگذارهای خودکار IBM در دهه 1950 مربوط می شوند. [22] [nb 5]

در زبان اسمبلی، اصطلاح "ماکرو" مفهوم جامع تری را نسبت به سایر زمینه ها نشان می دهد، مانند پیش پردازنده در زبان برنامه نویسی C ، جایی که دستور #define آن معمولاً برای ایجاد ماکروهای تک خطی کوتاه استفاده می شود. دستورالعمل‌های ماکرو اسمبلر، مانند ماکروها در PL/I و برخی از زبان‌های دیگر، می‌توانند به تنهایی «برنامه‌های» طولانی باشند که توسط اسمبلر در طول مونتاژ اجرا می‌شوند.

از آنجایی که ماکروها می‌توانند نام‌های «کوتاه» داشته باشند، اما به چندین یا در واقع بسیاری از خطوط کد گسترش می‌یابند، می‌توان از آن‌ها برای ایجاد کوتاه‌تر جلوه دادن برنامه‌های زبان اسمبلی استفاده کرد و مانند زبان‌های سطح بالاتر، به خطوط کمتری از کد منبع نیاز دارند. همچنین می‌توان از آنها برای افزودن سطوح بالاتر ساختار به برنامه‌های اسمبلی، معرفی کد اشکال‌زدایی تعبیه‌شده از طریق پارامترها و سایر ویژگی‌های مشابه استفاده کرد.

اسمبلرهای ماکرو اغلب به ماکروها اجازه می دهند تا پارامترها را بگیرند . برخی از اسمبلرها شامل زبان‌های ماکرو کاملاً پیچیده هستند که از عناصر زبان سطح بالا مانند پارامترهای اختیاری، متغیرهای نمادین، شرطی‌ها، دستکاری رشته‌ها و عملیات‌های حسابی استفاده می‌کنند که همگی در طول اجرای یک ماکرو مشخص قابل استفاده هستند و به ماکروها اجازه می‌دهند تا زمینه را ذخیره یا تبادل اطلاعات کنند. . بنابراین یک ماکرو ممکن است دستورالعمل‌های زبان اسمبلی یا تعاریف داده‌های متعددی را براساس آرگومان‌های ماکرو ایجاد کند. این می تواند برای تولید ساختارهای داده به سبک رکورد یا " unrolled " استفاده شودبرای مثال، حلقه‌ها می‌کند یا می‌تواند کل الگوریتم‌ها را بر اساس پارامترهای پیچیده تولید کند. برای مثال، یک ماکرو «مرتب‌سازی» می‌تواند مشخصات یک کلید مرتب‌سازی پیچیده را بپذیرد و کد ایجاد شده برای آن کلید خاص را تولید کند، بدون نیاز به آزمایش‌های زمان اجرا که برای یک رویه کلی برای تفسیر مشخصات مورد نیاز است. سازمانی که از زبان اسمبلی استفاده می کند و با استفاده از چنین مجموعه ماکرو به شدت گسترش یافته است، می توان در نظر گرفت که در یک زبان سطح بالاتر کار می کند زیرا چنین برنامه نویسانی با پایین ترین سطح رایانه کار نمی کنند. عناصر مفهومی با تأکید بر این نکته، از ماکروها برای پیاده سازی یک ماشین مجازی اولیه در SNOBOL4 استفاده شد(1967)، که به زبان پیاده سازی SNOBOL (SIL)، یک زبان اسمبلی برای ماشین مجازی نوشته شده است. ماشین هدف این را با استفاده از اسمبلر ماکرو به کد اصلی خود ترجمه می کند . [23] این به درجه بالایی از قابلیت حمل برای آن زمان اجازه داد.

ماکروها برای سفارشی کردن سیستم‌های نرم‌افزاری در مقیاس بزرگ برای مشتریان خاص در عصر پردازنده مرکزی استفاده می‌شدند و همچنین توسط پرسنل مشتری برای برآوردن نیازهای کارفرمایان خود با ساخت نسخه‌های خاصی از سیستم‌های عامل سازنده استفاده می‌شد. برای مثال، این کار توسط برنامه نویسان سیستمی انجام شد که با سیستم مانیتور مکالمه / ماشین مجازی IBM ( VM/CMS ) و با افزونه های "پردازش معاملات در زمان واقعی" IBM، سیستم کنترل اطلاعات مشتری CICS و ACP / TPF کار می کردند . سیستم هواپیمایی/مالی که در دهه 1970 شروع شد و هنوز هم بسیاری از سیستم‌های رزرو کامپیوتری بزرگ (CRS) و سیستم‌های کارت اعتباری را اجرا می‌کند.

همچنین می توان تنها از توانایی های پردازش ماکرو یک اسمبلر برای تولید کد نوشته شده به زبان های کاملاً متفاوت استفاده کرد، به عنوان مثال، برای تولید نسخه ای از یک برنامه در COBOL با استفاده از یک برنامه اسمبلر ماکرو خالص حاوی خطوط کد COBOL در اپراتورهای زمان اسمبلی. دستور اسمبلر برای تولید کد دلخواه. IBM OS/360 از ماکروها برای تولید سیستم استفاده می کند . کاربر با کدگذاری یک سری از ماکروهای اسمبلر گزینه ها را مشخص می کند. جمع آوری این ماکروها یک جریان کار برای ساختن سیستم ایجاد می کند، از جمله زبان کنترل کار و دستورات کنترل ابزار .

این به این دلیل است که همانطور که در دهه 1960 متوجه شد، مفهوم "پردازش کلان" مستقل از مفهوم "مونتاژ" است، اولی در اصطلاح مدرن بیشتر پردازش کلمه، پردازش متن، تا تولید کد شی است. مفهوم پردازش ماکرو در زبان برنامه نویسی C ظاهر شد و ظاهر می شود، که از "دستورالعمل های پیش پردازنده" برای تنظیم متغیرها و انجام آزمایش های مشروط بر روی مقادیر آنها پشتیبانی می کند. برخلاف برخی از پردازنده‌های ماکرو قبلی داخل اسمبلرها، پیش‌پردازشگر C تورینگ کامل نیست، زیرا فاقد توانایی حلقه زدن یا «رفتن به» است، دومی اجازه می‌دهد برنامه‌ها حلقه بزنند.

علی‌رغم قدرت پردازش ماکرو، در بسیاری از زبان‌های سطح بالا (استثناهای اصلی C ، C++ و PL/I) استفاده نشد و در عین حال برای اسمبلرها همیشگی باقی ماند.

جایگزینی پارامتر کلان دقیقاً با نام است: در زمان پردازش کلان، مقدار یک پارامتر به صورت متنی جایگزین نام آن می شود. معروف‌ترین دسته از اشکالات حاصل استفاده از پارامتری بود که خود یک عبارت بود و نه یک نام ساده در زمانی که نویسنده کلان انتظار نامی را داشت. در کلان:

foo: ماکرو a
بارگذاری a*b

هدف این بود که تماس گیرنده نام یک متغیر را ارائه دهد و متغیر "جهانی" یا ثابت b برای ضرب "a" استفاده شود. اگر foo با پارامتر فراخوانی شود a-c، بسط ماکرو load a-c*bرخ می دهد. برای جلوگیری از هرگونه ابهام احتمالی، کاربران پردازنده های ماکرو می توانند پارامترهای رسمی را در داخل تعاریف ماکرو پرانتز کنند یا تماس گیرندگان می توانند پارامترهای ورودی را پرانتز کنند. [24]

پشتیبانی از برنامه نویسی ساخت یافته

بسته‌هایی از ماکروها نوشته شده‌اند که عناصر برنامه‌نویسی ساختاریافته را برای کدگذاری جریان اجرا ارائه می‌کنند. اولین نمونه از این رویکرد در مجموعه کلان Concept-14 بود ، [25] که در ابتدا توسط هارلن میلز (مارس 1970) پیشنهاد شد و توسط ماروین کسلر در بخش سیستم‌های فدرال IBM پیاده‌سازی شد، که IF/ELSE/ENDIF و جریان کنترل مشابه را ارائه می‌کرد. بلوک های برنامه های اسمبلر OS/360. این راهی برای کاهش یا حذف استفاده از عملیات GOTO در کد اسمبلی، یکی از عوامل اصلی ایجاد کد اسپاگتی در زبان اسمبلی بود. این رویکرد در اوایل دهه 1980 به طور گسترده پذیرفته شد (آخرین روزهای استفاده از زبان اسمبلی در مقیاس بزرگ). مجموعه ابزار اسمبلر سطح بالا IBM[26] شامل چنین بسته کلان است.

یک طراحی کنجکاو A-natural بود ، یک اسمبلر « جریان‌گرا » برای 8080/ Z80 ، پردازنده‌های [ نیازمند منبع ] از Whitesmiths Ltd. (توسعه‌دهندگان سیستم‌عامل Idris مانند Unix ، و آنچه به عنوان اولین C تجاری گزارش شد. کامپایلر ). این زبان به عنوان اسمبلر طبقه بندی شد زیرا با عناصر ماشین خام مانند کدهای عملیاتی ، رجیسترها کار می کرد.و مراجع حافظه؛ اما یک نحو عبارت برای نشان دادن ترتیب اجرا گنجانده شده است. پرانتزها و سایر نمادهای خاص، همراه با ساختارهای برنامه نویسی ساخت یافته بلوک گرا، توالی دستورالعمل های تولید شده را کنترل می کردند. A-natural به‌جای کدنویسی دستی، به‌عنوان زبان شیء یک کامپایلر C ساخته شد، اما نحو منطقی آن طرفداران زیادی را به خود جلب کرد.

از زمان کاهش توسعه زبان اسمبلی در مقیاس بزرگ، تقاضای ظاهری کمی برای اسمبلرهای پیچیده تر وجود داشته است. [27] با وجود آن، آنها هنوز در حال توسعه و اعمال در مواردی هستند که محدودیت های منابع یا ویژگی های خاص در معماری سیستم هدف مانع استفاده مؤثر از زبان های سطح بالاتر می شود. [28]

اسمبلرها با موتور ماکرو قوی امکان برنامه ریزی ساختاریافته از طریق ماکروها را می دهند، مانند ماکرو سوئیچ ارائه شده با بسته Masm32 (این کد یک برنامه کامل است):

شامل  \ masm32 \ include \ masm32rt.inc 	; از کتابخانه Masm32 استفاده کنید

.code 
demomain: 
  REPEAT  20 
	switch  rv ( nrandom ,  9 ) 	; تولید عددی بین 0 و 8 
	mov  ecx ,  7 
	case  0 
		print  "case 0" 
	case  ecx 				; بر خلاف بسیاری از زبان های برنامه نویسی دیگر، 
		"مورد 7" را چاپ کنید  . سوئیچ Masm32 اجازه می دهد "مورد متغیر" مورد 1 .. 3 .if eax == 1 print "case 1" .elseif eax == 2 print "case 2" .else print		
	   
		 
			 
		 
			 
		
			 "موارد 1 تا 3: موارد دیگر" 
		.endif 
	مورد  4 ,  6 ,  8 
		چاپ  "موارد 4، 6 یا 8" 
	پیش فرض 
		mov  ebx ,  19 		     ; چاپ 20 ستاره 
		.تکرار 
			چاپ  "*" 
			دسامبر  ebx 
		.تا  Si gn? 		 ; حلقه 
	بزنید 
	تا پرچم علامت تنظیم شود endsw print  ch r$ ( 13 ,  10 ) 
  ENDM 
  exit 
end  demomain

استفاده از زبان اسمبلی

دیدگاه تاریخی

در زمانی که کامپیوتر برنامه ذخیره شده معرفی شد، زبان اسمبلی در دسترس نبود . کاتلین غرفه "با ابداع زبان اسمبلی اعتبار" [29] [30] بر اساس کار نظری او در سال 1947 آغاز شد، در حالی که مشغول کار بر روی ARC2 در برکبک، دانشگاه لندن پس از مشاوره توسط اندرو غرفه (بعد شوهرش) با ریاضیدان جان فون نویمان و فیزیکدان هرمان گلدستاین در موسسه مطالعات پیشرفته . [30] [31]

در اواخر سال 1948، ماشین حساب خودکار ذخیره سازی تاخیر الکترونیکی (EDSAC) یک اسمبلر (به نام "سفارش های اولیه") در برنامه بوت استرپ خود داشت. از یادداشت های یک حرفی استفاده می کرد که توسط دیوید ویلر توسعه یافته بود ، که توسط انجمن رایانه ای IEEE به عنوان خالق اولین "مونتاژکننده" اعتبار دارد. [14] [32] [33] گزارش‌های مربوط به EDSAC اصطلاح "مونتاژ" را برای فرآیند ترکیب فیلدها در یک کلمه دستورالعمل معرفی کردند. [34] SOAP ( برنامه اسمبلی بهینه اسمبلی ) یک زبان اسمبلی برای کامپیوتر IBM 650 بود که توسط Stan Poley در سال 1955 نوشته شد. [35]

زبان‌های اسمبلی بسیاری از برنامه‌نویسی‌های مستعد خطا، خسته‌کننده و زمان‌بر نسل اول مورد نیاز با رایانه‌های اولیه را حذف می‌کنند و برنامه‌نویسان را از خستگی‌هایی مانند به خاطر سپردن کدهای عددی و محاسبه آدرس‌ها آزاد می‌کنند.

زبان های اسمبلی زمانی به طور گسترده برای انواع برنامه نویسی استفاده می شد. با این حال، در دهه 1980 (دهه 1990 در میکروکامپیوترها )، استفاده از آنها تا حد زیادی با زبان های سطح بالاتر، در جستجوی بهبود بهره وری برنامه نویسی ، جایگزین شد . امروزه، زبان اسمبلی هنوز برای دستکاری مستقیم سخت افزار، دسترسی به دستورالعمل های تخصصی پردازنده، یا رسیدگی به مسائل مهم عملکرد استفاده می شود. معمولی استفاده می کند می درایور های دستگاه ، سطح پایین سیستم های جاسازی شده ، و در زمان واقعی سیستم.

از لحاظ تاریخی، برنامه های متعددی به طور کامل به زبان اسمبلی نوشته شده اند. باروز MCP (1961) اولین کامپیوتر که برای آن یک سیستم عامل به طور کامل در زبان اسمبلی افزار توسعه داده شد بود. این به زبان سیستم های اجرایی مشکل گرا (ESPOL)، یک گویش الگولی نوشته شده است. بسیاری از برنامه های تجاری به زبان اسمبلی نیز نوشته شده اند، از جمله تعداد زیادی از نرم افزارهای اصلی IBM که توسط شرکت های بزرگ نوشته شده است. COBOL ، FORTRAN و برخی از PL/I در نهایت بسیاری از این کار را جابجا کردند، اگرچه تعدادی از سازمان‌های بزرگ زیرساخت‌های برنامه کاربردی به زبان اسمبلی را تا دهه 1990 حفظ کردند.

اکثر میکروکامپیوترهای اولیه به زبان اسمبلی با کد دستی متکی بودند، از جمله بیشتر سیستم عامل ها و برنامه های کاربردی بزرگ. این به این دلیل بود که این سیستم‌ها محدودیت‌های شدید منابع داشتند، معماری‌های حافظه و نمایشگر را تحمیل می‌کردند و خدمات سیستمی محدود و باگ ارائه می‌کردند. شاید مهمتر نبود کامپایلرهای درجه یک زبان سطح بالا مناسب برای استفاده از میکرو کامپیوتر بود. یک عامل روانشناختی نیز ممکن است نقش داشته باشد: نسل اول برنامه نویسان میکروکامپیوتر نگرش علاقه مندانه، "سیم و انبردست" را حفظ کردند.

در یک زمینه تجاری تر، بزرگترین دلایل برای استفاده از زبان اسمبلی حداقل bloat (اندازه)، حداقل سربار، سرعت بیشتر و قابلیت اطمینان بود.

نمونه‌های معمولی از برنامه‌های بزرگ به زبان اسمبلی از این زمان عبارتند از: سیستم‌عامل IBM PC DOS ، کامپایلر Turbo Pascal و برنامه‌های کاربردی اولیه مانند برنامه صفحه گسترده Lotus 1-2-3 . از زبان اسمبلی برای دریافت بهترین عملکرد از Sega Saturn استفاده شد ، کنسولی که توسعه و برنامه‌نویسی بازی‌ها برای آن بسیار چالش برانگیز بود. [36] بازی آرکید 1993 NBA Jam مثال دیگری است.

زبان اسمبلی برای مدت طولانی زبان اصلی توسعه بسیاری از کامپیوترهای خانگی محبوب دهه 1980 و 1990 بوده است (مانند MSX ، Sinclair ZX Spectrum ، Commodore 64 ، Commodore Amiga و Atari ST ). این تا حد زیادی به این دلیل بود که لهجه‌های BASIC تفسیر شده در این سیستم‌ها سرعت اجرای ناکافی و همچنین امکانات کافی برای استفاده کامل از سخت‌افزار موجود در این سیستم‌ها را نداشتند. برخی از سیستم ها حتی دارای یک محیط توسعه یکپارچه (IDE) با امکانات بسیار پیشرفته اشکال زدایی و ماکرو هستند. برخی از کامپایلرهای موجود برای Radio Shack TRS-80و جانشینان آن توانایی ترکیب منبع اسمبلی درون خطی با بیانیه های برنامه سطح بالا را داشتند. پس از تدوین، یک اسمبلر داخلی کد ماشین درون خطی را تولید کرد.

استفاده فعلی

همیشه [37] بحث هایی در مورد سودمندی و عملکرد زبان اسمبلی نسبت به زبان های سطح بالا وجود داشته است.

اگرچه زبان اسمبلی در مواردی که مهم است کاربردهای ویژه ای دارد (به زیر مراجعه کنید)، ابزارهای دیگری برای بهینه سازی وجود دارد. [38]

از جولای 2017 ، شاخص محبوبیت زبان برنامه نویسی TIOBE ، زبان اسمبلی را در رتبه 11 قرار می دهد ، برای مثال ، بالاتر از ویژوال بیسیک . [39] اسمبلر را می توان برای بهینه سازی سرعت یا بهینه سازی برای اندازه استفاده کرد. در مورد بهینه‌سازی سرعت، کامپایلرهای بهینه‌سازی مدرن [40] ادعا می‌کنند که زبان‌های سطح بالا را به کدی تبدیل می‌کنند که می‌تواند به سرعت اسمبلی دست‌نویس اجرا شود، علی‌رغم مثال‌های متقابلی که می‌توان یافت. [41] [42] [43] پیچیدگی پردازنده‌های مدرن و زیرسیستم‌های حافظه، بهینه‌سازی مؤثر را برای کامپایلرها و همچنین برای برنامه‌نویسان اسمبلی دشوار می‌کند. [44] [45]علاوه بر این، افزایش عملکرد پردازنده به این معنی است که اکثر CPU ها در بیشتر مواقع بیکار می نشینند، [46] با تاخیرهای ناشی از تنگناهای قابل پیش بینی مانند از دست دادن حافظه پنهان، عملیات I/O و صفحه بندی . این باعث شده است که سرعت اجرای کد خام برای بسیاری از برنامه نویسان مشکلی نداشته باشد.

شرایطی وجود دارد که توسعه دهندگان ممکن است استفاده از زبان اسمبلی را انتخاب کنند:

  • نوشتن کد برای سیستم‌هایی با پردازنده‌های قدیمی‌تر [ توضیح لازم است ] که گزینه‌های زبان سطح بالا مانند Atari 2600 ، Commodore 64 و ماشین‌حساب‌های نموداری محدودی دارند . [47] برنامه‌های این رایانه‌های دهه‌های 1970 و 1980 اغلب در زمینه خرده‌فرهنگ‌های demoscene یا retrogaming نوشته می‌شوند .
  • کدی که باید مستقیماً با سخت افزار تعامل داشته باشد، به عنوان مثال در درایورهای دستگاه و کنترل کننده های وقفه .
  • در یک پردازنده تعبیه شده یا DSP، وقفه های با تکرار بالا به کمترین تعداد چرخه در هر وقفه نیاز دارند، مانند وقفه ای که 1000 یا 10000 بار در ثانیه رخ می دهد.
  • برنامه هایی که نیاز به استفاده از دستورالعمل های خاص پردازنده دارند که در کامپایلر پیاده سازی نشده اند. یک مثال رایج، دستورالعمل چرخش بیتی در هسته بسیاری از الگوریتم‌های رمزگذاری، و همچنین جست‌وجو در برابری یک بایت یا حمل 4 بیتی یک اضافه است.
  • یک فایل اجرایی مستقل با اندازه فشرده مورد نیاز است که باید بدون توسل به اجزای زمان اجرا یا کتابخانه های مرتبط با یک زبان سطح بالا اجرا شود. نمونه‌ها شامل سیستم‌افزار تلفن‌ها، سیستم‌های سوخت خودرو و احتراق، سیستم‌های کنترل تهویه مطبوع، سیستم‌های امنیتی و سنسورها هستند.
  • برنامه‌هایی با حلقه‌های داخلی حساس به عملکرد، که در آن زبان اسمبلی فرصت‌های بهینه‌سازی را فراهم می‌کند که دستیابی به آنها در یک زبان سطح بالا دشوار است. به عنوان مثال، جبر خطی با BLAS [41] [48] یا تبدیل کسینوس گسسته (به عنوان مثال نسخه اسمبلی SIMD از x264 [49] ).
  • برنامه‌هایی که توابع برداری را برای برنامه‌ها در زبان‌های سطح بالاتر مانند C ایجاد می‌کنند. در زبان سطح بالاتر، گاهی اوقات توابع ذاتی کامپایلر که مستقیماً به حافظه‌های SIMD نگاشت می‌شوند، کمک می‌کند، اما با این وجود منجر به تبدیل اسمبلی یک به یک خاص می‌شود. برای پردازنده برداری داده شده
  • زمان واقعی برنامه هایی مانند شبیه سازی، سیستم های ناوبری پرواز و تجهیزات پزشکی. به عنوان مثال، در یک سیستم fly-by-wire ، تله متری باید در محدودیت های زمانی دقیق تفسیر و عمل شود. چنین سیستم‌هایی باید منابع تأخیرهای غیرقابل پیش‌بینی را که ممکن است توسط (برخی) زبان‌های تفسیر شده، جمع‌آوری خودکار زباله ، عملیات صفحه‌بندی، یا چندوظیفه پیشگیرانه ایجاد شوند، حذف کنند. با این حال، برخی از زبان‌های سطح بالاتر دارای اجزای زمان اجرا و رابط‌های سیستم عامل هستند که می‌توانند چنین تاخیرهایی را ایجاد کنند. انتخاب زبان های اسمبلی یا سطح پایین تر برای چنین سیستم هایی به برنامه نویسان دید و کنترل بیشتری بر جزئیات پردازش می دهد.
  • الگوریتم‌های رمزنگاری که همیشه باید زمان اجرای آنها کاملاً یکسان باشد و از حملات زمان‌بندی جلوگیری شود .
  • کدهای قدیمی نوشته شده برای رایانه های اصلی IBM را اصلاح و گسترش دهید. [50] [51]
  • موقعیت‌هایی که کنترل کامل بر محیط مورد نیاز است، در موقعیت‌های بسیار با امنیت بالا که هیچ چیز را نمی‌توان بدیهی انگاشت .
  • ویروس‌های رایانه‌ای ، بوت‌لودرها ، درایورهای دستگاه خاص یا موارد دیگر بسیار نزدیک به سخت‌افزار یا سیستم‌عامل سطح پایین.
  • شبیه سازهای مجموعه دستورالعمل برای نظارت، ردیابی و اشکال زدایی در جایی که سربار اضافی به حداقل می رسد.
  • موقعیت هایی که هیچ زبان سطح بالایی وجود ندارد، روی یک پردازنده جدید یا تخصصی که هیچ کامپایلر متقابلی برای آن در دسترس نیست.
  • مهندسی معکوس و اصلاح فایل های برنامه مانند:
    • باینری‌های موجود که ممکن است در ابتدا به یک زبان سطح بالا نوشته شده باشند یا نباشند، برای مثال هنگام تلاش برای بازآفرینی برنامه‌هایی که کد منبع آن‌ها در دسترس نیست یا گم شده است، یا کرک کردن محافظت از کپی نرم‌افزار اختصاصی.
    • بازی های ویدیویی (همچنین هک ROM نامیده می شود )، که از طریق چندین روش امکان پذیر است. پرکاربردترین روش، تغییر کد برنامه در سطح زبان اسمبلی است.

زبان اسمبلی هنوز در اکثر برنامه های علوم کامپیوتر و مهندسی الکترونیک تدریس می شود . اگرچه امروزه تعداد کمی از برنامه نویسان به طور منظم با زبان اسمبلی به عنوان یک ابزار کار می کنند، مفاهیم اساسی همچنان مهم هستند. موضوعات اساسی مانند حساب باینری ، تخصیص حافظه ، پردازش پشته ، رمزگذاری مجموعه کاراکترها ، پردازش وقفه ، و کامپایلربدون درک نحوه عملکرد یک کامپیوتر در سطح سخت افزار، مطالعه جزئیات طراحی دشوار خواهد بود. از آنجایی که رفتار یک کامپیوتر اساساً با مجموعه دستورالعمل آن تعریف می شود، راه منطقی برای یادگیری چنین مفاهیمی، مطالعه یک زبان اسمبلی است. اکثر کامپیوترهای مدرن دارای مجموعه دستورالعمل های مشابهی هستند. بنابراین، مطالعه یک زبان اسمبلی برای یادگیری کافی است: 1) مفاهیم اساسی. II) تشخیص موقعیت هایی که ممکن است استفاده از زبان اسمبلی مناسب باشد. و III) برای دیدن اینکه چگونه کد اجرایی کارآمد را می توان از زبان های سطح بالا ایجاد کرد. [16]

برنامه های کاربردی معمولی

  • زبان اسمبلی معمولاً در کد بوت سیستم استفاده می‌شود، کد سطح پایینی که سخت‌افزار سیستم را قبل از راه‌اندازی سیستم عامل اولیه و آزمایش می‌کند و اغلب در ROM ذخیره می‌شود . ( BIOS در سیستم‌های رایانه شخصی سازگار با IBM و CP/M یک مثال است.)
  • زبان اسمبلی اغلب برای کدهای سطح پایین استفاده می‌شود، به‌عنوان مثال برای هسته‌های سیستم‌عامل ، که نمی‌توانند به در دسترس بودن فراخوان‌های سیستمی از قبل موجود اعتماد کنند و در واقع باید آن‌ها را برای معماری پردازنده خاصی که سیستم روی آن اجرا می‌شود، پیاده‌سازی کند.
  • برخی از کامپایلرها ابتدا زبان‌های سطح بالا را قبل از کامپایل کامل به اسمبلی ترجمه می‌کنند و اجازه می‌دهند کد اسمبلی برای اهداف اشکال‌زدایی و بهینه‌سازی مشاهده شود.
  • برخی از کامپایلرهای زبان های نسبتاً سطح پایین، مانند پاسکال یا C ، به برنامه نویس اجازه می دهند تا زبان اسمبلی را مستقیماً در کد منبع جاسازی کند (به اصطلاح اسمبلی درون خطی ). سپس برنامه‌هایی که از چنین امکاناتی استفاده می‌کنند، می‌توانند با استفاده از زبان اسمبلی مختلف بر روی هر پلتفرم سخت‌افزاری انتزاعی بسازند. کد قابل حمل سیستم می تواند از طریق یک رابط یکسان از این اجزای خاص پردازنده استفاده کند.
  • زبان اسمبلی در مهندسی معکوس مفید است . بسیاری از برنامه‌ها فقط به شکل کد ماشینی توزیع می‌شوند که ترجمه آن به زبان اسمبلی توسط یک دی اسمبلر ساده است ، اما ترجمه آن به زبان سطح بالاتر از طریق یک دیکامپایلر دشوارتر است . ابزارهایی مانند Disassembler تعاملی برای چنین هدفی از جداسازی قطعات استفاده زیادی می کنند. این تکنیک توسط هکرها برای شکستن نرم افزارهای تجاری و رقبا برای تولید نرم افزار با نتایج مشابه از شرکت های رقیب استفاده می شود.
  • زبان اسمبلی برای افزایش سرعت اجرا بخصوص در کامپیوترهای شخصی اولیه با قدرت پردازش و RAM محدود استفاده می شود.
  • اسمبلرها را می توان برای تولید بلوک های داده، بدون سربار زبان سطح بالا، از کد منبع فرمت شده و نظر داده شده، برای استفاده توسط سایر کدها استفاده کرد. [52] [53]

همچنین ببینید

یادداشت ها

  1. ^ "به عنوان یک متا اسمبلر استفاده می شود، کاربر را قادر می سازد تا زبان های برنامه نویسی خود را طراحی کند و با حداقل تلاش، پردازنده هایی را برای چنین زبان هایی تولید کند."
  2. ^ این یکی از دو شکل اضافی این دستورالعمل است که به طور یکسان عمل می کنند. 8086 و چندین CPU دیگر از اواخر دهه 1970 / اوایل دهه 1980 دارای افزونگی هایی در مجموعه دستورالعمل های خود هستند، زیرا برای مهندسان ساده تر بود که این CPU ها را (برای قرار گرفتن روی تراشه های سیلیکونی با اندازه های محدود) با کدهای اضافی طراحی کنند تا حذف آنها (نگاه کنید به). شرایط اهمیت نده ). هر اسمبلر معمولاً تنها یکی از دو یا چند کدگذاری دستورالعمل اضافی را تولید می کند، اما یک دی اسمبلر معمولاً هر یک از آنها را تشخیص می دهد.
  3. ^ AMD منبع دوم پردازنده های Intel 8086، 8088 و 80286 و شاید پردازنده های 8080A و/یا 8085A را تحت لیسانس اینتل تولید کرد، اما با شروع 80386، اینتل از به اشتراک گذاشتن طرح های پردازنده x86 خود با کسی امتناع کرد—AMD در این مورد شکایت کرد. برای نقض قرارداد—و AMD پردازنده های خانواده 32 بیتی و 64 بیتی x86 را بدون کمک یا تأیید اینتل طراحی، ساخت و فروخت.
  4. ^ در Autocoder 7070، یک تعریف ماکرو یک برنامه تولید کننده ماکرو 7070 است که اسمبلر آن را فراخوانی می کند. Autocoder ماکروهای ویژه ای را برای استفاده از ژنراتورهای ماکرو فراهم می کند.
  5. ^ "محدودیت یا محدودیت جزئی زیر با توجه به استفاده از 1401 Autocoder هنگام کدنویسی دستورالعمل های ماکرو اعمال می شود ..."

منابع

  1. ^ a b "زبان اسمبلر" . اسمبلر سطح بالا برای z/OS & z/VM & z/VSE مرجع زبان نسخه 1 انتشار 6 . آی بی ام . 2014 [1990]. SC26-4940-06.
  2. ^ ساکسون، جیمز ای. پلت، ویلیام اس (1962). برنامه نویسی IBM 1401، یک کتابچه راهنمای برنامه ریزی شده خودآموز . Englewood Cliffs، نیوجرسی، ایالات متحده آمریکا: Prentice-Hall . LCCN 62-20615 . (نکته. استفاده از اصطلاح برنامه اسمبلی .)
  3. Kornelis، AF (2010) [2003]. "مجموعه کننده سطح بالا - مروری بر کدهای عملیاتی، دستورالعمل های اسمبلر" . بایگانی شده از نسخه اصلی در 2020-03-24 . بازیابی شده در 2020-03-24 .
  4. ^ "دستورالعمل های ماکرو" . اسمبلر سطح بالا برای z/OS & z/VM & z/VSE مرجع زبان نسخه 1 انتشار 6 . آی بی ام . 2014 [1990]. SC26-4940-06.
  5. ویلکس، موریس وینسنت ؛ ویلر، دیوید جان ؛ گیل، استنلی جی (1951). آماده سازی برنامه ها برای کامپیوتر دیجیتال الکترونیکی (Reprint 1982 ed.). انتشارات توماش . شابک 978-0-93822803-5. OCLC  313593586 .
  6. فرهد، هری (16-11-2017). "تاریخ زبان های کامپیوتری - دهه کلاسیک، دهه 1950" . من برنامه نویس . بایگانی شده از نسخه اصلی در 02-01-2020 . بازیابی شده در 06-03-2020 .
  7. «مونتاژ: مرور» (PDF) . علوم و مهندسی کامپیوتر. کالج مهندسی، دانشگاه ایالتی اوهایو . 2016. بایگانی شده (PDF) از نسخه اصلی در 2020-03-24 . بازیابی شده در 2020-03-24 .
  8. آرچر، بنجامین (نوامبر ۲۰۱۶). زبان اسمبلی برای دانش آموزان . چارلستون شمالی، کارولینای جنوبی، ایالات متحده: انتشارات مستقل CreateSpace . شابک 978-1-5403-7071-6. زبان اسمبلی ممکن است رمز ماشین نمادین نیز نامیده شود.
  9. ^ "زبان های اسمبلی چگونه به سیستم عامل ها بستگی دارند؟" . صرافی پشته . Stack Exchange Inc. 2011-07-28. بایگانی شده از نسخه اصلی در 2020-03-24 . بازیابی شده در 2020-03-24 .(نکته. فراخوانی های سیستم اغلب متفاوت است، به عنوان مثال برای MVS در مقابل VSE در مقابل VM/CMS؛ فرمت های باینری/قابل اجرا برای سیستم عامل های مختلف نیز ممکن است متفاوت باشد.)
  10. داینتیت، جان، ویرایش. (2019). "متا اسمبلر" . فرهنگ لغت محاسبات . بایگانی شده از نسخه اصلی در 2020-03-24 . بازیابی شده در 2020-03-24 .
  11. ^ سیستم های داده زیراکس (اکتبر 1975). راهنمای زبان و عملیات Xerox Meta-Symbol Sigma 5-9 Computers مرجع (PDF) . پ. vi . بازیابی شده در 07-06-2020 .
  12. Sperry Univac Computer Systems (1977). مرجع برنامه نویس Sperry Univac Computer Systems Meta-Assembler (MASM) (PDF) . بازیابی شده در 07-06-2020 .
  13. «نحوه استفاده از زبان اسمبلی درون خطی در کد C» . gnu.org . بازیابی شده در 2020-11-05 .
  14. ^ a b c d Salomon, David (فوریه 1993) [1992]. نوشته شده در دانشگاه ایالتی کالیفرنیا، نورتریج، کالیفرنیا، ایالات متحده آمریکا. چیورز، یان دی. اسمبلرها و لودرها (PDF) . سری الیس هوروود در کامپیوترها و کاربردهای آنها (1 ویرایش). Chicester، West Sussex، UK: Ellis Horwood Limited / Simon & Schuster International Group . ص 7، 237-238. شابک  0-13-052564-2. بایگانی شده (PDF) از نسخه اصلی در 23-03-2020 . بازیابی شده در 2008-10-01 . (xiv+294+4 صفحه)
  15. ^ بک، لیلاند ال. (1996). "2". نرم افزار سیستم: مقدمه ای بر برنامه نویسی سیستم ها . ادیسون وسلی .
  16. ^ a b هاید، رندال (سپتامبر 2003) [30-09-1996]. "پیشگفتار ("چرا کسی این چیزها را یاد می گیرد؟") / فصل 12 - کلاس ها و اشیا". هنر زبان اسمبلی (ویرایش 2). بدون نشاسته مطبوعات . شابک 1-886411-97-2. بایگانی شده از نسخه اصلی در 2010-05-06 . بازیابی شده در 22-06-2020 .اشتباه: [1] (928 صفحه) [2] [3]
  17. ^ a b c d Intel Architecture Software Developer's Manual, Volume 2: Instruction Set Reference (PDF) . 2 . شرکت اینتل . 1999. بایگانی شده از نسخه اصلی (PDF) در 2009-06-11 . بازیابی 2010-11-18 .
  18. ^ فراری، آدام؛ باتسون، آلن؛ کمبود، مایک؛ جونز، آنیتا (2018-11-19) [بهار 2006]. ایوانز، دیوید (ویرایش). "راهنمای مونتاژ x86" . علوم کامپیوتر CS216: برنامه و نمایش داده ها. دانشگاه ویرجینیا . بایگانی شده از نسخه اصلی در 2020-03-24 . بازیابی 2010-11-18 .
  19. «راهنمای معماری SPARC، نسخه 8» (PDF) . SPARC International . 1992. بایگانی شده از نسخه اصلی (PDF) در 2011-12-10 . بازیابی 2011-12-10 .
  20. موکسام، جیمز (1996). "مترجم ZINT Z80" . کدهای عملیات Z80 برای ZINT . بایگانی شده از نسخه اصلی در 2020-03-24 . بازیابی شده در 2013-07-21 .
  21. ^ هاید، رندال . "فصل 8. MASM: دستورالعمل ها و شبه کدها" (PDF) . هنر برنامه نویسی کامپیوتر . بایگانی شده (PDF) از نسخه اصلی در 2020-03-24 . بازیابی شده در 2011-03-19 .
  22. ^ کاربران 1401 Autocoder . بایگانی شده از نسخه اصلی در 2020-03-24 . بازیابی شده در 2020-03-24 .
  23. گریسوولد، رالف ای. (1972). "فصل 1". پیاده سازی کلان SNOBOL4 . سانفرانسیسکو، کالیفرنیا، ایالات متحده آمریکا: WH Freeman and Company . شابک 0-7167-0447-1.
  24. «Macros (C/C++)، کتابخانه MSDN for Visual Studio 2008» . Microsoft Corp. 2012-11-16. بایگانی شده از نسخه اصلی در 2020-03-24 . بازیابی شده در 22-06-2010 .
  25. ^ کسلر، ماروین ام. (1970-12-18). "*مفهوم* گزارش 14 - پیاده سازی ماکروها برای اجازه برنامه نویسی ساختاریافته در OS/360" . نرم افزار MVS: Concept 14 Macros . Gaithersburg، مریلند، ایالات متحده آمریکا: International Business Machines Corporation . بایگانی شده از نسخه اصلی در 2020-03-24 . بازیابی شده در 2009-05-25 .
  26. «ویژگی جعبه ابزار اسمبلر سطح بالا بهره وری برنامه نویس را افزایش می دهد» . نامه اطلاعیه . IBM. 1995-12-12. A95-1432.
  27. ^ "زبان اسمبلی: تعریف و موارد دیگر از Answers.com" . answers.com . بایگانی شده از نسخه اصلی در 2009-06-08 . بازیابی شده در 2008-06-19 .
  28. Provinciano، برایان (2005-04-17). "NESHLA: سطح بالا، منبع باز، اسمبلر 6502 برای سیستم سرگرمی نینتندو" . بایگانی شده از نسخه اصلی در 2020-03-24 . بازیابی شده در 2020-03-24 .
  29. دوفرن، استیون (2018-08-21). "کاتلین بوث: مونتاژ کامپیوترهای اولیه در حین اختراع مونتاژ" . بایگانی شده از نسخه اصلی در 2020-03-24 . بازیابی شده در 2019-02-10 .
  30. ^ a b بوث، اندرو دونالد ; بریتن، کاتلین هیلدا والری (سپتامبر 1947) [آگوست 1947]. ملاحظات کلی در طراحی یک کامپیوتر دیجیتال الکترونیکی همه منظوره (PDF) (2 ویرایش). موسسه مطالعات پیشرفته، پرینستون، نیوجرسی، ایالات متحده آمریکا: کالج برکبک، لندن . بایگانی شده (PDF) از نسخه اصلی در 2020-03-24 . بازیابی شده در 2019-02-10 . ایده های غیراصلی موجود در متن زیر، از منابع متعددی استخراج شده اند، ... با این حال، احساس می شود که باید به پروفسور جان فون نویمان و دکتر هرمان گلدشتاین قدردانی کرد. بحث های ...
  31. کمبل-کلی، مارتین (آوریل 1982). "توسعه برنامه نویسی کامپیوتر در بریتانیا (1945 تا 1955)". IEEE Annals of the History of Computing . 4 (2): 121-139. doi : 10.1109/MAHC.1982.10016 . S2CID 14861159 . 
  32. کمبل-کلی، مارتین (1980). "برنامه نویسی EDSAC". IEEE Annals of the History of Computing . 2 (1): 7-36. doi : 10.1109/MAHC.1980.10009 .
  33. «جایزه پیشگامان کامپیوتر در سال ۱۹۸۵ برای برنامه‌نویسی زبان اسمبلی» دیوید ویلر» .
  34. ویلکس، موریس وینسنت (1949). EDSAC - یک ماشین محاسبه الکترونیکی. مجله ابزار علمی . 26 (12): 385-391. Bibcode : 1949JScI...26..385W . doi : 10.1088/0950-7671/26/12/301 .
  35. ^ دا کروز، فرانک (17-05-2019). "ماشین حساب درام مغناطیسی IBM 650" . تاریخچه محاسبات - گاهشماری محاسبات. دانشگاه کلمبیا . بایگانی شده از نسخه اصلی در 2020-02-15 . بازیابی شده در 2012-01-17 .
  36. پتوس، سام (10-01-2008). "SegaBase Volume 6 - Saturn" . بایگانی شده از نسخه اصلی در 2008-07-13 . بازیابی شده در 2008-07-25 .
  37. کائولر، بری (09-01-1997). زبان ویندوز اسمبلی و برنامه نویسی سیستم ها: برنامه نویسی 16 و 32 بیتی سطح پایین برای رایانه شخصی و ویندوز . مطبوعات CRC . شابک 978-1-48227572-8. بازیابی شده در 2020-03-24 . همیشه بحث در مورد کاربرد زبان اسمبلی در دنیای برنامه نویسی مدرن ما بالا گرفته است.
  38. هسیه، پل (2020-03-24) [2016، 1996]. "بهینه سازی برنامه نویسی" . بایگانی شده از نسخه اصلی در 2020-03-24 . بازیابی شده در 2020-03-24 . ... تغییرات طراحی تمایل دارند عملکرد را بیش از ... تحت تاثیر قرار دهند تا زمانی که ...
  39. «شاخص TIOBE» . نرم افزار TIOBE . بایگانی شده از نسخه اصلی در 2020-03-24 . بازیابی شده در 2020-03-24 .
  40. راسلینگ، دیوید ای. (1999) [1996]. "فصل 2 مبانی نرم افزار" . هسته لینوکس . بایگانی شده از نسخه اصلی در 2020-03-24 . بازیابی شده در 11-03-2012 .
  41. ^ a b مارکف، جان گرگوری (2005-11-28). "نوشتن سریعترین کد، توسط دست، برای سرگرمی: یک کامپیوتر انسانی سرعت تراشه ها را افزایش می دهد" . نیویورک تایمز . سیاتل، واشنگتن، ایالات متحده آمریکا بایگانی شده از نسخه اصلی در 2020-03-23 . بازیابی شده در 2010-03-04 .
  42. «Bit-field-badness» . hardwarebug.org . 30/01/2010. بایگانی شده از نسخه اصلی در 2010-02-05 . بازیابی شده در 2010-03-04 .
  43. «GCC باعث آشفتگی می‌شود» . hardwarebug.org . 13/05/2009. بایگانی شده از نسخه اصلی در 2010-03-16 . بازیابی شده در 2010-03-04 .
  44. ^ هاید، رندال . "مناظره بزرگ" . بایگانی شده از نسخه اصلی در 2008-06-16 . بازیابی شده در 2008-07-03 .
  45. «منبع کد دوباره شکست خورد» . hardwarebug.org . 30/01/2010. بایگانی شده از نسخه اصلی در 2010-04-02 . بازیابی شده در 2010-03-04 .
  46. ^ کلیک کنید، کلیف. گوتز، برایان. "یک دوره تصادف در سخت افزار مدرن" . بایگانی شده از نسخه اصلی در 2020-03-24 . بازیابی شده در 01-05-2014 .
  47. "برنامه نویسی 68K در Fargo II" . بایگانی شده از نسخه اصلی در 2008-07-02 . بازیابی شده در 2008-07-03 .
  48. «BLAS Benchmark-August2008» . eigen.tuxfamily.org. 01-08-2008. بایگانی شده از نسخه اصلی در 2020-03-24 . بازیابی شده در 2010-03-04 .
  49. «x264.git/common/x86/dct-32.asm» . git.videolan.org. 29/09/2010. بایگانی شده از نسخه اصلی در 04-03-2012 . بازیابی شده در 29-09-2010 .
  50. بوسورث، ادوارد (2016). فصل 1 – چرا زبان اسمبلی را مطالعه کنیم ؟ www.edwardbosworth.com . بایگانی شده از نسخه اصلی در 2020-03-24 . بازیابی شده در 2016-06-01 .
  51. ^ "z/OS نسخه 2 انتشار 3 دستورالعمل ماکرو DFSMS برای مجموعه داده ها" (PDF) . IBM. 15/02/2019 . بازیابی شده در 2021-09-14 .
  52. ^ Paul, Matthias R. (2001) [1996]، "مشخصات و مستندات مرجع برای NECPINW" ، NECPINW.CPI - درایور تغییر صفحه کد DOS برای NEC Pinwriters (ویرایش 2.08)، FILESPEC.TXT، NECPINW.ASM، EUROFONT. INC از NECPI208.ZIP، بایگانی شده از نسخه اصلی در 2017-09-10 ، بازیابی شده در 2013-04-22
  53. پل، ماتیاس آر (2002-05-13). "[fd-dev] mkeyb" . freedos-dev . بایگانی شده از نسخه اصلی در 2018-09-10 . بازیابی شده در 2018-09-10 .

ادامه مطلب

پیوندهای خارجی