一、实验目的
编写子程序,掌握cmp指令和转移指令之间的关系,熟悉标志寄存器。
二、实验设备与环境
计算机
DOS操作系统或 Windows 操作系统
MASM.EXE, LINK.EXE, DEBUG.COM 或宏汇编集成环境
MASM for Windows 集成实验环境2015
三、实验内容、程序清单及运行结果
1.编写一个子程序,将包含任意字符,以0结尾的字符串中的小写字母转变成大写字母,描述如下。
名称:letterc
功能:将以0结尾的字符串中的小写字母转变成大写字母
参数:ds:si指向字符串首地址
代码:
DATAS SEGMENT
db "Beginner's All-purpose Symbolic Instruction Code.",0
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
mov ax,DATAS
mov ds,ax
mov si,0
ok:
mov ah,4Ch
letterc:
mov ch,0
mov cl,ds:[si]
;判断是否为零
cmp byte ptr [si],97;大写
cmp byte ptr [si],122;Сд
sub byte ptr [si],20h
no:
inc si
CODES ENDS
END START
思路:
通过cmp改变标志寄存器,结合ja,jb指令判断标志寄存器来实现判断大小的功能,通过jcxz进行循环判断是否为字符串结束
截图:
原来的样子:
后来的样子:
修改相关数据后:
原数据:
处理后:
附加题:
定义一个班级的成绩数组,数组长度N>=15。统计其中优秀[100,90]、良好[89,80] 、中等[79,70] 、及格[69,60] 、不及格[59,0]的人数,分别存于A_NUM、 B_NUM、 C_NUM、 D_NUM、 E_NUM中。
要求各个分数段都有人员分布
代码:
DATAS SEGMENT
db 55,45,65,66,60,70,73,77
db 80,88,85,87,99,95,95,93,-1
A_NUM db 0
B_NUM db 0
C_NUM db 0
D_NUM db 0
E_NUM db 0
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
mov ax,DATAS
mov ds,ax
sub si,si
mov cx,16
cmp byte ptr [si],-1;判断是否结束
cmp byte ptr [si],100
;非法数据,跳过
cmp byte ptr [si],90;大于等于90
cmp byte ptr [si],80;大于等于80
cmp byte ptr [si],70;大于等于70
cmp byte ptr [si],60;大于等于60
cmp byte ptr [si],0;大于等于0
ae90:
inc A_NUM[0]
ae80:
inc B_NUM[0]
ae70:
inc C_NUM[0]
ae60:
inc D_NUM[0]
ae0:
inc E_NUM[0]
inc si
ok:
mov ah,4Ch
CODES ENDS
END START
思路:
通过cmp和ja,jb,jae,jbe实现类似C语言的if(a>90),if(a>80)……..,通过jmp等跳转语句实现类似C语言的{i++;},即子程序,通过-1判断结束
截图:
源数据:
处理后的:
- 实验结论、实验体会
第一题:
通过cmp改变标志寄存器,结合ja,jb指令判断标志寄存器来实现判断大小的功能,通过jcxz进行循环判断是否为字符串结束
第二题:
通过cmp和ja,jb,jae,jbe实现类似C语言的if(a>90),if(a>80)……..,通过jmp等跳转语句实现类似C语言的{i++;},即子程序,通过-1判断结束