عملیات‌های منطقی و دستورات تصمیم‌گیری در RISC-V

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

عملیات‌های منطقیشاخه‌زنی شرطیدستورات بیتی

~3 min read · Updated Sep 6, 2026

عملیات‌های منطقی: دستکاری مستقیم بیت‌ها

هر عملیاتی که یک پردازنده انجام می‌دهد با اعداد به‌عنوان کمیت‌های کامل سروکار ندارد. گاهی نرم‌افزار نیاز دارد بیت‌های خاصی درون یک مقدار را دستکاری کند، که این کار با استفاده از 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, Label

beq (شاخه‌زنی اگر برابر) فقط زمانی به برچسب مشخص‌شده می‌پرد که دو مقدار رجیستر برابر باشند، در حالی که 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، بازگشت‌های زودهنگام — می‌تواند با ترکیب همین چند عنصر پایه ساخته شود: مقایسه، شاخه‌زنی شرطی، و پرش بدون‌شرط. این نمایش مستقیمی از فلسفه "حالت رایج را ساده کن و بگذار نرم‌افزار پیچیدگی را روی آن بسازد" است که پشت طراحی مجموعه دستورات قرار دارد.

Written & researched by Dr. Shahin Siami

Related Articles

تصورات غلط رایج درباره محاسبات موازی و درس‌های نهایی کتاب

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

Continue

واقعیت‌های عملی: بنچمارک CPU در مقابل GPU و ضرب ماتریس چندپردازنده‌ای

مقایسه منصفانه یک CPU و یک GPU نیازمند مدلی است که هم توان عملیاتی محاسباتی و هم محدودیت‌های پهنای باند حافظه را با هم در نظر بگیرد. این مقاله مدل roofline مورد استفاده برای مقایسه سخت‌افزار واقعی مانند Intel Core i7 و NVIDIA Tesla GPU را معرفی می‌کند، سپس نشان می‌دهد ضرب ماتریس چگونه در سراسر چند پردازنده تسریع می‌شود، به‌عنوان کاربرد عملی نهایی مفاهیم موازی این فصل.

Continue

بنچمارک کردن چندپردازنده‌ها و مدل‌سازی کارایی موازی

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

Continue

شبکه‌سازی کلاستر: ارتباط با دنیای بیرون

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

Continue

کلاسترها، کامپیوترهای در مقیاس انبار، و توپولوژی‌های شبکه

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

Continue

مقدمه‌ای بر GPU: موازی‌سازی عظیم برای بارهای کاری سنگین از نظر داده

یک GPU ایده SIMD که پیش‌تر در این مجموعه پوشش داده شد را به یک مقیاس افراطی می‌برد، و هزاران رشته سبک را به‌طور هم‌زمان اجرا می‌کند تا حجم عظیمی از داده مستقل را پردازش کند. این مقاله توضیح می‌دهد چرا GPU ها از نظر معماری این‌قدر با CPU متفاوت‌اند، مدل اجرای رشته آن‌ها چگونه کار می‌کند، و چه نوع بارهای کاری بیشترین بهره را از این طراحی می‌برند.

Continue