汇编语言习题一道,求高手指点!

要求是输入一个字符串,然后返回该字符串内含有的A和空格的个数,我写得代码在下面,输出总是把输入的字符串重复两次,测试输入不同时输出形式也略有不同,请高手指点~~~

DATAS SEGMENT
BUF DB 50,50 DUP(?)

DATAS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MAIN PROC FAR
MOV AX,DATAS
MOV DS,AX
LEA DX,BUF
MOV AH,0AH
INT 21H
LEA SI,BUF+1
XOR CX,CX
CALL FIND1
LEA SI,BUF+1
XOR CX,CX
CALL FIND2

MOV AH,4CH
INT 21H
MAIN ENDP

FIND1 PROC NEAR
A1:
CMP BYTE PTR[SI],'$'
JE A3
CMP BYTE PTR[SI],'A'
JE A2
INC SI
JMP A1
A2:
INC CX
INC SI
JMP A1
A3:
MOV DX,CX
MOV AH,9
INT 21H
FIND1 ENDP

FIND2 PROC NEAR
B1:
CMP BYTE PTR[SI],'$'
JE B3
CMP BYTE PTR[SI],020H
JE B2
INC SI
JMP B1
B2:
INC CX
INC SI
JMP B1
B3:
MOV DX,CX
MOV AH,9
INT 21H
FIND2 ENDP

CODES ENDS
END START

你编写的汇编有太多错误啊,等着我给你列出来!

1、首先,主函数没有调用main子程序,在code段中添加call main ;
2、定义数据段不对:
data segment use16
buf db 50
db ?
db 50 dup(0)
data ends ;
3、然后,查找时,应该从缓冲区第一个字符开始,也就是buf定义的内存的地址的第三个字节开始,第一个字节存放缓冲区大小,第二个存放实际输入的字符数,所以:
lea si, buf+2 ;
4、你输入的字符串尾并没有'$',所以要自己添加:
mov bl, buf+1
mov bh, 0
mov byte ptr buf+2[bx], '$' ;
5、在子程序find1中,输出的是字符个数,所以要使用2号功能调用,还有,你要事先转换成ASCII码才可以被识别,在A3后添加:
add cx, '0'
mov dl, cl
mov ah, 2
int 21h ;
6、同样,子程序find2中,也要跟上面一样,在B3后添加:
add cx, '0'
mov dl, cl
mov ah, 2
int 21h ;
7、最后,最好在调用find1和find2之间输出换行或空格,这样显示效果好点(你自己加吧)
(还有我忘说明了,我写的输出只能是字符数在10个以内的,如果超过9个,那么还要改输出语句,这个就太复杂了,建议调用已经写好的标准十进制输出子程序,这个自己在书本中找吧!)
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-09-20
楼上好人啊
第3个回答  2011-09-14
楼上好雅兴啊
相似回答