汇编语言子程序将字符串中的小写字母改为大写字母
时间: 2024-02-19 08:02:52 浏览: 114
下面是一个汇编语言子程序,可以将一个字符串中的小写字母改为大写字母:
```
; 输入:
; SI - 指向待转换的字符串
; 输出:
; 无
convert_lowercase_to_uppercase:
mov cl, [si] ; 将字符串中的一个字符读入 cl
cmp cl, 0 ; 如果字符为结束符,则结束转换
je end_loop
cmp cl, 'a' ; 检查是否小于 'a'
jl not_lowercase
cmp cl, 'z' ; 检查是否大于 'z'
jg not_lowercase
sub cl, 32 ; 转换为大写字母
mov [si], cl ; 将转换后的字符写回到字符串中
not_lowercase:
inc si ; 指向下一个字符
jmp convert_lowercase_to_uppercase
end_loop:
ret
```
该子程序首先将待转换的字符串的地址放入 SI 寄存器中,然后使用一个循环,逐个读取字符串中的字符。对于每个字符,如果该字符为小写字母,则将其转换为大写字母,然后将转换后的字符写回到字符串中。最后使用 ret 指令返回。
使用该子程序时,需要将待转换的字符串的地址放入 SI 寄存器中,然后调用该子程序。调用结束后,字符串中的所有小写字母都将被转换为大写字母。
相关问题
在8086masm环境下,写一个汇编程序,要求以下两个功能分别使用两个子程序实现。 检测并清除数字字符; 字符串中小写字母改为大写字母。从键盘输入(带回显)一个长度在10字符以内的字符串,并保存在缓冲区; 检测并删除字符串中的数字字符,将字符串中所有小写字母改为大写字母; 将处理后的字符串在新的一行显示,若字符串为空串则显示 ‘?’。
下面是一个实现您要求的汇编程序的示例代码:
```
.model small
.stack 100h
.data
prompt db 'Please enter a string (up to 10 characters): $'
buffer db 11, ?, 10 dup ('$') ; 存储输入的字符串
output db 10, 'Processed string: $' ; 存储输出的字符串
.code
main proc
; 显示提示信息
mov ah, 09h
lea dx, prompt
int 21h
; 读取输入的字符串
mov ah, 0Ah
lea dx, buffer
int 21h
; 处理字符串
call remove_digits
call convert_lowercase_to_uppercase
; 显示处理后的字符串
mov ah, 09h
lea dx, output
int 21h
mov ah, 09h
lea dx, buffer+2
int 21h
; 如果字符串为空,则输出 '?'
cmp byte ptr buffer+1, 0 ; 判断字符串长度是否为 0
jne end_program
mov ah, 09h
mov dx, '?$'
int 21h
end_program:
mov ah, 4Ch
int 21h
main endp
; 检测并清除数字字符
remove_digits proc
mov si, offset buffer+2 ; 将 SI 设置为字符串的第一个字符
mov di, si ; 将 DI 初始化为字符串的第一个字符
remove_digits_loop:
mov al, [si]
cmp al, '0'
jb not_digit
cmp al, '9'
ja not_digit
inc si
jmp remove_digits_loop
not_digit:
mov [di], al
inc di
cmp al, '$' ; 判断是否到达字符串结尾
jne remove_digits_loop
ret
remove_digits endp
; 字符串中小写字母改为大写字母
convert_lowercase_to_uppercase proc
mov si, offset buffer+2 ; 将 SI 设置为字符串的第一个字符
convert_lowercase_to_uppercase_loop:
mov al, [si]
cmp al, 'a'
jb not_lowercase
cmp al, 'z'
ja not_lowercase
sub al, 20h ; 将小写字母转换为大写字母
mov [si], al
not_lowercase:
inc si
cmp al, '$' ; 判断是否到达字符串结尾
jne convert_lowercase_to_uppercase_loop
ret
convert_lowercase_to_uppercase endp
end main
```
该程序首先从键盘读取一个字符串,然后调用两个子程序来分别删除其中的数字字符和转换其中的小写字母为大写字母。最后,它输出处理后的字符串。如果输入的字符串为空,则输出 '?'。
请注意,该程序假定输入的字符串长度不超过 10 个字符,并在缓冲区中留出了 11 个字节,其中第一个字节存储字符串的实际长度。
在8086masm环境下,写一个汇编程序,要求以下两个功能分别使用两个子程序实现。 1 检测并清除数字字符; 2 字符串中小写字母改为大写字母。 具体要求如下:“从键盘输入(带回显)一个长度在10字符以内的字符串,并保存在缓冲区; 然后检测并删除字符串中的数字字符,将字符串中所有小写字母改为大写字母; 最后将处理后的字符串在新的一行显示,若字符串为空串则显示 ‘?’。”
下面是一个示例程序,实现了题目要求的两个子程序,并且能够对输入的字符串进行检测、处理、输出。
```
.model small
.stack 100h
.data
buffer db 11, 0 ; 缓冲区,长度为 11(包括换行符和结束符)
prompt db "请输入一个长度在 10 字符以内的字符串:$"
output db 13, 10, "处理后的字符串为:", 13, 10, "$"
empty db "?", 13, 10, "$"
.code
main PROC
mov ax, @data
mov ds, ax
; 输出提示信息
mov ah, 09h
lea dx, prompt
int 21h
; 读取字符串到缓冲区
mov ah, 0ah
mov dx, offset buffer
int 21h
; 检测并清除数字字符
call remove_digits
; 将小写字母改为大写字母
call to_uppercase
; 输出处理后的字符串
mov ah, 09h
lea dx, output
int 21h
mov si, offset buffer+2 ; 跳过长度字节和换行符
cmp byte ptr [si], 0 ; 判断字符串是否为空串
jz empty_string
mov ah, 09h
mov dx, si
int 21h
jmp done
empty_string:
mov ah, 09h
lea dx, empty
int 21h
done:
mov ah, 4ch
int 21h
main ENDP
; 检测并清除数字字符
remove_digits PROC
mov si, offset buffer+2 ; 跳过长度字节
mov cl, byte ptr [si] ; 字符串长度
mov di, si ; di 指向当前字符
remove_loop:
cmp cl, 0 ; 判断是否处理完所有字符
je remove_done
mov bl, byte ptr [di] ; 当前字符
cmp bl, '0'
jb remove_next ; 不是数字字符
cmp bl, '9'
ja remove_next ; 不是数字字符
; 是数字字符,将其清除
mov ah, 0
mov byte ptr [di], ah
remove_next:
inc di
dec cl
jmp remove_loop
remove_done:
ret
remove_digits ENDP
; 将小写字母改为大写字母
to_uppercase PROC
mov si, offset buffer+2 ; 跳过长度字节
mov cl, byte ptr [si] ; 字符串长度
mov di, si ; di 指向当前字符
uppercase_loop:
cmp cl, 0 ; 判断是否处理完所有字符
je uppercase_done
mov bl, byte ptr [di] ; 当前字符
cmp bl, 'a'
jb uppercase_next ; 不是小写字母
cmp bl, 'z'
ja uppercase_next ; 不是小写字母
; 是小写字母,将其转换为大写字母
sub byte ptr [di], 20h
uppercase_next:
inc di
dec cl
jmp uppercase_loop
uppercase_done:
ret
to_uppercase ENDP
end main
```
该程序的主要思路是先读取输入的字符串到缓冲区中,然后分别调用 `remove_digits` 和 `to_uppercase` 子程序,分别实现数字字符的清除和小写字母的转换。最后,判断处理后的字符串是否为空串,并将其输出到屏幕上。
阅读全文