PDA

View Full Version : مبتدی: کمک در ادامه ی برنامه تعداد تکرار The



Ring Eshgh
دوشنبه 20 دی 1389, 21:56 عصر
سلام


من می خوام تعداد تکرار The در یک رشته مشخص کنم من اینجوری نوشتم اما Error داره ممنون می شم کمکم کنید .



.model small
.stack
DB 64 dup (?)
.data
T DB 0
STRING DB ?
MSG1 DB 0DH,0AH,"Enter Text : ",'$'
MSG2 DB 0DH,0AH,"Tedad Repet : ",'$'
.code
main proc
mov ax,@data
mov ds,ax

LEA DX , MSG1
MOV AH , 09H
INT 21H

LEA SI , STRING
MOV AH , 0AH

READ :
INT 21H
MOV AL , BL

CMP AL , 'the'
ADD T , 1
JE DISPLY

CMP AL , 0DH
JE DISPLY

XOR AL , 20H
MOV [SI] , AL
INC SI

DISPLY :
LEA DX , MSG2
MOV AH , 09H
INT 21H


mov ax , 4ch
int 21h
main endp
end main

اگرم بگین یک اریه ی دو بعدی رو پیمایش کنم و مقایسمو انجام بدم یا دستی مقدار بدم مثلا برای ترانه هاده ممنون میشم .

xman_1365_x
سه شنبه 21 دی 1389, 15:10 عصر
به بقيه برنامت كاري ندارم اما اين مقايسه اشتباه است

CMP AL , 'the'

شما يك رشته رو مي خواي با يك كاراكتر مقايسه كني كه اشتباه
مي توني از دستورالعمل رشته اي scas هم استفاده كني!
وقتي شما آرايه اي از رشته داري هر حرف در يك خانه از حافظه هست پس شما بايد سه بايت از حافظه پشت سر هم رو چك كني
اگر x='t' آنگاه اگر x+1='h' آنگاه x+2='e' در غير اينصورت يكي به x اضافه كن و البته براي پايان هم بايد مثلا دالر ريخته باشي يگي اگر x='$' پايان جستجو هست.
و در شرط اخر يك شمارنده بزاري كه بگي اگر مساوي بود يكي بهش اضافه كنه!
در نهايت شمارنده خروجي شماست!

Ring Eshgh
سه شنبه 21 دی 1389, 17:57 عصر
من اگه این کارو بکنم بغییه برنامم مشکل نداره خوب

xman_1365_x
چهارشنبه 22 دی 1389, 17:07 عصر
وقتي ميگم حتما برنامت ايراد داره ديگه :لبخندساده:
اولا جاي ليبل READ : اشتباه هست كلا ادامشم اشتباه هست.
شما با وقفه مياي يك رشته ميگيري ، رشته ذخيره شده در استرينگ هست
برنامت به همين حالت اجرا شه و اون سه كاراكتر رو يك t بزاري هم اشتباه هست ساختارش چون ax در آخر كد اسكي اينتر هست بعد برنامت مياد به t اضافه ميكنه در صورتي كه فقط و فقط اگر T در رشته بود و دو كاراكتر بعدي هم به ترتيب بودن بايد اين كارو انجام ميداد

Ring Eshgh
پنج شنبه 23 دی 1389, 20:55 عصر
سلام
این همون روشی که گفتین نوشتم اما یک جاش مشکل دارم من می خوام عددم جلوی Msg2 چاپ بشه اما عددای دیگه ای میده اما با MOV AH , 02H درست جواب میده !!!
ممنون میشم بگین چه کارش کنم درست بشه ؟:افسرده:

.model small
.data
String label byte
Max DB 255
Len DB ?
Text DB 255
Msg1 DB 0DH,0AH,"Enter String : ",'$'
Msg2 DB 0DH,0AH,"Result Number Reapet : ",'$'
.code
main proc far
mov ax,@data
mov ds,ax

LEA DX , Msg1
MOV AH , 09H
INT 21H

LEA DX , String
MOV AH , 0Ah
int 21H

MOV CL , Len
MOV CH , 0

MOV SI , 0
MOV DL , 0

For:
CMP Text[SI] , "t"
JNE L1

CMP Text[SI+1] , "h"
JNE L1

CMP Text[SI+2] , "e"
JNE L1

INC DL ; use DL as a counter
L1:
INC SI
LOOP For

;LEA DX , Msg2
;MOV AH , 09H
;INT 21H

ADD DL , 30H
MOV AH , 02H
INT 21H

mov ax,4c00h
int 21h
main endp
end main

xman_1365_x
پنج شنبه 23 دی 1389, 23:09 عصر
سورس رو اصلاح كردم


.model small
.data
String label byte
Max DB 255
Len DB ?
Text DB 255
Msg1 DB 0DH,0AH,"Enter String : ",'$'
Msg2 DB 0DH,0AH,"Result Number Reapet : ",'$'
.code
main proc far
mov ax,@data
mov ds,ax
LEA DX , Msg1
MOV AH , 09H
INT 21H
LEA DX , String
MOV AH , 0Ah
int 21H
MOV CL , Len
MOV CH , 0
MOV SI , 0
MOV DL , 0
For:
CMP Text[SI] , "t"
JNE L1
CMP Text[SI+1] , "h"
JNE L1
CMP Text[SI+2] , "e"
JNE L1
INC DL ; use DL as a counter
L1:
INC SI
LOOP For
mov bx,dx
LEA DX , Msg2
MOV AH , 09H
INT 21H
mov dx,bx
ADD DL , 30H
MOV AH , 02H
INT 21H
mov ax,4c00h
int 21h
main endp
end main