نوشتن تقويم ( اسمبلي )

hobab1987

Member
الان مي نويسم!
خيلي خوب توضيح داديد مرســــــــــــي!


============


اول مقدار اوليه dmap را 93 تايي تعريف كنم كه به ترتيب 1 يا 0 يا 2 يا 3 مي شود؟
 
آخرین ویرایش:

hobab1987

Member
سلام
آقاي king ;
چون روز جمعه را هم بايد يك رنگ خاص كنم يك مشكلي پيش اومده!
آخرين روز قمري با يكي از جمعه ها تداخل دارد چه كار كنم؟!
 

the_king

مدیرکل انجمن
سلام
آقاي king ;
چون روز جمعه را هم بايد يك رنگ خاص كنم يك مشكلي پيش اومده!
آخرين روز قمري با يكي از جمعه ها تداخل دارد چه كار كنم؟!

چند تا راه حل ساده وجود داره :

شیوه اول : برای روز های تعطیلی که آخرین روز ماه قمری هم هستند یک کد خاص در نظر بگیرید، مثلا 4
که اگر کد روزی 4 باشد، هم به عنوان روز تعطیل رنگی چاپ شود و هم روز بعدی قمری 1 باشد.
اگر بخواهید تشخیص دهید که روزی تعطیل است یا خیر، بایستی دو بار مقایسه کنید، یکبار با 1 و یکبار با 4
اگر بخواهید تشخیص دهید که آخرین روز قمری است یا خیر، بایستی دو بار مقایسه کنید، یکبار با 2 و یکبار با 4

شیوه دوم : بجای کد های تفکیک شده، واسه هر کدوم از وضعیت ها یک بیت جداگانه در نظر بگیرید :

بیت اول را برای روز های تعطیل در نظر بگیرید. پس کد روز را با 1 تست خواهید کرد (2 به توان 0)
کد:
TEST dmap[BX], 1
بعد با فلگ صفر مشخص می شود که آیا بیت اول صفر بوده یا یک.
اگر از پرش JE یا JZ استفاده کنید، زمانی پرش می کند که مقدار بیت اول صفر باشد (روز غیر تعطیل)
کد:
TEST dmap[BX], 1
JZ NoFreeDay
اگر از پرش JNE یا JNZ استفاده کنید، زمانی پرش می کند که مقدار بیت اول یک باشد (روز تعطیل)
کد:
TEST dmap[BX], 1
JNZ FreeDay

بیت دوم را برای آخرین روز قمری در نظر بگیرید. پس کد روز را با 2 تست خواهید کرد (2 به توان 1)
کد:
TEST dmap[BX], 2
بعد با فلگ صفر مشخص می شود که آیا بیت دوم صفر بوده یا یک.
اگر از پرش JE یا JZ استفاده کنید، زمانی پرش می کند که مقدار بیت دوم صفر باشد (آخرین روز قمری نباشد)
کد:
TEST dmap[BX], 2
JZ NoLastIslamicDay
اگر از پرش JNE یا JNZ استفاده کنید، زمانی پرش می کند که مقدار بیت دوم یک باشد (آخرین روز قمری باشد)
کد:
TEST dmap[BX], 2
JNZ LastIslamicDay

بیت سوم را برای آخرین روز میلادی در نظر بگیرید. پس کد روز را با 4 تست خواهید کرد (2 به توان 2)
کد:
TEST dmap[BX], 4
بعد با فلگ صفر مشخص می شود که آیا بیت سوم صفر بوده یا یک.
اگر از پرش JE یا JZ استفاده کنید، زمانی پرش می کند که مقدار بیت سوم صفر باشد (آخرین روز میلادی نباشد)
کد:
TEST dmap[BX], 4
JZ NoLastGregorianDay
اگر از پرش JNE یا JNZ استفاده کنید، زمانی پرش می کند که مقدار بیت سوم یک باشد (آخرین روز میلادی باشد)
کد:
TEST dmap[BX], 4
JNZ LastGregorianDay

محاسبه کد هر روز ساده است، مقدار اولیه کد 0 است.
اگر آن روز تعطیل بود با کد اش 1 را جمع بزنید.
اگر آن روز آخرین روز قمری بود، با کد اش 2 را جمع بزنید.
اگر آن روز آخرین روز میلادی بود، با کد اش 4 را جمع بزنید.

مثلا اگر یک روزی تعطیل و آخرین روز ماه قمری باشد، کد اش 1 + 2 است، یعنی 3
اگر یک روزی تعطیل و آخرین روز ماه میلادی باشد، کد اش 1 + 4 است، یعنی 5
اگر یک روزی تعطیل و آخرین روز ماه میلادی و آخرین روز ماه قمری باشد، کد اش 1 + 2 + 4 است، یعنی 7
 

the_king

مدیرکل انجمن
ببخشيد، رقم هگز رنگ قرمز و زرد چيه؟

جدول رنگ های نوشته و زمینه بصورت هگزادسیمال (مبنای 16) :

Colors.gif
 

hobab1987

Member
3 براي ماه ميلادي:
درسته دوستم؟!


کد:
MOV        day, 0    
loop_gday:
    MOV        AL, gday
    CALL print_al
    MOV        AH,    2
    MOV        DL, 32
    int        21h
    INC        gday
    INC        day
    MOV        BX, day
    CMP        dmap[BX], 3
    JE        label_gday    
    CMP        day,93
    JE        loop_quit
    JMP        loop_gday    
label_gday:
    MOV        gday, 1
    INC        gmonth    
label1:
    MOV        BH, 0Eh
label2:
    MOV        BH, 0Ch
    MOV        AH, 08h
    INT        21H
loop_quit:
    MOV        AX, 4c00h
    INT        21H
براي رنگ:

کد:
loop_pday:
    MOV        BX, day
    CMP        dmap[BX], 1
    JE        label1
    CMP        dmap[BX], 2
    JE        label2
    MOV        AL, pday
    CALL print_al
.
.
.
label1:
    MOV        BH, 0Eh
label2:
    MOV        BH, 0Ch
كل كدها (قبلي و اين يكي جديد) پيوست !
 

پیوست ها

  • q.zip
    614 بایت · بازدیدها: 1
آخرین ویرایش:

the_king

مدیرکل انجمن
در کدتان اگر dmap نشان داد که امروز پایان ماه میلادی است، مقدار gday را 1 کرده و gmount را هم
افزایش می دهید که صحیح است، اما خبر از پرش برای بازگشت به loop_gday نیست، یعنی
به محض آنکه روزهای یک ماه میلادی چاپ شدند، روتین را خاتمه می دهید و مجالی برای چاپ کردن
روز های دو ماه بعدی نمی دهید :
کد:
label_gday:
    MOV        gday, 1
    INC        gmonth

در حالی که اصولا بایستی مجددا به loop_gday پرش کنید :
کد:
label_gday:
    MOV        gday, 1
    INC        gmonth    
[B]JMP        loop_gday[/B]

کدی که برای انتخاب حالت های مختلف یک متغیر بکار می برید، شبیه ساختار switch و case در زبان ++C است،
اگر بعد از هر حالت یک دستور پرش (مشابه break در زبان ++C) اضافه نکنید، کد های بعدی هم اجرا خواهند شد.
مثلا در کد زیر اگر شرط باعث پرش به label1 شود، باعث اجرا شدن کد های بعد از label2 هم می شود :
کد:
label1:
    MOV        BH, 0Eh
label2:
    MOV        BH, 0Ch

مگر آنکه یک دستور پرش به آن اضافه کنید، مثلا :
کد:
label1:
    MOV        BH, 0Eh
JMP        label3
label2:
    MOV        BH, 0Ch
label3:
 

hobab1987

Member
اين كار را هم مي توان كرد كه به جاي دستور پرش، RET كنيم؟؟؟
وقتي روز شمسي چاپ شد بعد ميلادي يك Enter لازم هست، كدش را نمي دانم!
 

the_king

مدیرکل انجمن
اين كار را هم مي توان كرد كه به جاي دستور پرش، RET كنيم؟؟؟
زمانی می توانید از RET استفاده کنید که بجای پرش شرطی (مثل JE و JNE) از CALL استفاده شود،
اما CALL برای مورد شما مناسب نیست، چون شرط پذیر نیست و بدون هیچگونه شرطی پرش می کند.

وقتي روز شمسي چاپ شد بعد ميلادي يك Enter لازم هست، كدش را نمي دانم!
عملکرد Enter به ترتیب نمایش دو کاراکتر 13 و 10 است، 13 کد Carriage Return است که مکان نما (چشمکزن) را
به اول سطر می برد و 10 کد Line Feed است که مکان نما (چشمکزن) را یک سطر پایین می برد. ایندو کاراکتر مکمل
هم هستند.

کد:
MOV	AH, 2
MOV	DL, 13
INT	21h
MOV	DL, 10
INT	21h
 

hobab1987

Member
دوست خوبم،
براي رنگ روزهاي تعطيل، مي شود بعد از مقايسته jump نكرد ؟
آخه يه مسئله اي هست وقتي مقايسته ي روزها صورت مي گيره jump equal مي شود به رنگ مورد نظر دوباره چطوري از label رنگ jump كنم كه break بشه!
کد:
loop_pday:
    MOV        BX, day
    [COLOR=RoyalBlue]CMP        dmap[BX], 1
    JE        label1
    CMP        dmap[BX], 2
    JE        label2[/COLOR]
    MOV        AL, pday
    CALL print_al
    MOV        AH, 2
    MOV        DL, 32
    int        21h
    INC        pday        
    INC        day
    CMP        pday, 32
    JNE    loop_pday
    CMP        day, 93
    JE    loop_quit
    INC        pmonth
    MOV        pday, 1
    JMP    loop_pday
[COLOR=RoyalBlue]label1:
    MOV        BH, 0Eh
label2:
    MOV        BH, 0Ch    [/COLOR]
 

the_king

مدیرکل انجمن
دوست خوبم،
براي رنگ روزهاي تعطيل، مي شود بعد از مقايسته jump نكرد ؟
آخه يه مسئله اي هست وقتي مقايسته ي روزها صورت مي گيره jump equal مي شود به رنگ مورد نظر دوباره چطوري از label رنگ jump كنم كه break بشه!

یک Label جدید درست سر کد مشترکی که بین تمامی حالات case مشترک است قرار بدهید، بعد از آنکه کد اختصاصی
هر حالت (case) اجرا شد، پرش به آن کد مشترک انجام می شود. مثلا در کد شما چاپ مقدار روز برای حالت
تعطیل و غیر تعطیل جدا از رنگ آن، اگر مشترک است، پس آن Label جدید را سر کد نمایش روز قرار دهید.

در کد هر Label ای که برای تعیین رنگ اجرا می کنید یک پرش JMP به آن Label خواهید داشت تا اجرای روال عادی
برنامه را از آن کد مشترک ادامه بدهد.
 

hobab1987

Member
به چاپ اعداد پرش كردم!
اما 1 اشكالي دارد!
کد:
stacksg segment stack 'stack'
stacksg ends
datasg segment 'data'
    day        DB 00H
    pmonth    DB 01H
    pday    DB 01H
    gmonth    DB 03H
    gday    DB 21H
    imonth    DB 03H
    iday    DB 23H
    dmap    DB 1, 1, 1, 1, 0, 0, 5, 0, 0, 0, 3, 1, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0
            DB 0, 0, 0, 2, 4, 0, 0, 0, 0, 3, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0
            DB 2, 0, 0, 4, 0, 0, 2, 2, 0, 3, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0     
datasg ends
codsg segment 'code'
assume ss:stacksg, ds:datasg, cs:codsg
[COLOR=Black]main proc [/COLOR]
    MOV        AX, datasg
    MOV        DS, AX    
[COLOR=YellowGreen] loop_pday:[/COLOR]
    MOV        AL, pday
   [COLOR=RoyalBlue] MOV        BX, day
    CMP        dmap[BX], 1
    JE        label1
    CMP        dmap[BX], 2
    JE        label2[/COLOR]
    CALL print_al
    MOV        AH, 2
    MOV        DL, 32
    int        21h
    INC        pday        
    INC        day
    CMP        pday, 32
   [COLOR=YellowGreen] JNE    loop_pday[/COLOR]
    CMP        day, 93
    JE    loop_quit
    INC        pmonth
    MOV        pday, 1
   [COLOR=YellowGreen] JMP    loop_pday[/COLOR]
[COLOR=RoyalBlue] label1:
    MOV        BH, 0Eh
    JMP        print_al
label2:
    MOV        BH, 0Ch    
    JMP        print_al[/COLOR]
    MOV        AH, 08h
    INT        21H
[COLOR=YellowGreen] loop_quit:[/COLOR]
    MOV        AX, 4c00h
    INT        21H     
[COLOR=RoyalBlue] print_al:[/COLOR]
    MOV        AH, 0
    MOV        DL, 10
    DIV        DL
    ADD        AX, 3030h
    PUSH    AX
    MOV        DL, AL
    MOV        AH, 2
    INT        21H
    POP        DX
    MOV        DL, DH
    INT        21H
    RET            
main endp
codsg ends
end main
 

the_king

مدیرکل انجمن
به چاپ اعداد پرش كردم!
اما 1 اشكالي دارد!
بله، اشکال داره :

1) همانطور که قبلا هم اشاره کردم، تنها زمانی می توانید از RET استفاده کنید که برای پرش از CALL
استفاده کنید، شما در کدتان با JMP به print_al که با RET تمام می شود پرش کرده اید، طبیعی است که
با اجرا شدن RET اجرای برنامه مختل می شود :

کد:
 label1:
    MOV        BH, 0Eh
[B]    JMP        print_al[/B]
label2:
    MOV        BH, 0Ch    
[B]    JMP        print_al[/B]

2) قرار بر این بود که یک label جدید برای پرش به سر کد چاپ مقدار روز ایجاد کنید که انجام ندادید :

کد:
 MOV        BX, day
    CMP        dmap[BX], 1
    JE        label1
    CMP        dmap[BX], 2
    JE        label2
[B]new_label:[/B]
    CALL print_al
    MOV        AH, 2
    MOV        DL, 32
    int        21h

پرش هم بایستی به آن label جدید صورت گیرد :

کد:
 label1:
    MOV        BH, 0Eh
[B]    JMP        new_label[/B]
label2:
    MOV        BH, 0Ch    
[B]    JMP        new_label[/B]

3) شما مطمئن هستید که صرفا تعیین کردن مقدار BH برای رنگی شدن نوشته ها تاثیر گذار است؟
کد:
 label1:
[B]    MOV        BH, 0Eh[/B]
    JMP        print_al
label2:
[B]    MOV        BH, 0Ch [/B]
چون برای سرویس 2 وقفه 21h که برای چاپ کاراکتر ها در print_al بکار برده ایم، مقدار BH تاثیری ندارد.

4) این دو سطر کد تحت هیچ شرایطی اجرا نخواهد شد، چون بعد از JMP قرار گرفته و هیچگونه ارجاعی به آن نشده :
کد:
    JMP        print_al
[B]    MOV        AH, 08h[/B]
[B]    INT        21H[/B]
 loop_quit:
 

hobab1987

Member
شما مطمئن هستید که صرفا تعیین کردن مقدار BH برای رنگی شدن نوشته ها تاثیر گذار است؟
کد:
 label1:
[B]    MOV        BH, 0Eh[/B]
    JMP        print_al
label2:
[B]    MOV        BH, 0Ch [/B]
چون برای سرویس 2 وقفه 21h که برای چاپ کاراکتر ها در print_al بکار برده ایم، مقدار BH تاثیری ندارد.
متوجه نشدم!:)
4) این دو سطر کد تحت هیچ شرایطی اجرا نخواهد شد، چون بعد از JMP قرار گرفته و هیچگونه ارجاعی به آن نشده :
کد:
    JMP        print_al
[B]    MOV        AH, 08h[/B]
[B]    INT        21H[/B]
 loop_quit:
خوب اين دو سطر را در Loop_Quit قرار دادم. OK؟
 

the_king

مدیرکل انجمن
بایستی تغییری در کد print_al بدهید، تا بر اساس آن مقدار BH ای که مشخص می کنید، رنگ نوشته
را مشخص کند. سرویس 2 وقفه 21h که تا به حال از آن استفاده کرده ایم به تنهایی کافی نیست
چون قابلیتی برای مشخص کردن رنگ نوشته ندارد.
سرویس 9 وقفه 10h برای اینکار مناسب است، چون مقدار BL را برای رنگ متن بکار می برد. در ضمن
نمایش یک کاراکتر فاصله را بعد از دو رقم عدد به کد آن اضافه می کنیم.

نام تابع جدید print_al_color_bh است که بایستی جایگزین print_al قبلی شود :
کد:
print_al_color_bh:
    PUSH    AX
    MOV     AX, 0920h
    MOV     BL, BH
    MOV     BH, 0
    MOV     CX, 2
    INT     10h
    POP     AX
    MOV     BH, BL
    MOV     AH, 0
    MOV     DL, 10
    DIV     DL
    ADD     AX, 3030h
    PUSH    AX
    MOV     AH, 2
    MOV     DL, AL
    INT     21H
    POP     AX
    MOV     DL, AH
    MOV     AH, 2
    INT     21H
    MOV     DL, 32
    INT     21H
    RET

مقدار BH برای مشخص کردن رنگ نوشته است و بایستی حتما پیش از فراخوانی آن تنظیم گردد. مقدار رنگ معمولی
(نوشته خاکستری روی زمینه سیاه) برابر 07 است.
 

hobab1987

Member
ببخشيد آقاي king ! مي شود بيشتر كد ها رو توضيح بدهيد؟! با عرض معذرت!
 

the_king

مدیرکل انجمن
پیش از آنکه با سرویس 2 وقفه 21h کاراکتر هایمان را نمایش دهیم، با استفاده از سرویس 9 وقفه 10h رنگ آن
موقعیت از صفحه نمایش را مشخص و رنگ آمیزی می کنیم.

ابتدا مقدار موجود در AL را در پشته قرار می دهیم، چون قبل از استفاده از آن برای رنگ آمیزی به دستکاری
مقادیر AH و AL نیاز داریم :
کد:
    PUSH    AX

در AH مقدار سرویس 09h و در AL کاراکتری که بایستی نمایش داده شود (20h) را قرار می دهیم. کاراکتر 20h
همان کاراکتر فاصله است :
کد:
    MOV     AX, 0920h

سرویس 9 وقفه 10h از BL برای تعیین کردن رنگ کاراکتر استفاده می کند، پس مقدار رنگی که در BH مشخص
کرده اید را به BL انتقال می دهیم :
کد:
    MOV     BL, BH

مقدار BH برای تعیین کردن شماره صفحه ای است که نمایش در آن انجام می شود. صفحه پیشفرضی که
در DOS مشاهده می شود صفحه 0 است :
کد:
    MOV     BH, 0

CX مشخص می کند که آن کاراکتر (فاصله) چند بار نمایش داده شود. چون روز ها را دو کاراکتری نمایش می دهیم،
تعداد را روی 2 تنظیم می کنیم :
کد:
    MOV     CX, 2

و وقفه 10h را برای رنگ آمیزی آن دو کاراکتر اجرا می کنیم :
کد:
    INT     10h

حالا می توانیم مجددا مقدار AX را از پشته بخوانیم :
کد:
    POP     AX

و آن رنگ مورد استفاده که به BL انتقال داده بودیم را به جای قبلی خود بر می گردانیم :
کد:
    MOV     BH, BL

بقیه کد همانی است که قبلا در print_al بود. یکی از خاصیت های اصلی سرویس 9 وقفه 10h آن است که
موقعیت مکان نما را تغییر نمی دهد، یعنی با وجود آنکه دو کاراکتر فاصله را نمایش می دهد، همچنان مکان نما
روی اولین کاراکتر فاصله خواهند ماند.
 

hobab1987

Member
آقاي KING
خط 22 يك error ميده! نمي دونم بخاطر چيه!
=========================
براي ادامه برنامه بايد مناسبت هاي روز تعطيل هم مشخص كنيم
براي اين كار pday را بايد با day مقايسته كنم تك تك و هر مناسبت را چاپ كنيم؟
=========================
براي روز ميلادي هم به همين روالي هست كه فرموديد با اين تفاوت كه وقتي شرط آرايه (پايان ماه) برقرار شد مقدار را 1 كنيم و ادامه دهيم...

کد:
stacksg segment stack 'stack'
stacksg ends
datasg segment 'data'
    day        DB 00H
    pmonth    DB 01H
    pday    DB 01H
    gmonth    DB 03H
    gday    DB 21H
    imonth    DB 03H
    iday    DB 23H
    dmap    DB 1, 1, 1, 1, 0, 0, 5, 0, 0, 0, 3, 1, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0
            DB 0, 0, 0, 2, 4, 0, 0, 0, 0, 3, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0
            DB 2, 0, 0, 4, 0, 0, 2, 2, 0, 3, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0     
datasg ends
codsg segment 'code'
assume ss:stacksg, ds:datasg, cs:codsg
main proc 
    MOV        AX, datasg
    MOV        DS, AX        
loop_pday:
    MOV        AL, pday
    MOV        BX, day
    CMP        dmap[BX], 1
    JE        label1
    CMP        dmap[BX], 2
    JE        label2
color_label:
    CALL print_al_color_bh
    MOV        AH, 2
    MOV        DL, 32
    int        21h
    INC        pday        
    INC        day
    CMP        pday, 32
    JNE    loop_pday
    CMP        day, 93
    JE    loop_quit
    INC        pmonth
    MOV        pday, 1
    JMP    loop_pday
label1:
    MOV        BH, 0Eh
    JMP        color_label
label2:
    MOV        BH, 0Ch    
    JMP        color_label
loop_quit:
    MOV        AH, 08h
    INT        21H
    MOV        AX, 4c00h
    INT        21H     
print_al_color_bh:
    PUSH    AX
    MOV     AX, 0920h
    MOV     BL, BH
    MOV     BH, 0
    MOV     CX, 2
    INT     10h
    POP     AX
    MOV     BH, BL
    MOV     AH, 0
    MOV     DL, 10
    DIV     DL
    ADD     AX, 3030h
    PUSH    AX
    MOV     AH, 2
    MOV     DL, AL
    INT     21H
    POP     AX
    MOV     DL, AH
    MOV     AH, 2
    INT     21H
    MOV     DL, 32
    INT     21H
    RET
main endp
codsg ends
end main
 

the_king

مدیرکل انجمن
چون day را تک بایتی در نظر گرفته اید، نمی تواند بصورت مستقیم در BX قرار بگیرد :
کد:
    MOV        BX, day

بهتر است که day را از تک بایتی (DB) به دو بایتی (DW) تغییر دهید، البته می توانید بجای اینکار
انتقال را به BL انجام داده و BH را صفر کنید :
کد:
    MOV        BL, day
    MOV        BH, 0

اما مشکل دیگری هم وجود دارد، اگر مقدار dmap برای یک روز 0 باشد، بایستی با رنگ طبیعی 07 (یعنی BH = 07)
چاپ شود، در حالی که شما کدی برای تنظیم BH روی 07 ننوشته اید، به همین دلیل با همان مقدار قبلی که
توسط day به داخل BX منتقل می کردید چاپ می شود که متاسفانه سیاه (00) است، یعنی اصلا دیده نمی شود.

بهتر است کدی را هم برای مقایسه dmap با صفر و تنظیم BH روی 07 اضافه کنید :
کد:
[B]    CMP        dmap[BX], 0
    JE        label3
[/B]    CMP        dmap[BX], 1
    JE        label1
    CMP        dmap[BX], 2
    JE        label2
.
.
.
label1:
    MOV        BH, 0Eh
    JMP        color_label
label2:
    MOV        BH, 0Ch
    JMP        color_label
[B]label3[/B]:
[B]    MOV        BH, 07h
    JMP        color_label
[/B]
 

the_king

مدیرکل انجمن
براي ادامه برنامه بايد مناسبت هاي روز تعطيل هم مشخص كنيم
براي اين كار pday را بايد با day مقايسته كنم تك تك و هر مناسبت را چاپ كنيم؟
اینکار را هم می توان انجام داد، اما به نظرتان ترتیب نمایشی روز ها با اضافه کردن متن مناسبت بهم نمی خورد؟
اصولا مناسبت ها را پایین تقویم و بطور جداگانه می نویسند، نه میان اعداد روز های تقویم.
 

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

بالا