سلام
آقاي king ;
چون روز جمعه را هم بايد يك رنگ خاص كنم يك مشكلي پيش اومده!
آخرين روز قمري با يكي از جمعه ها تداخل دارد چه كار كنم؟!
TEST dmap[BX], 1
TEST dmap[BX], 1
JZ NoFreeDay
TEST dmap[BX], 1
JNZ FreeDay
TEST dmap[BX], 2
TEST dmap[BX], 2
JZ NoLastIslamicDay
TEST dmap[BX], 2
JNZ LastIslamicDay
TEST dmap[BX], 4
TEST dmap[BX], 4
JZ NoLastGregorianDay
TEST dmap[BX], 4
JNZ LastGregorianDay
ببخشيد، رقم هگز رنگ قرمز و زرد چيه؟
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
label_gday:
MOV gday, 1
INC gmonth
label_gday:
MOV gday, 1
INC gmonth
[B]JMP loop_gday[/B]
label1:
MOV BH, 0Eh
label2:
MOV BH, 0Ch
label1:
MOV BH, 0Eh
JMP label3
label2:
MOV BH, 0Ch
label3:
زمانی می توانید از RET استفاده کنید که بجای پرش شرطی (مثل JE و JNE) از CALL استفاده شود،اين كار را هم مي توان كرد كه به جاي دستور پرش، RET كنيم؟؟؟
عملکرد Enter به ترتیب نمایش دو کاراکتر 13 و 10 است، 13 کد Carriage Return است که مکان نما (چشمکزن) راوقتي روز شمسي چاپ شد بعد ميلادي يك Enter لازم هست، كدش را نمي دانم!
MOV AH, 2
MOV DL, 13
INT 21h
MOV DL, 10
INT 21h
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]
دوست خوبم،
براي رنگ روزهاي تعطيل، مي شود بعد از مقايسته jump نكرد ؟
آخه يه مسئله اي هست وقتي مقايسته ي روزها صورت مي گيره jump equal مي شود به رنگ مورد نظر دوباره چطوري از label رنگ jump كنم كه break بشه!
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
بله، اشکال داره :به چاپ اعداد پرش كردم!
اما 1 اشكالي دارد!
label1:
MOV BH, 0Eh
[B] JMP print_al[/B]
label2:
MOV BH, 0Ch
[B] JMP print_al[/B]
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
label1:
MOV BH, 0Eh
[B] JMP new_label[/B]
label2:
MOV BH, 0Ch
[B] JMP new_label[/B]
label1:
[B] MOV BH, 0Eh[/B]
JMP print_al
label2:
[B] MOV BH, 0Ch [/B]
JMP print_al
[B] MOV AH, 08h[/B]
[B] INT 21H[/B]
loop_quit:
متوجه نشدم!شما مطمئن هستید که صرفا تعیین کردن مقدار BH برای رنگی شدن نوشته ها تاثیر گذار است؟
چون برای سرویس 2 وقفه 21h که برای چاپ کاراکتر ها در print_al بکار برده ایم، مقدار BH تاثیری ندارد.کد:label1: [B] MOV BH, 0Eh[/B] JMP print_al label2: [B] MOV BH, 0Ch [/B]
خوب اين دو سطر را در Loop_Quit قرار دادم. OK؟4) این دو سطر کد تحت هیچ شرایطی اجرا نخواهد شد، چون بعد از JMP قرار گرفته و هیچگونه ارجاعی به آن نشده :
کد:JMP print_al [B] MOV AH, 08h[/B] [B] INT 21H[/B] loop_quit:
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
PUSH AX
MOV AX, 0920h
MOV BL, BH
MOV BH, 0
MOV CX, 2
INT 10h
POP AX
MOV BH, BL
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
MOV BX, day
MOV BL, day
MOV BH, 0
[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]
اینکار را هم می توان انجام داد، اما به نظرتان ترتیب نمایشی روز ها با اضافه کردن متن مناسبت بهم نمی خورد؟براي ادامه برنامه بايد مناسبت هاي روز تعطيل هم مشخص كنيم
براي اين كار pday را بايد با day مقايسته كنم تك تك و هر مناسبت را چاپ كنيم؟