使用8086汇编语言,从键盘输入一个长度不超过30的字符串,其中包含自己的班级名称+学号+姓名的拼音(班级和姓名的首字母大写),以"$"符号结束,之后完成以下任务(要求使用子程序): 屏幕显示输出该字符串; 将该字符串的奇数位置字符提取出来,组合成一个字符串显示输出。将该字符串中的所有数字字符剔除,然后显示输出; 将该字符串中的英文大写字母变成小写字母,小写字母变成大写字母,显示输出; 统计该字符串中的大写字母、小写字母和数字的个数,保存在内存变量中,并在屏幕上显示; 将该字符串中的数字进行
时间: 2023-06-10 08:07:37 浏览: 524
以下是使用8086汇编语言实现以上任务的代码:
```
.model small
.stack 100h
.data
inputStr db 31,?,dup('$') ; 存放输入字符串
oddStr db 31,?,dup('$') ; 存放奇数位置字符组成的字符串
noDigitStr db 31,?,dup('$') ; 存放剔除数字后的字符串
count db 0,0,0 ; 存放大写字母、小写字母和数字的个数
.code
main proc
mov ax, @data
mov ds, ax
; 从键盘输入字符串
lea dx, inputStr
mov ah, 0ah
int 21h
; 显示输入字符串
lea dx, inputStr+2
mov ah, 09h
int 21h
; 提取奇数位置字符
lea si, inputStr+2
lea di, oddStr+2
mov cx, [inputStr+1] ; 字符串长度
mov bx, 0 ; 计数器,从0开始,因为第一个字符的下标是0
mov ah, 0 ; 用来存储奇偶性的变量
oddLoop:
inc bx
mov ah, bx
and ah, 01h ; 判断奇偶性
cmp ah, 1
jne oddLoop
mov al, [si+bx-1]
mov [di], al
inc di
loop oddLoop
mov [oddStr+1], dl ; 存储奇数位置字符组成的字符串长度
; 剔除数字字符
lea si, inputStr+2
lea di, noDigitStr+2
mov cx, [inputStr+1] ; 字符串长度
noDigitLoop:
mov al, [si]
cmp al, '0'
jb noDigitSkip
cmp al, '9'
ja noDigitSkip
inc si
jmp noDigitLoop
noDigitSkip:
mov [di], al
inc si
inc di
loop noDigitLoop
mov [noDigitStr+1], dl ; 存储剔除数字后的字符串长度
; 大小写转换
lea si, inputStr+2
mov cx, [inputStr+1] ; 字符串长度
caseLoop:
mov al, [si]
cmp al, 'a'
jb upperCase
cmp al, 'z'
ja upperCase
sub al, 'a'
add al, 'A'
jmp nextChar
upperCase:
cmp al, 'A'
jb digitCase
cmp al, 'Z'
ja digitCase
sub al, 'A'
add al, 'a'
jmp nextChar
digitCase:
cmp al, '0'
jb nextChar
cmp al, '9'
ja nextChar
nextChar:
mov [si], al
inc si
loop caseLoop
; 统计大写字母、小写字母和数字的个数
lea si, inputStr+2
mov cx, [inputStr+1] ; 字符串长度
countLoop:
mov al, [si]
cmp al, 'a'
jb upperCount
cmp al, 'z'
ja upperCount
inc count+1 ; 小写字母
jmp nextCountChar
upperCount:
cmp al, 'A'
jb digitCount
cmp al, 'Z'
ja digitCount
inc count+2 ; 大写字母
jmp nextCountChar
digitCount:
cmp al, '0'
jb nextCountChar
cmp al, '9'
ja nextCountChar
inc count+3 ; 数字
nextCountChar:
inc si
loop countLoop
; 显示奇数位置字符组成的字符串
lea dx, oddStr+2
mov ah, 09h
int 21h
; 显示剔除数字后的字符串
lea dx, noDigitStr+2
mov ah, 09h
int 21h
; 显示大小写转换后的字符串
lea dx, inputStr+2
mov ah, 09h
int 21h
; 显示大写字母、小写字母和数字的个数
lea dx, count
mov ah, 09h
int 21h
mov ah, 4ch
int 21h
main endp
end main
```
其中,`oddLoop`、`noDigitLoop`、`caseLoop`、`countLoop` 都是用来实现相应任务的子程序。在主程序中分别调用这些子程序即可完成任务。
阅读全文