在8086masm环境下,写一个汇编程序,要求以下两个功能分别使用两个子程序实现。 1 检测并清除数字字符; 2 字符串中小写字母改为大写字母。 具体要求如下:“从键盘输入(带回显)一个长度在10字符以内的字符串,并保存在缓冲区; 然后检测并删除字符串中的数字字符,将字符串中所有小写字母改为大写字母; 最后将处理后的字符串在新的一行显示,若字符串为空串则显示 ‘?’。”
时间: 2024-03-10 22:47:35 浏览: 46
下面是一个示例程序,实现了题目要求的两个子程序,并且能够对输入的字符串进行检测、处理、输出。
```
.model small
.stack 100h
.data
buffer db 11, 0 ; 缓冲区,长度为 11(包括换行符和结束符)
prompt db "请输入一个长度在 10 字符以内的字符串:$"
output db 13, 10, "处理后的字符串为:", 13, 10, "$"
empty db "?", 13, 10, "$"
.code
main PROC
mov ax, @data
mov ds, ax
; 输出提示信息
mov ah, 09h
lea dx, prompt
int 21h
; 读取字符串到缓冲区
mov ah, 0ah
mov dx, offset buffer
int 21h
; 检测并清除数字字符
call remove_digits
; 将小写字母改为大写字母
call to_uppercase
; 输出处理后的字符串
mov ah, 09h
lea dx, output
int 21h
mov si, offset buffer+2 ; 跳过长度字节和换行符
cmp byte ptr [si], 0 ; 判断字符串是否为空串
jz empty_string
mov ah, 09h
mov dx, si
int 21h
jmp done
empty_string:
mov ah, 09h
lea dx, empty
int 21h
done:
mov ah, 4ch
int 21h
main ENDP
; 检测并清除数字字符
remove_digits PROC
mov si, offset buffer+2 ; 跳过长度字节
mov cl, byte ptr [si] ; 字符串长度
mov di, si ; di 指向当前字符
remove_loop:
cmp cl, 0 ; 判断是否处理完所有字符
je remove_done
mov bl, byte ptr [di] ; 当前字符
cmp bl, '0'
jb remove_next ; 不是数字字符
cmp bl, '9'
ja remove_next ; 不是数字字符
; 是数字字符,将其清除
mov ah, 0
mov byte ptr [di], ah
remove_next:
inc di
dec cl
jmp remove_loop
remove_done:
ret
remove_digits ENDP
; 将小写字母改为大写字母
to_uppercase PROC
mov si, offset buffer+2 ; 跳过长度字节
mov cl, byte ptr [si] ; 字符串长度
mov di, si ; di 指向当前字符
uppercase_loop:
cmp cl, 0 ; 判断是否处理完所有字符
je uppercase_done
mov bl, byte ptr [di] ; 当前字符
cmp bl, 'a'
jb uppercase_next ; 不是小写字母
cmp bl, 'z'
ja uppercase_next ; 不是小写字母
; 是小写字母,将其转换为大写字母
sub byte ptr [di], 20h
uppercase_next:
inc di
dec cl
jmp uppercase_loop
uppercase_done:
ret
to_uppercase ENDP
end main
```
该程序的主要思路是先读取输入的字符串到缓冲区中,然后分别调用 `remove_digits` 和 `to_uppercase` 子程序,分别实现数字字符的清除和小写字母的转换。最后,判断处理后的字符串是否为空串,并将其输出到屏幕上。
阅读全文