用汇编语言 从键盘输入一个长度不超过30的字符串,其中包含自己的班级名称+学号+姓名的拼音(班级和姓名的首字母大写),以"$"符号结束,之后完成以下任务(要求使用子程序): 屏幕显示输出该字符串; 将该字符串的奇数位置字符提取出来,组合成一个字符串显示输出; 将该字符串中的所有数字字符剔除,然后显示输出; 将该字符串中的英文大写字母变成小写字母,小写字母变成大写字母,显示输出; 统计该字符串中的大写字母、小写字母和数字的个数,保存在内存变量中,并在屏幕上显示; 将该字符串中的数字进行累加,将累加结果显示输出。
时间: 2023-06-14 14:02:43 浏览: 216
以下是汇编语言的代码实现:
```
.model small
.stack 100h
.data
inputStr db 31 dup('$')
outputStr db 31 dup('$')
numCount dw 0
upperCount dw 0
lowerCount dw 0
sum dw 0
.code
main proc
mov ax, @data
mov ds, ax
; 获取字符串输入
call getStringInput
; 显示原始字符串
mov ah, 09h
mov dx, offset inputStr
int 21h
; 获取奇数位字符
call getOddChars
; 显示奇数位字符
mov ah, 09h
mov dx, offset outputStr
int 21h
; 剔除数字字符
call removeNums
; 显示剔除数字后的字符串
mov ah, 09h
mov dx, offset inputStr
int 21h
; 大小写字母转换
call convertCase
; 显示大小写转换后的字符串
mov ah, 09h
mov dx, offset inputStr
int 21h
; 统计字符个数
call countChars
; 显示字符个数统计结果
mov ah, 09h
mov dx, offset outputStr
int 21h
; 累加数字
call sumNums
; 显示数字累加结果
mov ah, 09h
mov dx, offset outputStr
int 21h
mov ah, 4ch
int 21h
main endp
; 获取字符串输入
getStringInput proc
mov si, 0
mov cx, 30
inputLoop:
; 从键盘读取一个字符
mov ah, 01h
int 21h
; 如果是回车键,结束输入
cmp al, 0dh
je inputEnd
; 如果已经达到最大长度,结束输入
cmp si, 30
je inputEnd
; 将字符存入字符串中
mov [inputStr+si], al
inc si
jmp inputLoop
inputEnd:
; 在字符串末尾添加 "$" 符号
mov [inputStr+si], '$'
ret
getStringInput endp
; 获取奇数位字符
getOddChars proc
mov si, 1
mov di, 0
oddLoop:
; 如果已经到达字符串末尾,结束循环
cmp byte ptr [inputStr+si], '$'
je oddEnd
; 将奇数位字符存入输出字符串中
mov al, [inputStr+si]
mov [outputStr+di], al
inc di
; 跳过偶数位字符
add si, 2
jmp oddLoop
oddEnd:
; 在输出字符串末尾添加 "$" 符号
mov [outputStr+di], '$'
ret
getOddChars endp
; 剔除数字字符
removeNums proc
mov si, 0
mov di, 0
removeLoop:
; 如果已经到达字符串末尾,结束循环
cmp byte ptr [inputStr+si], '$'
je removeEnd
; 如果是数字字符,跳过
cmp byte ptr [inputStr+si], '0'
jb removeSkip
cmp byte ptr [inputStr+si], '9'
ja removeSkip
; 将非数字字符存入输入字符串中
mov al, [inputStr+si]
mov [inputStr+di], al
inc di
removeSkip:
; 继续循环
inc si
jmp removeLoop
removeEnd:
; 在输入字符串末尾添加 "$" 符号
mov [inputStr+di], '$'
ret
removeNums endp
; 大小写字母转换
convertCase proc
mov si, 0
convertLoop:
; 如果已经到达字符串末尾,结束循环
cmp byte ptr [inputStr+si], '$'
je convertEnd
; 如果是大写字母,转换为小写字母
cmp byte ptr [inputStr+si], 'A'
jb convertSkip
cmp byte ptr [inputStr+si], 'Z'
ja convertSkip
add byte ptr [inputStr+si], 32
; 如果是小写字母,转换为大写字母
jmp convertNext
cmp byte ptr [inputStr+si], 'a'
jb convertNext
cmp byte ptr [inputStr+si], 'z'
ja convertNext
sub byte ptr [inputStr+si], 32
convertNext:
; 继续循环
inc si
jmp convertLoop
convertSkip:
; 继续循环
inc si
jmp convertLoop
convertEnd:
ret
convertCase endp
; 统计字符个数
countChars proc
mov si, 0
mov di, offset outputStr
mov word ptr [numCount], 0
mov word ptr [upperCount], 0
mov word ptr [lowerCount], 0
countLoop:
; 如果已经到达字符串末尾,结束循环
cmp byte ptr [inputStr+si], '$'
je countEnd
; 统计数字个数
cmp byte ptr [inputStr+si], '0'
jb countSkip
cmp byte ptr [inputStr+si], '9'
ja countNext
inc word ptr [numCount]
; 统计大写字母个数
jmp countLower
cmp byte ptr [inputStr+si], 'A'
jb countLower
cmp byte ptr [inputStr+si], 'Z'
ja countLower
inc word ptr [upperCount]
jmp countNext
countLower:
; 统计小写字母个数
cmp byte ptr [inputStr+si], 'a'
jb countNext
cmp byte ptr [inputStr+si], 'z'
ja countNext
inc word ptr [lowerCount]
countNext:
; 将字符存入输出字符串中
mov al, [inputStr+si]
mov [di], al
inc di
; 继续循环
inc si
jmp countLoop
countSkip:
; 将字符存入输出字符串中
mov al, [inputStr+si]
mov [di], al
inc di
; 继续循环
inc si
jmp countLoop
countEnd:
; 在输出字符串末尾添加 "$" 符号
mov [di], '$'
; 将字符个数统计结果存入输出字符串中
mov word ptr [di+2], [numCount]
mov word ptr [di+6], [upperCount]
mov word ptr [di+10], [lowerCount]
ret
countChars endp
; 累加数字
sumNums proc
mov si, 0
mov word ptr [sum], 0
sumLoop:
; 如果已经到达字符串末尾,结束循环
cmp byte ptr [inputStr+si], '$'
je sumEnd
; 如果是数字字符,累加到总和中
cmp byte ptr [inputStr+si], '0'
jb sumNext
cmp byte ptr [inputStr+si], '9'
ja sumNext
sub byte ptr [inputStr+si], 48
mov ax, [sum]
add ax, byte ptr [inputStr+si]
mov [sum], ax
sumNext:
; 继续循环
inc si
jmp sumLoop
sumEnd:
; 将数字累加结果转换为字符串
mov ax, [sum]
call wordToString
; 将数字累加结果存入输出字符串中
mov di, offset outputStr
mov [di], 'S'
mov [di+1], 'u'
mov [di+2], 'm'
mov [di+3], ':'
mov [di+4], ' '
mov dx, offset numStr
mov ah, 09h
int 21h
; 在输出字符串末尾添加 "$" 符号
mov [di+5], '$'
ret
sumNums endp
; 将十进制数转换为字符串
wordToString proc
push ax
push bx
push cx
mov bx, 10
mov cx, 0
numLoop:
xor dx, dx
div bx
push dx
inc cx
cmp ax, 0
jne numLoop
mov si, 0
strLoop:
pop dx
add dl, 48
mov [numStr+si], dl
inc si
loop strLoop
pop cx
pop bx
pop ax
ret
wordToString endp
end main
```
注:该代码使用的汇编语言是8086汇编。
阅读全文