PDA

View Full Version : کمک در کامل کردن برنامه



nilo_nazanin
شنبه 31 اردیبهشت 1390, 15:41 عصر
سلام دوستان خوبید ، من میخواستم برنامه ای بنویسم که یک رشته صد کاراکتری دریافت کنه
تعداد ارقام و حروف و سمبل ها رو چاپ کنه ، اون تاپیکو قثل کردید، الان من برنامه ای نوشتم که رشته ده کاراکتری رو میگیره ارقام رو میشماره ، من الان تو شمارش حروف مشکل دارم میشه الان دیگه کمکم کنین.
با تشکر نیلوفر




Dseg segment
ch1 db '1a345jk898'
ends
Sseg segment
db 60 dup(?)
ends
cseg segment
begin proc far
assume ss:sseg,ds:dseg,cs:cseg
push ax
push ds
mov ax,dseg
mov ds,ax
mov bl,48 ;Ascii Code 0
mov ch,57 ;Ascii Code 9
mov bx,0
mov dl,0
;if bx>9 Then GOTO L2
L3:cmp bx,9
ja L2
mov al,ch1[bx]
inc bx
;if Ascii Code al >= 48 Then GOTO A
cmp al,bl
jae A
;else GOTO L3
jmp L3
;if Ascii Code al<=49 Then GOTO B
A:cmp al,ch
jbe B
;Else GOTO L3
jmp L3
;Count Numebr
B:inc dl
jmp L3
 
L2:
add dl,48 ;For Print Number
mov ah,2
int 21h
begin endp
ends
end begin

nilo_nazanin
شنبه 31 اردیبهشت 1390, 18:25 عصر
چقدر راهنمایی

tdkhakpur
شنبه 31 اردیبهشت 1390, 18:51 عصر
تقریبا برنامه تان کامله فقط داخل اسمبلی باید از ایجاد توابع هم استفاده کنید اونوقت راحتتر میتونید برنامه رو بنویسید.
در ضمن وقتی روی داده ای کار میکنید شرط خاتمه رو هم مد نظر بگیرید ایجا علامت $ در نظر گرفته شده است داخل کد شما هر چقدر گشتم شرطی رو ندیدم که حلقه با توجه به اون بدونه که به اخر رشته مورد نظر رسیده یا نه. البته اینجا برنامه میتونه بطور اتفاقی جواب بده اما در کل باید این نکته رو هم در نظر بگیرید.


datas segment
ch1 db '1a345jk898', '$'
Num_c db 0
Chr_c db 0
datas ends
stacks segment
dw 128 dup(0)
stacks ends
codes segment
start:
assume ss:stacks, ds:datas, cs:codes
; set segment registers:
mov ax, datas
mov ds, ax
mov es, ax
;-----------------------------------------
mov bx, 0
L1: ;-----------------------;
mov al, ch1[bx]; al mus be;data for compair with IsIn proc
mov dl, '0' ;
mov dh, '9' ;
call isIn ;
cmp ah, 1 ;
jne jmp1 ;
add Num_c, 1 ;
jmp1: ;
;
mov dl, 'a' ;
mov dh, 'z' ;
call isIn ;
cmp ah, 1 ;
jne jmp2 ;
add Chr_c, 1 ;
jmp2: ;
;
mov dl, 'A' ;
mov dh, 'Z' ;
call isIn ;
cmp ah, 1 ;
jne jmp3 ;
add Chr_c, 1 ;
jmp3: ;
inc bx ;
mov al, ch1[bx]; ;
cmp al, '$' ;
jne L1 ;--------;
mov dl, Num_c
add dl, 48
call PrintNum
mov dl, ' '
call PrintNum
mov dl, chr_c
add dl, 48
call PrintNum
;-----------------------------------------
mov ax, 4c00h ; exit to operating system.
int 21h
;---------------------------------------------
; data is al
; cmp data is in dl, dh such az --> al='9' -->(dl='a' & dh='z')
; if ah = 0 then it is in else not.
IsIn proc
mov ah, 0
cmp al, dl
jl exit_
cmp al, dh
jg exit_
mov ah, 1
exit_:
ret
IsIn endp
;---------------------------------------------
; dl is data for print
PrintNum proc
mov ah,2
int 21h
ret
PrintNum endp
;---------------------------------------------
codes ends
end start ; set entry point and stop the assembler.

armin0282
شنبه 31 اردیبهشت 1390, 19:10 عصر
چقدر راهنمایی
صبر واقعا چیز خوبیه.

من برنامه رو واسه شما کامل کردم. خودتون هم چک کنید که درست کار میکنه یا نه!
و برای سمبل ها هم $ رو درون رشته قرار ندید چون اسمبلی اگه $ رو درون رشته ببینه تا همونجایی که $ هست رشته رو میخونه واسه همین من فقط آخر رشته $ رو گذاشتم که آخر رشته معلوم بشه!
,></?@#+-و... همه اینها رو به عنوان سمبل در نظر میگره
توضیحاتی رو هم که تو کد گذاشم رو اگه بخونید و یکم وقت صرف کنید کاملا با روند کار برنامه آشنا می شید.

تست کنید ببینید همونیه که منظورتون بوده؟
اگه هم سوالی داشتید هم اینجا بپرسید

Dseg segment
ch1 db 'hello! my name is armin!this program count number,symbol,space,charecter in text EX:123,%^&*,ABC, 9','$'
space db 0
symbol db 0
m db 'Your Text : $'
msg1 db 0Ah,0Dh,0Ah,0Dh,'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~',0 Ah,0DH,'Total Of Number = $'
msg2 db 0Ah,0Dh,'Total Of Character = $'
msg3 db 0Ah,0Dh,'Total Of Space = $'
msg4 db 0Ah,0Dh,'Total Of Symbol = $'
ends

Sseg segment
db 60 dup(?)
ends

cseg segment
begin proc far
assume ss:sseg,ds:dseg,cs:cseg
push ax
push ds
mov ax,dseg
mov ds,ax

mov bx,0
mov dl,0
mov dh,0
lea si,space
lea di,symbol
;if bx>9 Then GOTO L2
mov al,ch1[0]
L3:cmp al,'$'
je L2

mov al,ch1[bx]
inc bx

;if Ascii Code al >= 48 Then GOTO A
AA:cmp al,48
jae A
jb S1 ;if AL<48 Then GOTO S1 For Symbol Check
;else GOTO L3
jmp L3
;if Ascii Code al<=57 Then GOTO B
A:cmp al,57
jbe B
;if Ascii Code al>57 Then GOTO CC
ja CC
;Else GOTO L3
jmp L3
;if Ascii code al>=65(A) Then GOTO DD
CC:cmp al,65
jae DD
jb SA3 ;if AL<65 Then GOTO SA3 For Symbol Check
;Else GOTO L3
jmp L3
;if Ascii code al<=90(Z) Then GOTO E
DD:cmp al,90
jbe E

;if Ascii code al>90(Z) Then GOTO C
ja C
;Else GOTO L3
jmp L3
;if Ascii code al>=97(a) Then GOTO D
C:cmp al,97
jae D
jb SA5 ;if AL<97 Then GOTO S1 For Symbol Check
;Else GOTO L3
jmp L3
;if Ascii code al<=122(z) Then GOTO E
D:cmp al,122
jbe E
ja SA ;if AL>122 Then GOTO SA (= Symbol)
;Else GOTO L3
jmp L3
;if Ascii Code al==32(Space) Then GOTO S
S1:cmp al,32
je S
jb SA ;if AL<32 Then GOTO SA (= Symbol)
ja SA2 ;if AL<97 Then GOTO S1 For Symbol Check
jmp L3
;For Check Symbol
SA2:cmp al,47
jbe SA
jmp L3
SA3:cmp al,58
jae SA4
jmp L3
SA4:cmp al,64
jbe SA
jmp L3
SA5:cmp al,91
jae SA
jmp L3
;Count Character
E:inc dh
jmp L3
;Count Space
S:inc [si]
jmp L3
;Count Symbol
SA:inc [di]
jmp L3
;Count Numebr
B:inc dl
jmp L3

L2:
mov ch,dl
mov bl,dh
;*****************************
lea dx,m
mov ah,09
int 21h
;*****************************

lea dx,ch1
mov ah,09
int 21h
;*****************************
lea dx,msg1
mov ah,09
int 21h
;For Print Total Number
xor ax,ax
mov al,ch
mov cl,10
div cl
add ax,3030h
mov cx,ax
mov dl,cl
mov ah,2
int 21h
mov dl,ch
mov ah,2
int 21h
;*****************************
lea dx,msg2
mov ah,09
int 21h
;For Print Total Character
xor ax,ax
mov al,bl
mov cl,10
div cl
add ax,3030h
mov cx,ax
mov dl,cl
mov ah,2
int 21h
mov dl,ch
mov ah,2
int 21h
;*****************************
lea dx,msg3
mov ah,09
int 21h
;For Print Total Space
xor ax,ax
mov al,space
mov cl,10
div cl
add ax,3030h
mov cx,ax
mov dl,cl
mov ah,2
int 21h
mov dl,ch
mov ah,2
int 21h
;*****************************
lea dx,msg4
mov ah,09
int 21h
;For Print Total Symbol
xor ax,ax
sub [di],1
mov al,[di]
mov cl,10
div cl
add ax,3030h
mov cx,ax
mov dl,cl
mov ah,2
int 21h
mov dl,ch
mov ah,2
int 21h

begin endp
ends
end begin




موفق باشید.

nilo_nazanin
شنبه 31 اردیبهشت 1390, 20:54 عصر
وای آرمین عاشقتم

nilo_nazanin
سه شنبه 31 خرداد 1390, 03:21 صبح
سلام دوست جونای خودم خوبید ، من یه چندتا برنامه به کمک دوستم نوشتیم ، البته ایراداتی داره که راستش موندیم ، گفتم شاید اینجا بشه کمکم کنین اکثرا اشتباه محاسبه میکنه ببینین :
مثلا این سول 1: برنامه ای که محتویات یک فایل را خوانده و تعداد حروف بزرگ را شمارش و در انتهای فایل ذخیره کند.
اگه جملاتمون تو فایل کوتاه باشه بصورت رندم جواب درست میده اما اکثرا غلط میده :
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.

================================================== =======================
یا این سوال 2: برنامه ای که محتوای دو فایل با حداکثر 100 کاراکتر را خوانده و کلماتی که بیش از 5 حرف دارند در یک فایل جدید ذخیره نماید :
ما اینو نوشتیم ک بازم اگه جملات زیاد باشه میمونه توش تو فایلم ذخیره نمیکنه
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.

---------------------------------------------------------------------------
یا این یکی سوال 3 : برنامه ک دنبال یه کلمه بگرده تو یک فایل و تعداد تکرار اون کلمه رو در پایان همون فایل درج کنه ، مثلا ما کلمه GREEN رو گزاتیم ، بازم مشکل بالایی ها رو داره :
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.

================================================== ========================
و این هم آخرین سوال 4: برنامه ای که کلماتی را که دو کاراکتر پشت سرهم در یک فایل دارد جدا نموده و در یک فایل جدید ذخیره کند. مثلا aali , poloo , abcdd ک اینم باز وقتی جملاتمون تو فایل زیاد میشه میمونیم :

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.
=============================================
ممنون میشم راهنماییم کنین
از emu8086 استفاده مینیم

nilo_nazanin
سه شنبه 31 خرداد 1390, 09:42 صبح
سلام
کسی نمیتونه کمکی کنه بهم

من واقعا موندم مشکل اینا کجاست

nilo_nazanin
سه شنبه 31 خرداد 1390, 14:40 عصر
دوستان لازممونه میشه کمک کنین واسه شما اساتید کاری نداره

nilo_nazanin
سه شنبه 31 خرداد 1390, 19:51 عصر
:گریه:توروخدا کسی نیست مشکل ما رو حل کن؟ :اشتباه:

nilo_nazanin
سه شنبه 31 خرداد 1390, 21:35 عصر
بابا من چیکار کنم آفرین کمکم کنین

nilo_nazanin
چهارشنبه 01 تیر 1390, 12:04 عصر
چرا کسی نیست کمکمون کنه ؟
:گریه::گریه::گریه:

nilo_nazanin
چهارشنبه 01 تیر 1390, 13:22 عصر
کاشکی آرمین بود
:گریه:
یا آقای خاکپور

nilo_nazanin
پنج شنبه 02 تیر 1390, 00:50 صبح
بخدا من حاضرم پولم بدم اگه کسی هست

tdkhakpur
پنج شنبه 02 تیر 1390, 01:23 صبح
اگر منظورتان اینه که الان یکی بشینه و مسئله رو حل کنه فکر نکنم پیدا بشه اما دو سه روز صبر کنید شاید دونه دونه بشه کاریش کرد..

xman_1365_x
پنج شنبه 02 تیر 1390, 02:01 صبح
با سلام،فكر كنم سوال همه دوستانتون رو يك جا آوردين :لبخند: قبل از اينكه شروع به نوشتن كنيد اول سوال رو متوجه شيد و و براي حلش الگوريتم بنويسيد بعد اون الگوريتم رو با اسمبلي اجرايي كنيد.چون سوال اولي هم كه جوابتون رو دادن همينطور بوده البته اين ايراد هاي كوچيك رو با ديباگ كردن و چك كردن حافظه و ثبات ها ميتونيد متوجه شيد كه مشكلتون كجاست!


1: برنامه ای که محتویات یک فایل را خوانده و تعداد حروف بزرگ را شمارش و در انتهای فایل ذخیره کند.
اگه جملاتمون تو فایل کوتاه باشه بصورت رندم جواب درست میده اما اکثرا غلط میده :

خوب برنامه بالا كه از يك فايل ميخونيد و ميريزد توي بافر حالا بايد بافر رو چك كنيد كه كد اسكي اگر بين A تا Z بود يكي به كانترون اضافه كنه و در آخر به اسكي تبديلش كنيد و در فايل ذخيره كنيد همين


یا این سوال 2: برنامه ای که محتوای دو فایل با حداکثر 100 کاراکتر را خوانده و کلماتی که بیش از 5 حرف دارند در یک فایل جدید ذخیره نماید :
ما اینو نوشتیم ک بازم اگه جملات زیاد باشه میمونه توش تو فایلم ذخیره نمیکنه

اينم مشابه سوال بالاست كه ميشه از چند روش حلش كرد يكي دستورات پردازش رشته كه سريع تر هستند و با با شرط و حلقه
مطمئنا ميدونيد كه كلمه ها با اسپيس از هم جدا شدن و اسپيس يكي از شروط شما و ديگري همون انتها كه 100 كاراكتر هست اين بين اگر باشه ذخيرش ميكنيد


یا این یکی سوال 3 : برنامه ک دنبال یه کلمه بگرده تو یک فایل و تعداد تکرار اون کلمه رو در پایان همون فایل درج کنه ، مثلا ما کلمه GREEN رو گزاتیم ، بازم مشکل بالایی ها رو داره :

اينم مشابه بالايي هست دو بايت اول كلمتون رو با بافر چك ميكنيد اگر درست باشه بايت هاي بعدي كلمه (با دستورات پردازش رشته) و يا با 5 شرط كه هر كاراكتر رو چك كنه


و این هم آخرین سوال 4: برنامه ای که کلماتی را که دو کاراکتر پشت سرهم در یک فایل دارد جدا نموده و در یک فایل جدید ذخیره کند. مثلا aali , poloo , abcdd ک اینم باز وقتی جملاتمون تو فایل زیاد میشه میمونیم :

و اينم مشابه بالايي هاست كه براي تشخيص ار دتورات پردازش رشته استفاده كنيد و بعد در يك بافر يا پشته بريزيد و در نهايت در يك فايل ديگه ذخيرش كنيد
خيلي خستم و بيشتر از اين نمي تونم توضيح بدم متاسفانه وقت بررسي كد هاي شمارو هم ندارم فقط كمي بيشتر وقت بزارين روش كار كنيد
فعلا كمي روش فكر كنيد و سعي كنيد اگر نشد بهم بگين سعي مي كنم كمك كنم


بخدا من حاضرم پولم بدم اگه کسی هست

البته براي من كاري نداره از شما هزينه وقتي كه بزارمو بگيرم براتون بنويسم اما بهتره خودتون ياد بگيرين! اين سوال ها سخت نيستن كمي وقت گذاشتن مي خواد همين
موفق باشي