یک عدد فرضی موجود در ثبات Ax را به صورت یک رشته عددی در خروجی چاپ نمایید

ehsantv

New Member
سلام دوستان عزیزم میشه بهم کمک کنید ؟؟
برنامه ای بنویسید که یک عدد فرضی موجود در ثبات Ax را به صورت یک رشته عددی در خروجی چاپ نمایید ؟؟

ببخشید میشه به جوابی دادی یکم واضح تر بنویسید تا متوجه بشم ؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام دوستان عزیزم میشه بهم کمک کنید ؟؟
برنامه ای بنویسید که یک عدد فرضی موجود در ثبات Ax را به صورت یک رشته عددی در خروجی چاپ نمایید ؟؟

کد:
    MOV     CX, 0
    MOV     BX, 10
loop_1:
    MOV     DX, 0
    DIV     BX
    PUSH    DX
    INC     CX
    CMP     AX, 0
    JNE     loop_1
    MOV     AH, 2
loop_2:
    POP     DX
    ADD     DL, "0"
    INT     21H
    LOOP    loop_2

رجوع شود به :
چاپ مقادیر عددی توسط ماکرو در زبان اسمبلی
 

ehsantv

New Member
ببخشید میشه به جوابی دادی یکم واضح تر بنویسید تا متوجه بشم ؟
 

the_king

مدیرکل انجمن
ببخشید میشه به جوابی دادی یکم واضح تر بنویسید تا متوجه بشم ؟
برای جدا کردن ارقام یک عدد، بصورت متوالی اون عدد رو بر 10 تقسیم می کنیم. در هر بار تقسیم کردن، باقیمانده تقسیم، رقم سمت راستی
خواهد بود و حاصل تقسیم، عدد بعد از جدا کردن رقم سمت راستی. اینکار را آنقدر ادامه می دهیم تا به صفر برسیم، یعنی دیگر رقمی نمانده باشد.
فرضا عدد 427 را در نظر بگیرید :
مرحله اول، عدد 427 را بر 10 تقسیم می کنیم، حاصل تقسیم 42 است و باقیمانده تقسیم 7 است. پس در مرحله اول 7 جدا شد.
مرحله دوم، عدد 42 را بر 10 تقسیم می کنیم، حاصل تقسیم 4 است و باقیمانده تقسیم 2 است. پس در مرحله دوم 2 جدا شد.
مرحله سوم، عدد 4 را بر 10 تقسیم می کنیم، حاصل تقسیم 0 است و باقیمانده تقسیم 4 است. پس در مرحله سوم 4 جدا شد.
مرحله چهارمی وجود ندارد چون حاصل تقسیم در مرحله قبلی صفر شده.

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

رجیستر CX تعداد رقم های عدد را خواهد شمرد، ابتدای کار آنرا 0 قرار می دهیم :
کد:
    MOV     CX, 0
رجیستر BX را برای تقسیم کردن عدد بر 10 بکار خواهیم برد، پس مقدار 10 را داخلش ثبت می کنیم :
کد:
    MOV     BX, 10
این ابتدای حلقه است که برایش برچسب loop_1 را قرار داده ایم، رقم ها در این حلقه جدا می شوند :
کد:
loop_1:
در پردازنده های خانواده 8086 ، موقع تقسیم بر اعداد 16 بیتی مثل BX ،این DX:AX است تقسیم خواهد شد، نه فقط AX.
DX:AX ترکیبی از AX و DX است که یک حافظه 32 بیتی را تشکیل می دهد.
AX عدد ما است، اما DX هم همراه اش در تقسیم موثر خواهد بود، اگر DX جزو عدد نیست باید حتما قبل از تقسیم 0 اش کنید :
کد:
    MOV     DX, 0

عدد را بر 10 که همان مقدار BX است تقسیم می کنیم :
کد:
    DIV     BX

DX باقیمانده تقسیم خواهد بود که رقم سمت راستی عدد است. فعلا آنرا در پشته قرار می دهیم تا بعدا با ترتیب معکوس دریافت کنیم :
کد:
    PUSH    DX
به ازای هر رقمی که جدا می کنیم و در پشته قرار می دهیم، یک واحد به CX اضافه می کنیم تا تعداد ارقام را حافظه اش نگه دارد :
کد:
    INC     CX
AX حاصل تقسیم است، یعنی رقم های عدد بجز رقم سمت راستی. که اگر برابر 0 باشد دیگر رقمی برای جدا کردن نمانده است :
کد:
    CMP     AX, 0
اگر هنوز صفر نشده بود، حلقه جدا کردن ارقام را ادامه می دهیم :
کد:
    JNE     loop_1
حالا وقت خارج کردن ارقام از پشته و نمایش شان است. اول AH را روی 2 تنظیم می کنیم، چون
سرویس 2 از وقفه 21H برای نمایش یک کاراکتر است :
کد:
    MOV     AH, 2
اکنون تعداد ارقامی که در پشته قرار دارد و آماده نمایش است در CX مشخص شده.
حلقه نمایش رقم ها از این موقعیت شروع می شود، با برچسب loop_2 مشخص اش می کنیم :
کد:
loop_2:
یک رقم از داخل پشته خارج می کنیم و در DX قرار می دهیم :
کد:
    POP     DX

رقم باید برای نمایش به کاراکتر متناظر اش تبدیل شود، فرضا عدد 2 باید به کاراکتر '2' تبدیل شود. برای این تبدیل کافی است
که کاراکتر '0' را به مقدار رقم اضافه کنیم، کاراکتر '0' یا "0" عملا معادل عدد 48 ده دهی (Decimal) یا همان 30H مبنای شانزده (Hexadecimal) است :
کد:
    ADD     DL, "0"
برای نمایش کاراکتری که در DL قرار دارد، سرویس 2 از وقفه 21H را فراخوانی می کنیم :
کد:
    INT     21H
حلقه نمایش ارقام را آنقدر تکرار می کنیم که CX به صفر برسد :
کد:
    LOOP    loop_2
 

جدیدترین ارسال ها

بالا