在8086masm环境下,写一个汇编程序,要求以下两个功能分别使用两个子程序实现。 1 检测并清除数字字符; 2 字符串中小写字母改为大写字母。 具体要求如下:“从键盘输入(带回显)一个长度在10字符以内的字符串,并保存在缓冲区; 然后检测并删除字符串中的数字字符,将字符串中所有小写字母改为大写字母; 最后将处理后的字符串在新的一行显示,若字符串为空串则显示 ‘?’。” 注意语法,不要出现invalid instruction operands的报错
时间: 2024-03-10 07:46:20 浏览: 17
下面是一个实现上述要求的汇编程序,其中使用了两个子程序:`delete_digit`和`lower_to_upper`。
```assembly
.model small
.stack 100h
.data
buffer db 10, ?, 10 dup ('$') ; 缓冲区,第一个字节存储长度,后面存储字符串
msg db 13, 10, 'Processed string: $' ; 输出字符串前的提示信息
empty_msg db 13, 10, '?$' ; 如果字符串为空,则输出此信息
.code
main proc
mov ax, @data
mov ds, ax
; 从键盘输入字符串
mov ah, 0ah
lea dx, buffer
int 21h
; 检测并删除数字字符
call delete_digit
; 将小写字母改为大写字母
call lower_to_upper
; 输出处理后的字符串
mov ah, 09h
lea dx, msg
int 21h
mov ah, 09h
lea dx, buffer + 2 ; 跳过长度字节
int 21h
; 如果字符串为空,则输出'?'字符
cmp byte ptr buffer[1], 0
jne not_empty
mov ah, 09h
lea dx, empty_msg
int 21h
not_empty:
mov ah, 4ch
int 21h
main endp
; 检测并删除数字字符
delete_digit proc
push ax
push bx
push cx
push dx
mov bx, buffer + 2 ; 跳过长度字节
mov cl, byte ptr buffer[1] ; 字符串长度
mov ch, 0 ; 计数器清零
next_char:
cmp ch, cl
jge done
mov al, byte ptr [bx]
cmp al, '0'
jb not_digit
cmp al, '9'
ja not_digit
; 如果是数字字符,则删除该字符
mov dx, bx
mov cx, cl
sub cl, ch ; 计算剩余字符数
dec cl ; 去掉长度字节
mov ah, 40h
add bx, 2 ; 跳过长度字节
inc bx ; 指向下一个字符
mov dl, byte ptr bx
add bx, 2 ; 跳过该字符
mov ah, 40h
sub bx, 2 ; 指向当前字符
mov si, bx ; 保存当前字符位置
mov bx, dx ; 恢复缓冲区指针
mov dx, bx ; 文件句柄
mov bx, si ; 恢复当前字符位置
mov ah, 3eh
int 21h
mov bx, buffer + 2 ; 跳过长度字节
mov bx, dx ; 恢复缓冲区指针
mov cl, byte ptr [bx] ; 重新获取字符串长度
mov ch, 0 ; 计数器清零
jmp next_char
not_digit:
inc ch ; 计数器加一
inc bx ; 指向下一个字符
jmp next_char
done:
pop dx
pop cx
pop bx
pop ax
ret
delete_digit endp
; 将小写字母改为大写字母
lower_to_upper proc
push ax
push bx
push cx
push dx
mov bx, buffer + 2 ; 跳过长度字节
mov cl, byte ptr buffer[1] ; 字符串长度
mov ch, 0 ; 计数器清零
next_char:
cmp ch, cl
jge done
mov al, byte ptr [bx]
cmp al, 'a'
jb not_lower
cmp al, 'z'
ja not_lower
; 如果是小写字母,则转换为大写字母
sub al, 20h
mov byte ptr [bx], al
not_lower:
inc ch ; 计数器加一
inc bx ; 指向下一个字符
jmp next_char
done:
pop dx
pop cx
pop bx
pop ax
ret
lower_to_upper endp
end main
```
该程序的思路如下:
1. 从键盘输入字符串,并保存在缓冲区中。
2. 调用`delete_digit`子程序,检测并删除字符串中的数字字符。
3. 调用`lower_to_upper`子程序,将字符串中所有小写字母改为大写字母。
4. 输出处理后的字符串。
5. 如果字符串为空,则输出'?'字符。