1. 需求
编写一个子程序,将包含任意字符,以 0 结尾的字符串中的小写字母转变成大写字母,描述如下。
名称:letterc
功能:将以 0 结尾的字符串中的小写字母转变成大写字母
参数:ds:di 指向字符串首地址
返回:无
应用举例:
assume cs:code, ds:data
data segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
data ends
code segment
begin:
mov ax, data
mov ds, ax
mov si, 0
call letterc
mov ax, 4c00h
int 21h
letterc:
...
code ends
end begin
2. 分析
(1) 一个字母的小写字母在assii码表中的值在区间:[97, 122]
(2) 一个字母的大写字母比小写字母小 32,让一个小写字母的assii码的二进制表示的第 5 位置 0 就得到了这个字母的大写字母的assii码值。
(3) 我们用 C 语言来描述功能代码逻辑为:
#include <stdio.h>
int main(int argc, char* argv[]) {
char str[] = "Beginner's All-purpose Symbolic Instruction Code.\0";
char *p = str; //指向字符串首地址
while (*p != 0) {
if (*p >= 97 && *p <= 122) {
*p = *p & 0b11011111; // 大写字母比小写字母小32
}
p++; //指向下一个字符
}
printf(str);
printf("\n");
return 0;
}
3. 代码
assume cs:code, ds:data
data segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
data ends
code segment
begin:
mov ax, data
mov ds, ax
mov si, 0 ;指向字符串首地址
call letterc
mov ax, 4c00h
int 21h
;名称:letterc
;功能:将以 0 结尾的字符串中的小写字母转变成大写字母
;参数:ds:di 指向字符串首地址
;返回:无
letterc: ;[97, 122]为小写字母的assii码区间
mov al, [si]
cmp al, 0
je ok ; al = 0, 跳出循环
cmp al, 97
jb next_byte ; al < 97, 让si指向下一个字节单元
cmp al, 122
ja next_byte ; al > 122, 让si指向下一个字节单元
and al, 11011111b ;一个字母的大写字母比小写字母小 32,让第 5位置0就得到了这个字母的大写字母的assii码值
mov [si], al
next_byte:
inc si
loop letterc
ok:
ret
code ends
end begin