汇编语言 请从键盘输入一个长度不超过30的字符串,其中包含自己的班级名称+学号+姓名的拼音(区分大小写),以"$"符号结束,之后完成以下任务(要求使用子程序): 1.屏幕显示输出该字符串; 2.将该字符串的奇数位置字符提取出来,组合成一个字符串显示输出。3.将该字符串中的所有数字字符剔除,然后显示输出; 4.将该字符串中的英文大写字母变成小写字母,小写字母变成大写字母,显示输出; 5.统计该字符串中的大写字母、小写字母和数字的个数,保存在内存变量中,并在屏幕上显示; 6.将该字符串中的数字进行累加,将累加结果显示输出。
时间: 2023-06-13 09:04:09 浏览: 172
以下是汇编语言的代码,实现了上述6个任务:
```assembly
.model small
.stack 100h
.data
input db 31,?,31 dup('$') ; 输入字符串,长度为31
output db 31 dup('$') ; 输出字符串,长度为31
odd db 16 dup('$') ; 奇数位置字符组成的字符串,最长为16
count_upper dw 0 ; 大写字母个数
count_lower dw 0 ; 小写字母个数
count_digit dw 0 ; 数字个数
sum dw 0 ; 数字累加和
.code
mov ax, @data
mov ds, ax
; 1. 从键盘输入字符串
mov ah, 0Ah
lea dx, input
int 21h
; 2. 屏幕显示输出该字符串
lea dx, input+2
mov ah, 09h
int 21h
; 3. 将奇数位置字符提取出来,组合成一个字符串,并显示输出
; 注意,从0开始计数,所以奇数位置为1、3、5、...
lea si, input+2
lea di, odd
mov cx, 0
next_char:
mov al, [si]
cmp al, '$'
je end_loop
inc si
inc cx
test cx, 1
jz next_char ; 如果是偶数位置,跳过
mov [di], al
inc di
jmp next_char
end_loop:
; 显示奇数位置字符组成的字符串
lea dx, odd
mov ah, 09h
int 21h
; 4. 将该字符串中的所有数字字符剔除,然后显示输出
lea si, input+2
lea di, output
next_char2:
mov al, [si]
cmp al, '$'
je end_loop2
inc si
cmp al, '0'
jb skip_char2 ; 如果是非数字字符,直接复制
cmp al, '9'
ja skip_char2
jmp next_char2
skip_char2:
mov [di], al
inc di
jmp next_char2
end_loop2:
; 显示剔除数字字符后的字符串
lea dx, output
mov ah, 09h
int 21h
; 5. 将该字符串中的英文大写字母变成小写字母,小写字母变成大写字母,显示输出,并统计大写字母、小写字母和数字的个数
lea si, input+2
lea di, output
mov cx, 0
mov count_upper, 0
mov count_lower, 0
mov count_digit, 0
next_char3:
mov al, [si]
cmp al, '$'
je end_loop3
inc si
cmp al, '0'
jb copy_char3 ; 如果是非数字字符,进行大小写转换
cmp al, '9'
ja copy_char3
; 如果是数字字符,累加到sum中
sub al, '0'
mov ah, 0
adc sum, ax
inc count_digit
jmp next_char3
copy_char3:
cmp al, 'A'
jb check_lower3 ; 如果是非大写字母,直接复制
cmp al, 'Z'
ja check_lower3
; 如果是大写字母,转换为小写字母
add al, 'a'-'A'
inc count_lower
jmp output_char3
check_lower3:
cmp al, 'a'
jb output_char3 ; 如果是非小写字母,直接复制
cmp al, 'z'
ja output_char3
; 如果是小写字母,转换为大写字母
sub al, 'a'-'A'
inc count_upper
output_char3:
mov [di], al
inc di
jmp next_char3
end_loop3:
; 显示大小写转换后的字符串
lea dx, output
mov ah, 09h
int 21h
; 显示大写字母、小写字母和数字的个数
mov ah, 02h ; 用于显示字符的DOS中断
mov dl, 'U'
int 21h
mov ax, count_upper
call print_word
mov dl, 'L'
int 21h
mov ax, count_lower
call print_word
mov dl, 'D'
int 21h
mov ax, count_digit
call print_word
; 6. 将该字符串中的数字进行累加,将累加结果显示输出
mov ax, sum
call print_word
mov ah, 4ch
int 21h
print_word proc near
; 将16位无符号整数显示在屏幕上
push ax
push bx
push cx
push dx
mov bx, 10
xor cx, cx ; cx为0,用于计数
next_digit:
xor dx, dx ; dx清零
div bx
push dx ; 将余数保存在栈中
inc cx
test ax, ax ; 如果ax为0,跳出循环
jnz next_digit
print_digit:
pop dx ; 从栈中弹出一个数字
add dl, '0' ; 转换为字符
mov ah, 02h
int 21h ; 显示字符
loop print_digit ; 继续弹出数字,直到全部显示
pop dx
pop cx
pop bx
pop ax
ret
print_word endp
end
```
注意:上述代码是基于 DOS 平台的 16 位汇编语言,只能在 DOSBox 等模拟器中运行。如果在其他平台上运行,可能需要进行一些修改。
阅读全文