在8086masm环境下,写一个汇编程序,要求以下两个功能分别使用两个子程序实现。 1 检测并清除数字字符; 2 字符串中小写字母改为大写字母。具体要求:“从键盘输入(带回显)一个长度在10字符以内的字符串,并保存在缓冲区; 检测并删除字符串中的数字字符,将字符串中所有小写字母改为大写字母; 将处理后的字符串在新的一行显示,若字符串为空串则显示 ‘?’。”
时间: 2024-03-10 08:46:07 浏览: 67
好的,以下是汇编程序的代码:
```
.model small
.stack 100h
.data
inputMsg db 0ah, "Please input a string (up to 10 characters): ", '$'
outputMsg db 0ah, "Result: ", '$'
emptyMsg db 0ah, "?", '$'
buffer db 10, 0
msgLen db ?
msgPos db ?
.code
main proc
mov ax, @data
mov ds, ax
; 输出提示信息
lea dx, inputMsg
mov ah, 09h
int 21h
; 读取输入字符串
lea dx, buffer
mov ah, 0ah
int 21h
; 获取字符串长度
mov al, buffer+1
mov msgLen, al
; 检测并清除数字字符
call deleteDigits
; 字符串中小写字母改为大写字母
call toUpperCase
; 输出处理后的字符串
lea dx, outputMsg
mov ah, 09h
int 21h
cmp msgLen, 0
je emptyString
lea si, buffer
mov cx, msgLen
mov ah, 02h
repne scasb
dec si
mov ah, 40h
mov bx, 1
mov cx, si
int 21h
jmp exitProgram
emptyString:
lea dx, emptyMsg
mov ah, 09h
int 21h
exitProgram:
mov ah, 4ch
int 21h
main endp
; 检测并删除数字字符
deleteDigits proc
mov si, offset buffer+2
mov di, offset buffer+2
mov cx, msgLen
loop1:
cmp cx, 0
je done1
mov al, [si]
cmp al, 30h
jb skip1
cmp al, 39h
ja skip1
inc si
dec msgLen
jmp loop1
skip1:
mov [di], al
inc si
inc di
loop loop1
done1:
mov [di], '$'
ret
deleteDigits endp
; 将字符串中小写字母改为大写字母
toUpperCase proc
mov si, offset buffer+2
mov cx, msgLen
loop2:
cmp cx, 0
je done2
mov al, [si]
cmp al, 'a'
jb skip2
cmp al, 'z'
ja skip2
sub al, 20h
mov [si], al
skip2:
inc si
loop loop2
done2:
ret
toUpperCase endp
end main
```
程序中使用了两个子程序,分别是 `deleteDigits` 和 `toUpperCase`。其中,`deleteDigits` 用来检测并删除字符串中的数字字符,`toUpperCase` 用来将字符串中的小写字母改为大写字母。
具体实现流程如下:
1. 从键盘输入一个长度在10字符以内的字符串,并保存在缓冲区。
2. 获取字符串长度,并存储在 `msgLen` 变量中。
3. 调用 `deleteDigits` 子程序,检测并删除字符串中的数字字符。
4. 调用 `toUpperCase` 子程序,将字符串中的小写字母改为大写字母。
5. 输出处理后的字符串,如果字符串为空串则输出问号。
6. 程序结束。
需要注意的是,在 `deleteDigits` 子程序中,我们使用了两个指针 `si` 和 `di` 来遍历字符串,并使用 `cx` 记录字符串长度。在遍历字符串时,我们使用了 `cmp` 指令来判断字符是否为数字字符,然后使用 `inc` 和 `dec` 指令来修改字符串长度,并使用 `jmp` 指令来跳过数字字符。而在 `toUpperCase` 子程序中,我们同样使用了一个指针 `si` 来遍历字符串,并使用 `cx` 记录字符串长度。在遍历字符串时,我们使用了 `cmp` 指令来判断字符是否为小写字母,然后使用 `sub` 指令将其转化为大写字母。
阅读全文