汇编语言(第三版)王爽著(实验十一)编写子程序

匿名 (未验证) 提交于 2019-12-02 23:32:01

一、实验目的

编写子程序,掌握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判断结束

文章来源: https://blog.csdn.net/OrangeHap/article/details/89790777
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!