king-gideon
April 2nd, 2009, 07:57 PM
i need to write a program in assembly language that counts the number of a character in a string.
sumthin like this
input string:gdfdzfgfgf
input letter:z
string contains 1.
input string:gdfdzfgfgf
input letter:d
string contains 2.
i wrote sumthing likt this but it is only showing the position not the number of the character
CLEAR MACRO COLOR
MOV AX, 0600H
MOV BH, COLOR
XOR CX, CX
MOV DX, 184FH
INT 10H
ENDM
TEXTOUT MACRO TEXT
MOV AH, 09
LEA DX, TEXT
INT 21H
ENDM
TEXTIN MACRO BUF
MOV AH, 0AH
LEA DX, BUF
INT 21H
ENDM
StackS SEGMENT PARA STACK 'STACK'
DW 32 DUP(?)
StackS ENDS
MAX_TEXT EQU 80
DATA SEGMENT PARA PUBLIC 'DATA'
MESS1 DB 0AH,0DH,"input string: $"
MESS2 DB 0AH,0DH,"input letter: $"
MESSNOT DB 0AH,0DH,"letter not found.$"
MESSYES DB 0AH,0DH,"it contains $"
BUF1 DB MAX_TEXT
QNT1 DB 0
TEXT1 DB MAX_TEXT DUP(?)
DATA ENDS
CODE SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODE, DS:DATA, SS:StackS
START: MOV AX, DATA
MOV DS, AX
MOV ES, AX
CLEAR 30
TEXTOUT MESS1
TEXTIN BUF1
TEXTOUT MESS2
MOV AH,1
INT 21H
XOR CH, CH
MOV CL, QNT1
JCXZ NOTFOUND
LEA DI, TEXT1
XOR BX,BX
CLD
NEXT:
SCASB
JNE CONTINUE
PUSH CX
ADD BX,1
CONTINUE:
LOOP NEXT
CMP BX,0
JE NOTFOUND
TEXTOUT MESSYES
POP AX
;AX=QNT1-AX+1
XOR BH,BH
MOV BL,QNT1
SUB BX,AX
MOV AX,BX
ADD AX,1
XOR CX,CX
MOV BX,10D
_REPEAT:
XOR DX,DX
DIV BX
PUSH DX
INC CX
CMP AX,0
JNZ _REPEA
MOV AH,2
_PRINT:
POP DX
OR DL,30H
INT 21H
LOOP _PRINT
NOTFOUND:
TEXTOUT MESSNOT
EXIT: XOR AL, AL
MOV AH, 4CH
INT 21H
CODE ENDS
END START
sumthin like this
input string:gdfdzfgfgf
input letter:z
string contains 1.
input string:gdfdzfgfgf
input letter:d
string contains 2.
i wrote sumthing likt this but it is only showing the position not the number of the character
CLEAR MACRO COLOR
MOV AX, 0600H
MOV BH, COLOR
XOR CX, CX
MOV DX, 184FH
INT 10H
ENDM
TEXTOUT MACRO TEXT
MOV AH, 09
LEA DX, TEXT
INT 21H
ENDM
TEXTIN MACRO BUF
MOV AH, 0AH
LEA DX, BUF
INT 21H
ENDM
StackS SEGMENT PARA STACK 'STACK'
DW 32 DUP(?)
StackS ENDS
MAX_TEXT EQU 80
DATA SEGMENT PARA PUBLIC 'DATA'
MESS1 DB 0AH,0DH,"input string: $"
MESS2 DB 0AH,0DH,"input letter: $"
MESSNOT DB 0AH,0DH,"letter not found.$"
MESSYES DB 0AH,0DH,"it contains $"
BUF1 DB MAX_TEXT
QNT1 DB 0
TEXT1 DB MAX_TEXT DUP(?)
DATA ENDS
CODE SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODE, DS:DATA, SS:StackS
START: MOV AX, DATA
MOV DS, AX
MOV ES, AX
CLEAR 30
TEXTOUT MESS1
TEXTIN BUF1
TEXTOUT MESS2
MOV AH,1
INT 21H
XOR CH, CH
MOV CL, QNT1
JCXZ NOTFOUND
LEA DI, TEXT1
XOR BX,BX
CLD
NEXT:
SCASB
JNE CONTINUE
PUSH CX
ADD BX,1
CONTINUE:
LOOP NEXT
CMP BX,0
JE NOTFOUND
TEXTOUT MESSYES
POP AX
;AX=QNT1-AX+1
XOR BH,BH
MOV BL,QNT1
SUB BX,AX
MOV AX,BX
ADD AX,1
XOR CX,CX
MOV BX,10D
_REPEAT:
XOR DX,DX
DIV BX
PUSH DX
INC CX
CMP AX,0
JNZ _REPEA
MOV AH,2
_PRINT:
POP DX
OR DL,30H
INT 21H
LOOP _PRINT
NOTFOUND:
TEXTOUT MESSNOT
EXIT: XOR AL, AL
MOV AH, 4CH
INT 21H
CODE ENDS
END START