实验11 编写子程序《汇编语言》- 王爽

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值