سلام
من بايد تقويم بهار امسال رو بنويسم به هر سه تاريخ مجزاي(شمسي قمري ميلادي) و روزهاي تعطيل رنگي.
اسمبلي هم ساختار if و for رو بهمون ياد دادن.
نمي دونم چه طوري شروع به نوشتن كنم و چه چيزي لازمه!!
لطفا راهنماييم كنيد!

[SIZE=2]stacksg segment stack 'stack'[/SIZE]
[SIZE=2]stacksg ends[/SIZE]
[SIZE=2]datasg segment 'data'[/SIZE]
[SIZE=2]a DB 'saturday','$'[/SIZE]
[SIZE=2]b DB 'Sunday','$'[/SIZE]
[SIZE=2]c DB 'Monday','$'[/SIZE]
[SIZE=2]d DB 'Tuesday','$'[/SIZE]
[SIZE=2]e DB 'Wednesday','$'[/SIZE]
[SIZE=2]f DB 'Thursday','$'[/SIZE]
[SIZE=2]g DB 'Friday','$'[/SIZE]
[SIZE=2]datasg ends[/SIZE]
[SIZE=2]codsg segment 'code'[/SIZE]
[SIZE=2]assume: ss:stacksg, ds:datasg, cs:codsg[/SIZE]
[SIZE=2]main proc near [/SIZE]
[SIZE=2]mov AX, datasg[/SIZE]
[SIZE=2]mov DX, ax[/SIZE]
[SIZE=2]mov AH, 06h[/SIZE]
[SIZE=2]int 10h[/SIZE]
[SIZE=2]mov AH, 02h[/SIZE]
[SIZE=2]mov DX, 0035h[/SIZE]
[SIZE=2]mov BH, 07h[/SIZE]
[SIZE=2]mov AH, 09h[/SIZE]
[SIZE=2]LEA DX, a[/SIZE]
[SIZE=2]int 10h[/SIZE]
[SIZE=2]mov AH,8[/SIZE]
[SIZE=2]int 21h[/SIZE]
[SIZE=2]mov AX,4c00h[/SIZE]
[SIZE=2]int 21h[/SIZE]
[SIZE=2]main endp[/SIZE]
[SIZE=2]codsg ends[/SIZE]
[SIZE=2]end main[/SIZE]
از كجا بفهمم كه كدوم خط برنامم اررور داره تو cmd؟
C:\>ml c.asm
Microsoft (R) Macro Assembler Version 6.15.8803
Copyright (C) Microsoft Corp 1981-2000. All rights reserved.
Assembling: c.asm
c.asm([B]6[/B]) : error A2008: syntax error : c
c.asm([B]13[/B]) : error A2008: syntax error : :
C:\>
[B]c[/B] DB 'Monday','$'
assume[B]:[/B] ss:stacksg, ds:datasg, cs:codsg
mov AX, datasg
mov [B]DX[/B], ax
mov AH, 06h
int 10h
mov AH, 02h
mov DX, 0035h
mov BH, 07h
mov AH, 09h
LEA DX, a
int [B]10h
[/B]
stacksg segment stack 'stack'
stacksg ends
datasg segment 'data'
sat DB 'saturday','$'
sun DB 'Sunday','$'
mon DB 'Monday','$'
tue DB 'Tuesday','$'
wed DB 'Wednesday','$'
thu DB 'Thursday','$'
fri DB 'Friday','$'
datasg ends
codsg segment 'code'
assume ss:stacksg, ds:datasg, cs:codsg
main proc near
mov AX, datasg
mov DS, ax
mov AH, 09h
LEA DX, sat
int 21h
mov AH,8
int 21h
mov AX,4c00h
int 21h
main endp
codsg ends
end main
.MODEL SMALL
.STACK
.DATA
sat DB 'saturday','$'
sun DB 'Sunday','$'
mon DB 'Monday','$'
tue DB 'Tuesday','$'
wed DB 'Wednesday','$'
thu DB 'Thursday','$'
fri DB 'Friday','$'
.CODE
.STARTUP
mov AH, 09h
LEA DX, sat
int 21h
mov AH,8
int 21h
.EXIT
END
مجبورم با همين 3 تا فايل كار كنم (tasm.exe,tlink.exe,rtm) آخه كامپيوتري كه بايد برنامه ام را ارائه بدهم كامپايلر ندارد!!
با اين 3 تا فايل نميشود اشكال برنامه رو پيدا كرد!
راستي متغير ها و حلقه (تاريخ شمسي) را طبق توضيحي كه فرموديد نوشتم فقط آرايه اي كه گفتيد را بلد نيستم ،آرايه رو درس ندادند!
dmap DB 0, 0, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0
MOV SI, 0
MOV AL, dmap[SI]
MOV AL, dmap[0]
[SIZE=2]datasg segment 'data'[/SIZE]
[SIZE=2]day DB 00h[/SIZE]
[SIZE=2]pmonth DB 01h[/SIZE]
[SIZE=2]pday DB 01h[/SIZE]
[SIZE=2]datasg ends[/SIZE]
[SIZE=2]MOV AH, 09h[/SIZE]
[SIZE=2]LEA DX, pmonth[/SIZE]
[SIZE=2]INT 21h[/SIZE]
[SIZE=2]INC day[/SIZE]
[SIZE=2]MOV AH, 09[/SIZE]
[SIZE=2]LEA DX, pday[/SIZE]
[SIZE=2]INT 21h[/SIZE]
[SIZE=2]CMP day,31[/SIZE]
[SIZE=2]stacksg segment stack 'stack'[/SIZE]
[SIZE=2]stacksg ends[/SIZE]
[SIZE=2]datasg segment 'data'[/SIZE]
[SIZE=2]day DB 00h[/SIZE]
[SIZE=2]pmonth DB 01h[/SIZE]
[SIZE=2]pday DB 01h[/SIZE]
[SIZE=2]datasg ends[/SIZE]
[SIZE=2]codsg segment 'code'[/SIZE]
[SIZE=2]assume ss:stacksg, ds:datasg, cs:codsg[/SIZE]
[SIZE=2]main proc near [/SIZE]
[SIZE=2]MOV AX, datasg[/SIZE]
[SIZE=2]MOV Ds, ax[/SIZE]
[SIZE=2]loop1:[/SIZE]
[SIZE=2]MOV AH, 09h[/SIZE]
[SIZE=2]LEA DX, pmonth[/SIZE]
[SIZE=2]INT 21h [/SIZE]
[SIZE=2]loop2:[/SIZE]
[SIZE=2]INC day[/SIZE]
[SIZE=2]MOV AH, 09[/SIZE]
[SIZE=2]LEA DX, pday[/SIZE]
[SIZE=2]INT 21h[/SIZE]
[SIZE=2]CMP day,31[/SIZE]
[SIZE=2]JNE loop2[/SIZE]
[SIZE=2]INC pmonth[/SIZE]
[SIZE=2]MOV pday, 01[/SIZE]
[SIZE=2]CMP day,92[/SIZE]
[SIZE=2]JNE loop2[/SIZE]
[SIZE=2]MOV AH,8[/SIZE]
[SIZE=2]INT 21h[/SIZE]
[SIZE=2]MOV AX,4c00h[/SIZE]
[SIZE=2]INT 21h[/SIZE]
[SIZE=2]main endp[/SIZE]
[SIZE=2]codsg ends[/SIZE]
[SIZE=2]end main[/SIZE]
MOV AH, 09h
LEA DX, pmonth
INT 21h
MOV AL, pmonth
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
MOV AL, pmonth
CALL [B]print_al[/B]
.
.
.
.
[B]print_al:[/B]
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
MOV AL, pday
CALL [B]print_al[/B]
CMP [B]day[/B],31
JNE loop2
CMP day,[B]92[/B]
CMP day,92
JNE [B]loop2[/B]
تبديل عدد به رشته را ميشود توضيح دهيد؟!شما بایستی عدد موجود در pmount را به یک رشته تبدیل کرده و سپس آنرا چاپ کنید. کد زیر برای چاپ یک
عدد دو رقمی مناسب است :
کد:MOV AL, pmonth 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
pmonth رو قبلا در ALگذاشتيد حالا دوباره در AL يك متغيير ديگر گذاشتيد اين مقدار ها اشتباه نميشود؟کد:MOV AL, pday CALL print_al
[SIZE=2]main proc far [/SIZE]
[SIZE=2]MOV AX, datasg[/SIZE]
[SIZE=2]MOV DS, AX[/SIZE]
[SIZE=2]MOV AL, pday[/SIZE]
[SIZE=2]loop_pday:[/SIZE]
[SIZE=2]CALL print-pday[/SIZE]
[SIZE=2]INC AL[/SIZE]
[SIZE=2]INC day[/SIZE]
[SIZE=2]CMP AL, 32[/SIZE]
[SIZE=2]JNE loop_pday[/SIZE]
[SIZE=2]DEC day[/SIZE]
[SIZE=2]INC pmonth[/SIZE]
[SIZE=2]CMP day, 93[/SIZE]
[SIZE=2]JE loop_quit[/SIZE]
[SIZE=2]MOV AL, 01h[/SIZE]
[SIZE=2]JMP loop_pday[/SIZE]
[SIZE=2]MOV AH, 08h[/SIZE]
[SIZE=2]INT 21H[/SIZE]
[SIZE=2]loop_quit:[/SIZE]
[SIZE=2]MOV AX, 4c00h[/SIZE]
[SIZE=2]INT 21H [/SIZE]
[SIZE=2]main endp[/SIZE]
[SIZE=2]print_pday proc near[/SIZE]
[SIZE=2].[/SIZE]
[SIZE=2].[/SIZE]
[SIZE=2].[/SIZE]
از توضيح خوبتون سپاسگذارم!!!
چند تا سوال پيش اومد!
== === == ==
تبديل عدد به رشته را ميشود توضيح دهيد؟!
1 + "0" = "1"
2 + "0" = "2"
pmonth رو قبلا در ALگذاشتيد حالا دوباره در AL يك متغيير ديگر گذاشتيد اين مقدار ها اشتباه نميشود؟
كلا نفهميدم چرا اين اينجوري نوشته شده!!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
كلا نفهميدم چرا اين اينجوري نوشته شده!!
مخصوصا جمع 3030
mov ah, 0
mov dl, 10
div dl
add ax, 3030h
add al, 30h
add ah, 30h
push ax
mov dl, al
mov ah, 2
int 21h
pop dx
mov dl, dh
int 21h
مواردي كه در پست قبل گفتيد انجام دادم اما error دارد !!!

stacksg segment stack 'stack'
stacksg ends
datasg segment 'data'
day DB 00H
pmonth DB 01H
pday DB 01H
msg1 DB 'Farvardin: ','$'
msg2 DB 'Ordibehesht: ','$'
msg3 DB 'Khordad: ','$'
datasg ends
codsg segment 'code'
assume ss:stacksg, ds:datasg, cs:codsg
main proc far
MOV AX, datasg
MOV DS, AX
MOV AL, pday
loop_pday:
CALL print_al
INC AL
INC day
CMP AL, 32
JNE loop_pday
DEC day
INC pmonth
CMP day, 93
JE loop_quit
MOV AL, 01h
JMP loop_pday
MOV AH, 08h
INT 21H
loop_quit:
MOV AX, 4c00h
INT 21H
print_al:
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
main proc [B]far[/B]
MOV AL, pday
loop_pday:
INC AL
CMP AL, 32
DEC day
MOV AL, 01h
stacksg segment stack 'stack'
stacksg ends
datasg segment 'data'
day DB 00H
pmonth DB 01H
pday DB 01H
msg1 DB 'Farvardin: ','$'
msg2 DB 'Ordibehesht: ','$'
msg3 DB 'Khordad: ','$'
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
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
MOV AH, 08h
INT 21H
loop_quit:
MOV AX, 4c00h
INT 21H
print_al:
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

به خودتان بستگی دارد، چه بخواهید روزهای تعطیل را رنگی کنید، و چه بخواهید تقویم قمری یا میلادی راحالا كد رنگ رو بنويسيم يا تقويم قمري و ميلادي را؟!
كد ها زياد شده از كجا شروع كنيم؟!
مقدار day را در BX یا SI یا DI کپی می کنید و سپس مقدار [dmap[BX یا [dmap[SI را با 1 مقایسه کنید، که اگرمن نمي دونم چه طوري از اين dmap استفاده كنم!
چه دستوري بايد بدهم؟
يعني وقتي روز تعطيل pday ام شد بگم 1 بشه و رنگ اش بكند؟!
متوجه نشدم!!
MOV BX, day
CMP dmap[BX], 1
JE labelname
کد قمری و میلادی اندکی متفاوت است، در آن بخشی که مقدار روز شان را با آخرین روز ماه مقایسه می کنید،براي ماه قمري و ميلادي همان كد را در ادامه كپي كردم البته با تغيير متغيير ها و مقدارشان اما اجرا نشد! كار اشتباهي كردم؟!
خوب اين مقايسته اي كه صورت مي گيرد :کد:mov bx, day cmp dmap[bx], 1 je labelname
مثلا بيان مي كند كه :فلان روز 1 هست يا خير ، گفتيد 1 نماينده ي روز هاي تعطيل است خوب چه طوري 1 ميتونه نماينده روز تعطيل باشد يا 2 يا 3 نماينده روز خاص ديگر!!!









