汇编语言子程序将字符串中的小写字母改为大写字母
时间: 2024-02-19 21:02:52 浏览: 26
下面是一个汇编语言子程序,可以将一个字符串中的小写字母改为大写字母:
```
; 输入:
; 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 寄存器中,然后调用该子程序。调用结束后,字符串中的所有小写字母都将被转换为大写字母。
相关问题
汇编语言子程序实现字符串大小写转换
好的,以下是汇编语言子程序实现字符串大小写转换的代码:
```
; 子程序名称:strcase
; 功能:将字符串中的大写字母转换为小写字母,将小写字母转换为大写字母
; 输入参数:ESI指向待转换的字符串,ECX为字符串长度
; 输出参数:无
strcase:
push ebx ; 保存寄存器
push ecx
push edx
mov ebx, esi ; ebx指向字符串
mov edx, ecx ; edx保存字符串长度
xor ecx, ecx ; ecx清零,用于计数
convert_loop:
cmp ecx, edx ; 判断是否处理完所有字符
jge convert_end ; 处理完所有字符,跳出循环
mov al, [esi+ecx] ; 取出一个字符
cmp al, 'a' ; 判断是否小写字母
jb uppercase ; 不是小写字母,判断是否大写字母
cmp al, 'z' ; 判断是否小写字母
ja uppercase ; 不是小写字母,转换为大写字母
sub al, 32 ; 转换为大写字母
jmp convert_next ; 处理下一个字符
uppercase:
cmp al, 'A' ; 判断是否大写字母
jb convert_next ; 不是大写字母,处理下一个字符
cmp al, 'Z' ; 判断是否大写字母
ja convert_next ; 不是大写字母,处理下一个字符
add al, 32 ; 转换为小写字母
convert_next:
mov [esi+ecx], al ; 将转换后的字符写回字符串
inc ecx ; 处理下一个字符
jmp convert_loop ; 继续循环
convert_end:
pop edx ; 恢复寄存器
pop ecx
pop ebx
ret ; 返回
```
在8086masm环境下,写一个汇编程序,要求以下两个功能分别使用两个子程序实现。 1 检测并清除数字字符; 2 字符串中小写字母改为大写字母。具体要求:“从键盘输入(带回显)一个长度在10字符以内的字符串,并保存在缓冲区; 检测并删除字符串中的数字字符,将字符串中所有小写字母改为大写字母; 将处理后的字符串在新的一行显示,若字符串为空串则显示 ‘?’。”
好的,以下是汇编程序的代码:
```
.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` 指令将其转化为大写字母。