ببخشید میشه به جوابی دادی یکم واضح تر بنویسید تا متوجه بشم ؟
برای جدا کردن ارقام یک عدد، بصورت متوالی اون عدد رو بر 10 تقسیم می کنیم. در هر بار تقسیم کردن، باقیمانده تقسیم، رقم سمت راستی
خواهد بود و حاصل تقسیم، عدد بعد از جدا کردن رقم سمت راستی. اینکار را آنقدر ادامه می دهیم تا به صفر برسیم، یعنی دیگر رقمی نمانده باشد.
فرضا عدد 427 را در نظر بگیرید :
مرحله اول، عدد 427 را بر 10 تقسیم می کنیم، حاصل تقسیم 42 است و باقیمانده تقسیم 7 است. پس در مرحله اول 7 جدا شد.
مرحله دوم، عدد 42 را بر 10 تقسیم می کنیم، حاصل تقسیم 4 است و باقیمانده تقسیم 2 است. پس در مرحله دوم 2 جدا شد.
مرحله سوم، عدد 4 را بر 10 تقسیم می کنیم، حاصل تقسیم 0 است و باقیمانده تقسیم 4 است. پس در مرحله سوم 4 جدا شد.
مرحله چهارمی وجود ندارد چون حاصل تقسیم در مرحله قبلی صفر شده.
این روش رقم ها را جدا می کند، اما از سمت راست به چپ. برای نمایش عدد اصولا باید رقم ها از چپ به راست نمایش داده شوند، پس
ترتیب جدا کردن ارقام با ترتیب نمایش شان مطابقت ندارد. برای برعکس کردن ترتیب ارقام، از پشته کمک می گیریم، چون یکی از خواص پشته
این است که اگر مقادیری در آن قرار بگیرد، موقع خارج کردن شان با ترتیب برعکس خارج می شوند.
رجیستر CX تعداد رقم های عدد را خواهد شمرد، ابتدای کار آنرا 0 قرار می دهیم :
رجیستر BX را برای تقسیم کردن عدد بر 10 بکار خواهیم برد، پس مقدار 10 را داخلش ثبت می کنیم :
این ابتدای حلقه است که برایش برچسب loop_1 را قرار داده ایم، رقم ها در این حلقه جدا می شوند :
در پردازنده های خانواده 8086 ، موقع تقسیم بر اعداد 16 بیتی مثل BX ،این DX:AX است تقسیم خواهد شد، نه فقط AX.
DX:AX ترکیبی از AX و DX است که یک حافظه 32 بیتی را تشکیل می دهد.
AX عدد ما است، اما DX هم همراه اش در تقسیم موثر خواهد بود، اگر DX جزو عدد نیست باید حتما قبل از تقسیم 0 اش کنید :
عدد را بر 10 که همان مقدار BX است تقسیم می کنیم :
DX باقیمانده تقسیم خواهد بود که رقم سمت راستی عدد است. فعلا آنرا در پشته قرار می دهیم تا بعدا با ترتیب معکوس دریافت کنیم :
به ازای هر رقمی که جدا می کنیم و در پشته قرار می دهیم، یک واحد به CX اضافه می کنیم تا تعداد ارقام را حافظه اش نگه دارد :
AX حاصل تقسیم است، یعنی رقم های عدد بجز رقم سمت راستی. که اگر برابر 0 باشد دیگر رقمی برای جدا کردن نمانده است :
اگر هنوز صفر نشده بود، حلقه جدا کردن ارقام را ادامه می دهیم :
حالا وقت خارج کردن ارقام از پشته و نمایش شان است. اول AH را روی 2 تنظیم می کنیم، چون
سرویس 2 از وقفه 21H برای نمایش یک کاراکتر است :
اکنون تعداد ارقامی که در پشته قرار دارد و آماده نمایش است در CX مشخص شده.
حلقه نمایش رقم ها از این موقعیت شروع می شود، با برچسب loop_2 مشخص اش می کنیم :
یک رقم از داخل پشته خارج می کنیم و در DX قرار می دهیم :
رقم باید برای نمایش به کاراکتر متناظر اش تبدیل شود، فرضا عدد 2 باید به کاراکتر '2' تبدیل شود. برای این تبدیل کافی است
که کاراکتر '0' را به مقدار رقم اضافه کنیم، کاراکتر '0' یا "0" عملا معادل عدد 48 ده دهی (Decimal) یا همان 30H مبنای شانزده (Hexadecimal) است :
برای نمایش کاراکتری که در DL قرار دارد، سرویس 2 از وقفه 21H را فراخوانی می کنیم :
حلقه نمایش ارقام را آنقدر تکرار می کنیم که CX به صفر برسد :