عملیاتهای منطقی: دستکاری مستقیم بیتها
هر عملیاتی که یک پردازنده انجام میدهد با اعداد بهعنوان کمیتهای کامل سروکار ندارد. گاهی نرمافزار نیاز دارد بیتهای خاصی درون یک مقدار را دستکاری کند، که این کار با استفاده از Logical Operations انجام میشود.
ANDدر هر موقعیت بیتی فقط جایی که هر دو عملوند ۱ داشته باشند، ۱ تولید میکند، که معمولاً برای پاک کردن بیتهای خاص استفاده میشود، عملیاتی به نامMasking.ORدر هر موقعیت بیتی که حداقل یک عملوند ۱ داشته باشد، ۱ تولید میکند، که معمولاً برای تنظیم بیتهای خاص استفاده میشود.Shift Left (sll)وShift Right (srl)همه بیتهای یک مقدار را به تعداد ثابتی موقعیت جابهجا میکنند، که همچنین روشی کارآمد برای ضرب یا تقسیم بر توانهای دو است.
مثالی از یک دستور AND منطقی در اسمبلی RISC-V:
and a, b, cاین دستور یک AND بیتی بین مقادیر رجیسترهای b و c انجام میدهد و نتیجه را در a ذخیره میکند.
تصمیمگیری: شاخهزنی در سطح سختافزار چگونه کار میکند
یک برنامه بهندرت بهصورت یک خط مستقیم و بدون شرط اجرا میشود. حلقهها، دستورات if، و فراخوانی توابع همگی نیاز دارند پردازنده بهصورت شرطی به نقطه دیگری در توالی دستورات بپرد، قابلیتی که توسط دستورات Conditional Branch فراهم میشود.
دو دستور شاخهزنی بنیادین در RISC-V، مستقیماً دو مقدار رجیستر را مقایسه میکنند:
beq a, b, Label
bne a, b, Labelbeq (شاخهزنی اگر برابر) فقط زمانی به برچسب مشخصشده میپرد که دو مقدار رجیستر برابر باشند، در حالی که bne (شاخهزنی اگر نابرابر) فقط زمانی میپرد که آنها متفاوت باشند. اگر شرط نادرست باشد، اجرا بهسادگی با دستور بعدی در توالی ادامه مییابد.
ساخت حلقهها و دستورات if از شاخهها
ساختارهای سطح بالا مانند if، while، و for در سطح سختافزار وجود ندارند. یک کامپایلر آنها را به توالی از مقایسهها و شاخههای شرطی ترجمه میکند.
مثال: یک دستور if سطح بالای ساده و ترجمه مفهومی آن:
سطح بالا:
if (i == j) f = g + h;
مفهوم ترجمهشده:
bne i, j, Exit
add f, g, h
Exit:در اینجا، اگر i و j برابر نباشند، اجرا مستقیماً از روی جمع عبور کرده و به برچسب Exit میپرد و آن را نادیده میگیرد. اگر برابر باشند، شاخه گرفته نمیشود و جمع بهطور معمول اجرا میشود.
پرشهای بدونشرط
همه تغییرات در جریان اجرا به یک شرط وابسته نیستند. یک دستور Unconditional Jump همیشه کنترل را به مکان مشخصشده منتقل میکند، صرفنظر از هرگونه مقایسه، و برای پیادهسازی ساختارهایی مانند پریدن انتهای بدنه یک حلقه به ابتدای آن استفاده میشود.
چرا این مجموعه کوچک از دستورات کافی است
هر ساختار کنترلی پیچیدهای که در زبانهای برنامهنویسی سطح بالا یافت میشود — حلقههای تودرتو، دستورات switch، بازگشتهای زودهنگام — میتواند با ترکیب همین چند عنصر پایه ساخته شود: مقایسه، شاخهزنی شرطی، و پرش بدونشرط. این نمایش مستقیمی از فلسفه "حالت رایج را ساده کن و بگذار نرمافزار پیچیدگی را روی آن بسازد" است که پشت طراحی مجموعه دستورات قرار دارد.