汇编语言写:计算一段英文中单词的个数
要求
- 运用标志位i,首先判断其是否为一个正确的单词,若是这个“假单词”i=0,若正确则1=1;当读完该单词则总数sum+i(之前sum初始化为0);当整篇英文读完(读到回车)则输出sum.
MODEL SMALL
.DATA
STRING1 DB 'PLEASE ENTER ONE ESSEY:$';
STRING2 DB 'THE WORD QUANTITY:$';
num db 200 dup(?)
i db ?
.CODE
main proc far
mov ax,@data ;一定要有这个否则会输出乱码
mov ds,ax
call calculate;
call output;
main endp
;--------------------
calculate proc near
lea dx,STRING1
mov ah,09h
int 21h
mov bx,0
calculate1:
mov ah,01h
int 21h
cmp al,61h ;判断是否为大写字母
jl calculate5
sub al,20h ;若为大写字母则变为小写
calculate5:
mov num[bx],al
cmp al,0dh ;若为换行则开始计算
je calculate2
inc bx
jmp calculate1;循环读入字符直至换行跳出
calculate2:
mov bx,0
mov cl,0
calculate3:
mov al,num[bx]
mov i,1
cmp al,40H
jl calculate4
inc bx
jmp calculate3
calculate4:
cmp al,21h ;!
je calculate6
cmp al,2ch ;,
je calculate6
cmp al,2eh ;.
je calculate6
cmp al,3fh ;?
je calculate6
cmp al,20h ;空格
je calculate6
cmp al,0dh ;换行
je calculate8
mov i,0 ;错误单词
jmp calculate9
calculate6:
add cl,i
inc bx
jmp calculate3
calculate8:
jmp exit
calculate9:
mov al,num[bx]
inc bx ;单词错误开始读入单词直至该单词结束
cmp al,21h ;若为, 。 ? !空格则跳出
je calculate3
cmp al,2ch
je calculate3
cmp al,2eh
je calculate3
cmp al,3fh
je calculate3
cmp al,20h
je calculate3
cmp al,0dh ; 若为换行则直接结束此调用开始output函数
je exit
jmp calculate9
exit:
ret
calculate endp
;----------------------
output proc near
lea dx,STRING2
mov ah,09h
int 21h
mov al,cl
cbw
OUTPUT5:
MOV DX,0;
MOV BX,10
DIV BX; ax除以10余数放入dx中
ADD DX,30H
PUSH DX ; 将dx(个位、十位、百位、等)压入栈
INC SI; 做出栈标记
CWD; 扩展
CMP AX,0
JZ OUTPUT4
JMP OUTPUT5
OUTPUT4:
POP AX; 逐个出栈(。。。。百位、十位、个位)
DEC SI
MOV DL,AL; 逐个输出数的。。。。百位、十位、个位
MOV AH,02H
INT 21H
CMP SI,0
JNZ OUTPUT4
output endp
ENDING:
MOV AX,4C00H; 终止程序
INT 21H
END
输入 i am wuqiong dada1!
I am wuqiong 为真单词
dada1 为假
所以输出为3