فلگ نیم‌حامل

**فلگ نیم‌حامل** (که با نام **فلگ کمکی** (*Auxiliary Flag*) نیز شناخته می‌شود) یکی از بیت‌های پرچم وضعیت در ثبات وضعیت بسیاری از خانواده‌های پردازنده است؛ از جمله پردازنده‌های **Intel 8080**، **Zilog Z80**، معماری **[[x86]]** و سری **Atmel AVR**. این فلگ نشان می‌دهد که پس از اجرای یک دستور حسابی، آیا انتقال (carry) یا قرض‌گیری (borrow) از چهار بیت کم‌ارزش ثبات انباره (Accumulator) به وجود آمده است یا خیر. کاربرد اصلی فلگ نیم‌حامل در دستورهای حسابی ده‌دهی، به‌ویژه محاسبات مبتنی بر **BCD** است.

## کاربرد

معمولاً پردازنده‌های که از حساب دودویی استفاده می‌کند (که تقریباً شامل همهٔ CPUهای مدرن می‌شود)، دو مقدار ۸ بیتی را مطابق قواعد سادهٔ جمع دودویی با هم جمع می‌کند.
برای مثال، جمع 25 و 48 برابر با 6D خواهد بود.

اما در مورد مقادیر ده‌دهی کدشدهٔ دودویی (BCD)، که در آن هر نیم‌بایت ۴ بیتی نمایانگر یک رقم ده‌دهی است، عملیات جمع پیچیده‌تر می‌شود. برای نمونه، اگر مقدار ده‌دهی ۲۵ و ۴۸ که به صورت BCD و به شکل 25 و 48 کد شده‌اند با هم جمع شوند، حاصل جمع دودویی آن‌ها همچنان 6D خواهد بود.

از آن‌جا که نیم‌بایت کم‌ارزش این نتیجه شامل یک رقم غیر ده‌دهی (D) است، لازم است با افزودن 06 آن را اصلاح کرد تا نتیجهٔ صحیح BCD یعنی 73 به دست آید که نمایانگر مقدار ده‌دهی ۷۳ است.

   0010 0101   25
 + 0100 1000   48
 -----------
   0110 1101   6D   (نتیجهٔ میانی)
 +      0110   06   (تصحیح)
 -----------
   0111 0011   73   (نتیجهٔ اصلاح‌شده)

به‌طور مشابه، جمع مقادیر BCD برابر با 39 و 48 نتیجهٔ 81 را تولید می‌کند. اگرچه نیم‌بایت پایینی این مقدار شامل رقم غیر ده‌دهی نیست، اما در این حالت انتقالی از کم‌ارزش‌ترین رقم (چهار بیت پایینی) به پرارزش‌ترین رقم (چهار بیت بالایی) رخ می‌دهد. این وضعیت با فعال شدن فلگ نیم‌حامل توسط CPU مشخص می‌شود.

این مقدار نیز باید با افزودن 06 اصلاح شود تا نتیجهٔ صحیح BCD برابر با 87 حاصل گردد.

   0011 1001   39
 + 0100 1000   48
 -----------
   1000 0001   81   (نتیجهٔ میانی)
 +      0110   06   (تصحیح)
 -----------
   1000 0111   87   (نتیجهٔ اصلاح‌شده)

در نهایت، اگر نتیجهٔ جمع شامل رقم غیر ده‌دهی در نیم‌بایت بالایی باشد، باید مقدار 60 به آن افزوده شود تا نتیجهٔ صحیح BCD به دست آید. برای مثال، جمع 72 و 73 برابر با E5 می‌شود. از آن‌جا که رقم پرارزش این حاصل (E) غیر ده‌دهی است، با افزودن 60 نتیجهٔ اصلاح‌شدهٔ BCD برابر با 145 خواهد بود. (توجه شود که رقم ابتدایی ۱ در واقع یک بیت حمل است.)

   0111 0010   72
 + 0111 0011   73
 -----------
   1110 0101   E5   (نتیجهٔ میانی)
 + 0110        60   (تصحیح)
 -----------
 1 0100 0101  145   (نتیجهٔ اصلاح‌شده)

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

## فلگ نیم‌حامل در معماری x86

فلگ نیم‌حامل (AF) یکی از پرچم‌های پردازنده است که در ثبات FLAGS تمام پردازنده‌های سازگار با معماری x86 و خانوادهٔ پیشین Intel 8080 قرار دارد. این فلگ گاهی توسط اینتل با نام فلگ تنظیم (Adjust Flag) نیز شناخته می‌شود.

بیت مربوط به این فلگ در جایگاه ۴ ثبات پرچم‌ها قرار دارد و زمانی فعال می‌شود که در جریان یک عملیات جمع یا تفریق، انتقال (carry) یا قرض‌گیری (borrow) از چهار بیت کم‌ارزش (نیم‌بایت پایین) رخ دهد. کاربرد اصلی فلگ نیم‌حامل، پشتیبانی از محاسبات ده‌دهی با کد دودویی (BCD) است.

در عملیات جمع، فلگ نیم‌حامل مقدار ۱ می‌گیرد اگر انتقالی از نیم‌بایت پایین (۴ بیت کم‌ارزش) به نیم‌بایت بالا (۴ بیت پرارزش) اتفاق بیفتد. در عملیات تفریق، این فلگ زمانی مقدار ۱ می‌گیرد که قرض‌گیری از نیم‌بایت بالا به نیم‌بایت پایین انجام شود. در غیر این صورت، فلگ صفر باقی می‌ماند.

## منابع

رده:محاسبه اعداد دودویی
رده:معماری اکس۸۶
رده:حساب رایانه‌ای