کمک در کامل کردن برنامه

nilo_nazanin

New Member
سلام به دوستان عزیز خوبید
منو دوستم 4 تا برنامه نوشتیم ک البته یه ایراداتی داره ، میخواسیم شما کمکمون کنین ، نه که بخوام شما بنویسین نه ، ما نوشتیم فقط شما ایراداتشو درست کنین ، ممنون میشم هر کس کمکمون کنه درستشونو بزاره
از همتون ممنونیم .


مثلا این سول 1: برنامه ای که محتویات یک فایل را خوانده و تعداد حروف بزرگ را شمارش و در انتهای فایل ذخیره کند.
اگه جملاتمون تو فایل کوتاه باشه بصورت رندم جواب درست میده اما اکثرا غلط میده :
[PASCAL]data segment
f db 'd:\filetest2.txt'
fh1 dw ?
n db ' '
str db ' $'
i db ?

ends
stack segment
dw 128 dup(0)
ends
code segment
start:
;
set segment registers:
mov ax, data
mov ds, ax
mov es, ax

mov n,'0'
mov ah,3dh
mov al,2
lea dx,f
int 21h
mov fh1,ax


mov i,0
l1:


mov ah,42h
mov al,00
mov bx,fh1
mov cx,00h
mov dx,i
int 21h
;------
mov ah,3fh
mov bx,fh1
mov cx,1
lea dx,str
int 21h
;---------------------
cmp str,65
jae l2
jmp ex
l2:
cmp str,90
jbe l3
jmp ex
l3:
inc n
aaa
jmp ex

ex:
inc i
cmp i,10
jbe l1


;-------

mov ah,42h
mov al,2
mov bx,fh1
mov cx,00h
mov dx,00
int 21h
;------
mov ah,40h
mov bx,fh1
mov cx,1
lea dx,n
int 21h
;--------
mov ah,3eh
mov bx,fh1
int 21h

mov ax, 4c00h ; exit to operating system.
int 21h
ends
end start ; set entry point and stop the assembler.
[/
PASCAL]
=========================================================================
یا این سوال 2: برنامه ای که محتوای دو فایل با حداکثر 100 کاراکتر را خوانده و کلماتی که بیش از 5 حرف دارند در یک فایل جدید ذخیره نماید :
ما اینو نوشتیم ک بازم اگه جملات زیاد باشه میمونه توش تو فایلم ذخیره نمیکنه
[PASCAL]data segment
f1 db 'd:\filetest3.txt'
fh1 dw ?

str1 db ' $'
str2 db ' $'
i dw ?
j dw ?
n dw -1

ends
stack segment
dw 128 dup(0)
ends
code segment
start:
;
set segment registers:
mov ax, data
mov ds, ax
mov es, ax
mov ah,3dh
mov al,00
lea dx,f1
int 21h
mov fh1,ax

mov i,0
l1:
mov ah,42h
mov al,00
mov bx,fh1
mov cx,00h
mov dx,i
int 21h

mov ah,3fh
mov bx,fh1
mov cx,1
lea dx,str1
int 21h

inc n


l3:cmp str1,' '
je l4
jmp continue

l4:cmp n,5
jae l5
jmp l6

l6:mov n,-1
jmp continue

l5:
mov di,i
sub di,n
mov j,di
add di,n
label:
mov ah,42h
mov al,00
mov bx,fh1
mov cx,00h
mov dx,j
int 21h

mov ah,3fh
mov bx,fh1
mov cx,1
lea dx,str2
int 21h

mov dl,str2
mov ah,02h
int 21h
inc j
cmp j,di
jbe label
mov n,-1
jmp continue
continue:

inc i
cmp i,25
jbe l1
mov ax, 4c00h ; exit to operating system.
int 21h
ends
end start ; set entry point and stop the assembler.
[/PASCAL]
---------------------------------------------------------------------------
یا این یکی سوال 3 : برنامه ک دنبال یه کلمه بگرده تو یک فایل و تعداد تکرار اون کلمه رو در پایان همون فایل درج کنه ، مثلا ما کلمه GREEN رو گزاتیم ، بازم مشکل بالایی ها رو داره :
[PASCAL]data segment

f db 'd:\filetest4.txt'
fh1 dw ?
str db 5 dup (' ')
n db ' '

i dw ?

ends
stack segment
dw 128 dup(0)
ends
code segment
start:
;
set segment registers:
mov ax, data
mov ds, ax
mov es, ax
mov n,'0'
mov ah,3dh
mov al,2
lea dx,f
int 21h
mov fh1,ax

mov i,0
l1:

mov ah,42h
mov al,00
mov bx,fh1
mov cx,00h
mov dx,i
int 21h
;------
mov ah,3fh
mov bx,fh1
mov cx,5
lea dx,str
int 21h


;---------------------
cmp str[0],'G'
je l2
jmp continue
l2:
cmp str[1],'R'
je l3
jmp continue
l3:
cmp str[2],'E'
je l4
jmp continue
l4:
cmp str[3],'E'
je l5
jmp continue
l5:
cmp str[4],'N'
je l6
jmp continue
l6:
inc n
aaa
jmp continue

continue:
inc i
cmp i,29
jbe l1
jmp exit

exit:
mov ah,42h
mov al,2
mov bx,fh1
mov cx,00h
mov dx,00
int 21h
;------
mov ah,40h
mov bx,fh1
mov cx,1
lea dx,n
int 21h
;--------
mov ah,3eh
mov bx,fh1
int 21h
mov ax, 4c00h ; exit to operating system.
int 21h
ends
end start ; set entry point and stop the assembler.
[/
PASCAL]
==========================================================================
و این هم آخرین سوال 4: برنامه ای که کلماتی را که دو کاراکتر پشت سرهم در یک فایل دارد جدا نموده و در یک فایل جدید ذخیره کند. مثلا aali , poloo , abcdd ک اینم باز وقتی جملاتمون تو فایل زیاد میشه میمونیم :
[PASCAL]
data segment
f1 db 'd:\filetest5.txt'
fh1 dw ?

str1 db 2 dup ' $'
str2 db ' $'
i dw ?
j dw ?
n dw -1
temp db 0
kom dw ?
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
;
set segment registers:
mov ax, data
mov ds, ax
mov es, ax
mov ah,3dh
mov al,02
lea dx,f1
int 21h
mov fh1,ax

mov i,0
l1:
mov ah,42h
mov al,00
mov bx,fh1
mov cx,00h
mov dx,i
int 21h

mov ah,3fh
mov bx,fh1
mov cx,2
lea dx,str1
int 21h

inc n

mov di,0
lea si,str1[di]
lea di,str1[di+1]
cmpsb
je l2
jmp l3

l2: mov temp,1
jmp l3


l3:cmp str1[0],32
je l4
jmp continue

l4:cmp temp,1
je l5
jmp l6

l6:mov n,-1
jmp continue

l5:
mov di,i
sub di,n
mov j,di
add di,n
label:
mov ah,42h
mov al,00
mov bx,fh1
mov cx,00h
mov dx,j
int 21h

mov ah,3fh
mov bx,fh1
mov cx,2
lea dx,str2
int 21h

mov dl,str2
mov ah,02h
int 21h
inc j
cmp j,di
jbe label
mov n,-1
mov temp,0
jmp continue
continue:

inc i
cmp i,25
jbe l1


mov ax, 4c00h ; exit to operating system.
int 21h
ends
end start ; set entry point and stop the assembler.[/PASCAL]
از emu8086 استفاده میکنیم .
 

the_king

مدیرکل انجمن
کد هاتون رو یکجا مطرح نکنید، در مباحث جداگانه بنویسید.

توصیه می کنم که این شیوه قدیمی و منسوخ را کنار بگذارید :
کد:
data segment
[COLOR="Gray"].
.
.[/COLOR]
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
; set segment registers:
movax, data
mov ds, ax
mov es, ax
[COLOR="Gray"].
.
.[/COLOR]
mov ax, 4c00h ; exit tooperating system.
int 21h 
ends
end start ; set entry point and stop the assembler.

بجایش از ساختار ساده تر و مدرن اسمبلر استفاده کنید که معادل همان شیوه قدیمی است :
کد:
.MODEL SMALL
.DATA
[COLOR="Gray"].
.
.
[/COLOR].CODE
.STARTUP
[COLOR="Gray"].
.
.
[/COLOR].EXIT
.STACK
END

مثلا این سول 1: برنامه ای که محتویات یک فایل را خوانده و تعداد حروف بزرگ را شمارش و در انتهای فایل ذخیره کند.
اگه جملاتمون تو فایل کوتاه باشه بصورت رندم جواب درست میده اما اکثرا غلط میده
دلیلش اینه که برای تبدیل عدد n به رشته عددی هیچ عملیات خاصی انجام ندادید، صرفا n را یک کاراکتر 0 الی 9
در نظر گرفتید که باید ذخیره شود، حالا اگر مقدار n از 9 بزرگتر باشد، مثلا 12 ، کدی که نوشتید نمی تواند دو کاراکتر
1 و 2 را تفکیک کند. شما باید عدد n را بر 10 تقسیم کنید تا به دو بخش دهگان و یکان تفکیک شود و سپس
دو بخش تفکیک شده را بصورت کاراکتر در فایل درج کنید.

در ضمن توصیه می کنم برای نام فایل و پسوند آن مطابق با فرمت فایل های DOS بیشتر از 8 و 3 کاراکتر در نظر نگیرید.
filetest3 به تنهایی 9 کاراکتر طول دارد که با فرمت فایل های DOS منطبق نیست.
کد:
.MODEL SMALL
.DATA
f 	DB 'D:\testfile.txt'
fh1	DW ?
n	DB 0
w	DW ?
buffer 	DB 1000 DUP (?)
.CODE
.CODE
.STARTUP
	MOV	AH, 3Dh
	MOV	AL, 2
	LEA	DX, f
	INT	21h
	MOV	fh1, AX
	MOV	AH, 3Fh
	MOV	BX, fh1
	MOV	CX, 1000
	LEA	DX, buffer
	INT	21h
	LEA	BX, buffer
loop_1:
	MOV	AL, [BX]
	CMP	AL, "A"
	JB	next_1
	CMP	AL, "Z"
	JA	next_1
	INC	n
next_1:
	INC	BX
	LOOP	loop_1
	MOV	AL, n
	MOV	AH, 0
	MOV	DL, 10
	DIV	DL
	ADD	AX, "00"	
	MOV	w, AX
	MOV	AH, 40h
	MOV	BX, fh1
	MOV	CX, 2
	LEA	DX, w
	INT	21h
	MOV	AH, 3Eh
	MOV	BX, fh1
	INT 	21h
.EXIT
.STACK
END
 

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

بالا