在8086masm环境下,写一个汇编程序,要求以下两个功能分别使用两个子程序实现。 检测并清除数字字符; 字符串中小写字母改为大写字母。从键盘输入(带回显)一个长度在10字符以内的字符串,并保存在缓冲区; 检测并删除字符串中的数字字符,将字符串中所有小写字母改为大写字母; 将处理后的字符串在新的一行显示,若字符串为空串则显示 ‘?’。
时间: 2024-03-10 20:45:37 浏览: 122
汇编语言之 两个多位十进制数相加
下面是一个实现您要求的汇编程序的示例代码:
```
.model small
.stack 100h
.data
prompt db 'Please enter a string (up to 10 characters): $'
buffer db 11, ?, 10 dup ('$') ; 存储输入的字符串
output db 10, 'Processed string: $' ; 存储输出的字符串
.code
main proc
; 显示提示信息
mov ah, 09h
lea dx, prompt
int 21h
; 读取输入的字符串
mov ah, 0Ah
lea dx, buffer
int 21h
; 处理字符串
call remove_digits
call convert_lowercase_to_uppercase
; 显示处理后的字符串
mov ah, 09h
lea dx, output
int 21h
mov ah, 09h
lea dx, buffer+2
int 21h
; 如果字符串为空,则输出 '?'
cmp byte ptr buffer+1, 0 ; 判断字符串长度是否为 0
jne end_program
mov ah, 09h
mov dx, '?$'
int 21h
end_program:
mov ah, 4Ch
int 21h
main endp
; 检测并清除数字字符
remove_digits proc
mov si, offset buffer+2 ; 将 SI 设置为字符串的第一个字符
mov di, si ; 将 DI 初始化为字符串的第一个字符
remove_digits_loop:
mov al, [si]
cmp al, '0'
jb not_digit
cmp al, '9'
ja not_digit
inc si
jmp remove_digits_loop
not_digit:
mov [di], al
inc di
cmp al, '$' ; 判断是否到达字符串结尾
jne remove_digits_loop
ret
remove_digits endp
; 字符串中小写字母改为大写字母
convert_lowercase_to_uppercase proc
mov si, offset buffer+2 ; 将 SI 设置为字符串的第一个字符
convert_lowercase_to_uppercase_loop:
mov al, [si]
cmp al, 'a'
jb not_lowercase
cmp al, 'z'
ja not_lowercase
sub al, 20h ; 将小写字母转换为大写字母
mov [si], al
not_lowercase:
inc si
cmp al, '$' ; 判断是否到达字符串结尾
jne convert_lowercase_to_uppercase_loop
ret
convert_lowercase_to_uppercase endp
end main
```
该程序首先从键盘读取一个字符串,然后调用两个子程序来分别删除其中的数字字符和转换其中的小写字母为大写字母。最后,它输出处理后的字符串。如果输入的字符串为空,则输出 '?'。
请注意,该程序假定输入的字符串长度不超过 10 个字符,并在缓冲区中留出了 11 个字节,其中第一个字节存储字符串的实际长度。
阅读全文