用DOS汇编命令实现:统计给定数据区内的英文字母、英文单词(连续字母串:字母开始、非字母结束)和行数。给出完整代码
时间: 2024-02-20 13:57:14 浏览: 206
以下是一个简单的用DOS汇编命令实现统计英文字母、英文单词和行数的程序:
```
DATA SEGMENT
BUFFER DB 1000 DUP('$') ; 存放数据的缓冲区
ALPHA_COUNT DB 26 DUP(0) ; 存放每个英文字母出现次数的计数器
WORD_COUNT DW 0 ; 存放单词数量的计数器
LINE_COUNT DW 0 ; 存放行数的计数器
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX ; 初始化数据段寄存器
; 读取数据
MOV AH, 0Ah ; 读取缓冲区数据
MOV DX, OFFSET BUFFER
INT 21h
; 统计英文字母、单词和行数
MOV CX, WORD_COUNT ; CX存储单词长度
MOV BX, OFFSET BUFFER ; BX存储缓冲区地址
MOV BYTE PTR [BX-1], ' ' ; 在缓冲区开始添加一个空格
MOV DX, OFFSET ALPHA_COUNT ; DX存储计数器地址
MOV SI, OFFSET BUFFER ; SI存储当前字符地址
MOV AL, 0 ; AL存储当前字符
MOV BL, 0 ; BL存储上一个字符
MOV WORD PTR [SI-2], 0 ; 将缓冲区开始的换行符改为null字符
MOV WORD PTR [SI-1], 0 ; 将缓冲区开始的null字符改为null字符
MOV WORD PTR [SI], 0 ; 将缓冲区开始的null字符改为null字符
MOV DI, WORD PTR [SI-2] ; DI存储当前单词长度
MOV WORD PTR [SI-2], DI+1 ; 在单词长度位置加1
MOV DI, WORD PTR [SI-2] ; DI存储当前单词长度
MOV BYTE PTR [SI+DI], ' ' ; 在单词后面添加一个空格
MOV DI, 0 ; DI存储当前单词长度
MOV WORD PTR [SI-2], DI ; 将单词长度设为0
LOOP1:
MOV BL, AL ; 保存上一个字符
MOV AL, BYTE PTR [SI] ; 读取当前字符
CMP AL, 0Dh ; 判断是否为回车
JE ENDLINE ; 如果是回车,则跳转到ENDLINE
CMP AL, 'A' ; 判断是否为大写字母
JB NOTALPHA
CMP AL, 'Z'
JA NOTALPHA
SUB AL, 'A' ; 将字母转换为计数器的索引
INC BYTE PTR [DX+AL] ; 将该字母出现次数加1
JMP NOTSPACE
NOTALPHA:
CMP BL, 'A' ; 判断上一个字符是否为字母
JB NOTSPACE
CMP BL, 'Z'
JA NOTSPACE
MOV DI, WORD PTR [SI-2] ; DI存储当前单词长度
CMP DI, 0 ; 如果单词长度为0,则跳转到NOTSPACE
JE NOTSPACE
INC WORD PTR [CX] ; 将单词数量加1
MOV WORD PTR [SI-2], 0 ; 将单词长度设为0
NOTSPACE:
CMP AL, ' ' ; 判断是否为空格
JE SPACE
CMP AL, 0 ; 判断是否为null字符
JE ENDLOOP
INC SI ; 移动到下一个字符
JMP LOOP1
SPACE:
MOV DI, WORD PTR [SI-2] ; DI存储当前单词长度
CMP DI, 0 ; 如果单词长度为0,则跳转到SPACE2
JE SPACE2
INC WORD PTR [CX] ; 将单词数量加1
MOV WORD PTR [SI-2], 0 ; 将单词长度设为0
SPACE2:
MOV AL, BYTE PTR [SI+1] ; 读取下一个字符
CMP AL, 0 ; 判断是否为null字符
JE ENDLOOP
CMP AL, 0Dh ; 判断是否为回车
JE ENDLINE
INC WORD PTR [SI-2] ; 将单词长度加1
JMP LOOP1
ENDLINE:
INC WORD PTR [LINE_COUNT] ; 将行数加1
MOV AL, BYTE PTR [SI+1] ; 读取下一个字符
CMP AL, 0 ; 判断是否为null字符
JE ENDLOOP
CMP AL, 0Dh ; 判断是否为回车
JE ENDLINE
JMP LOOP1
ENDLOOP:
; 输出结果
MOV AH, 02h
MOV DL, 0Ah
INT 21h
MOV AH, 09h
LEA DX, [WORD_COUNT]
INT 21h
MOV AH, 02h
MOV DL, ' '
INT 21h
MOV AH, 09h
LEA DX, [LINE_COUNT]
INT 21h
MOV AH, 02h
MOV DL, ' '
INT 21h
MOV AH, 09h
LEA DX, [ALPHA_COUNT]
INT 21h
; 退出程序
MOV AH, 4Ch
INT 21h
CODE ENDS
END START
```
以上代码是一个简单的例子,可以根据实际需求进行修改和优化。
阅读全文