一、实验一
1、实验内容
(1)用Debug命令查看寄存器和内存中的内容
(2)上机过程及程序调试
2、实验目的
(1)要求掌握使用Debug命令查看寄存器和内存的方法;
(2)通过实例认识汇编语言程序,初步了解程序格式;段定义;标号;DOS系统功能;操作数;指令;说明语句等作用;
(3)掌握汇编语言程序从设计到形成可执行文件的方法和步骤,即编辑、汇编、连接。了解汇编语言的系统工作文件和工作环境。理解汇编程序和连接程序的作用。理解列表文件内容。
(4)初步了解程序的运行和调试方法。学会使用Debug主要命令和常用的DOS指令。
3、实验步骤
(1)进入DOS方式并运行Debug程序;
(2)用R命令查看、改变CPU 寄存器的内容;
(3)用Debug的D和E命令查看和改写内存中的内容;
(4)用Debug对HELLO程序进行调试;
4、实验结果与分析
(1)用R命令查看、改变CPU寄存器的内容:
查看CS=13A1, IP=0100,即内存13A1:0100处的指令为CPU当前要读取、执行的指令。CS:IP 指向13A1:0100,此处存放的机器码为027548,对应的汇编指令为ADD DH, [DI+48]。右下角的指令“DS: 0048=00”表示在“ADD DH, [DI+48]”中需要用到的存储单元“DS:0048”的值为“00”。
将IP的值改为0200,CS:IP指向13A1:0200,此处存放的机器码为5B,对应汇编指令为“POP BX”;将CS的值改为FF00,CS:IP指向FF00:0200,此处存放的机器码为51,对应汇编指令为“PUSH CX”。
(2)用Debug的D命令查看内存中的内容:
最左侧是每行的起始地址以逻辑地址的形式给出;中间的内存1000:0单元中的内容是72H,内存1000:1单元中的内容是64H,内存1000:0~1000:F中的内存都在第一行; 内存1000:10中的内容是EBH,内存1000:11处的内容是F0H,内存1000:10~1000:1F中的内容都在第二行;右边的内存单元1000:0、1000:1、1000:2中存放的数据是72H、64H、73H,对应的ASCI字符分别是“r”、“d”、“s";内存单元1000:07中的数据是3AH,它没有对应可显示的ASCII字符,Debug 就用“.”来代替。
(3)用Debug的E命令改写内存中的内容:
用E命令从内存1000:0逐个写入构成‘hello world!’的字符,再用D命令查看1000:0~1000:F单元的内容:“hello world!”。
(4)用Debug对HELLO程序进行调试:
① masm hello.asm; ② link hello; ③ hello.exe
输出:hello world!
二、实验二
1、实验内容
(1)不同寻址方式的灵活运用
(2)算术及位串处理程序
2、实验目的
(1)熟悉和掌握7种不同的操作数寻址方式的使用方法;
(2)掌握多数位的算术运算、移位操作、字符串操作等程序的设计,学习使用分支与循环等基本编程方法,熟练使用Debug。
3、实验步骤
(1)对指定内存单元的数据进行不同寻址方式的询问;
(2)在数据段预先存放16个十六进制数的ASCII码,首地址为ASC。从键盘输入一位十六进制数到BX,用ASC[BX]寻址方式找到对应数位的ASCII码,并取出显示;
(3)用16位指令编制程序,处理32位的加减乘除四则运算题;
(4)用字符串处理指令编制程序,处理字符串的比较和查找,显示结果;
(5)AL字节内容反向排序。
4、实验结果与分析
(1)两个操作数相减运算,结果放在数据段偏移地址为0016H的单元:
(2)两个操作数相加运算,结果放在附加段的0020H的单元:
(3)在数据段预先存放16个十六进制数的ASCII码,首地址为ASC。从键盘输入一位十六进制数到BX,用ASC[BX]寻址方式找到对应数位的ASCII码,并取出显示:
三、实验三
1、实验内容
(1)伪指令
(2)分支程序设计
2、实验目的
(1)掌握常用伪指令的使用方法,熟悉定义数据、定义程序模式、分配存储区等功能,实践课程中的实例;
(2)掌握分支程序的基本编程方法。熟悉数制转换。用LOOP指令、条件转移指令和向量地址法实现程序转移。
3、实验步骤
(1)用16位指令编写完整程序,实现数据定义语句和相关指令,在Debug下查看内存数据的定义情况,单步跟踪查看各寄存器的值;
(2)用16位指令编写完整程序,并上机调试,计算W=(X+Y)×Z,其中所有变量均为16位带符号变量;
(3)编写程序,如果输入的是大写字母,则输出对应的小写字母,反之亦然;如果输入的是数字,原样输出;按回车结束;
(4)分离字数组ARRAY中的正、负数,把其中的正数复制到PDATA数组;负数复制到NDATA数组,并分别统计正、负数个数。
(5)在数据段定义分支地址表,通过键盘输入数字1~8,实现转移,要求如下:
① 分支表定义为:PTABLE DW P1, P2, P3, P4, P5, P6, P7, P8
② P1~P8为标号,如果键入数字3,则从PTABLE中取出P3的地址,实现间接转移
4、实验结果与分析
(1)单步跟踪查看各寄存器的值:
AX=076A BX=0000 CX=014F DX=0000; AX=076A BX=0000 CX=014F DX=076A;
AX=07FF BX=0000 CX=014F DX=076A; AX=0700 BX=0000 CX=014F DX=076A;
AX=000C BX=0000 CX=014F DX=076A; AX=000C BX=0009 CX=014F DX=076A;
AX=0002 BX=0009 CX=014F DX=076A; AX=0002 BX=0001 CX=014F DX=076A;
AX=0002 BX=0102 CX=014F DX=076A; AX=0002 BX=0102 CX=0004 DX=076A;
AX=0002 BX=0102 CX=0004 DX=0004; AX=0002 BX=0009 CX=0004 DX=0004;
AX=0002 BX=00FF CX=0004 DX=0004
(2)字母大小写反转,数字原样输出:
判断输入的数据类型:
① 大写字母:加上20H转成小写字母[ADD AL,20H]再输出数据;
② 小写字母:减去20H转成大写字母[SUB AL,20H]再输出数据;
③ 数字类型:直接输出数据;
④ 回车:直接退出程序。
四、实验四
1、实验内容
(1)循环程序设计
(2)子程序设计和多模块程序设计
2、实验目的
(1)掌握循环程序的基本编程方法。提高循环程序编程技巧,熟悉键盘输入、显示输出等基本人机交互;
(2)掌握通用子程序的设计方法,学会子程序的功能划分和正确进行子程序的参数传递;
(3)熟悉使用结构变量,掌握多模块程序设计方法,正确使用PUBLIC,EXTRN实现参数传递;
3、实验步骤
(1)键入一个单个字符,显示该字符的ASCII码(十六进制),回车键退出循环,终止程序;
(2)键入7位二进制数,显示对应的字符,回车键退出循环,终止程序;
(3)键入一个四位的十六进制数(其中字母为大写),并将其转换为二进制数显示输出;
(4)采用通过地址表传递参数地址的方法,求数组元素累加和的通用子程序;
(5)键入一个十六进制数(不超过四位),显示输出该数的十进制形式;
(6)键入一个十进制数(小于65536的正数),显示输出该数的十六进制形式;
(7)设计一个简单计算器程序,实现整数的加减乘除运算;
(8)学生成绩表由姓名、A成绩、B成绩、合计总分四项组成,其中合计总分=A成绩+B成绩,键入6个人的成绩记录后,输出学生成绩表,要求成绩表用结构类型;输入、计算、输出分为3个子程序;成绩为百分制无符号数;合计总分由程序计算;
① 成绩键入后转为压缩BCD码格式存放;
② 成绩键入后转为二进制数格式存放;
4、实验结果与分析
(1)显示字符的十六进制ASCII码:
实现了从键盘输入一个单个字符(判断字符[CMP AL,13]),就可以以十六进制的形式显示该字符的ASCI码。如输入1,显示31,输入A,显示41。
(2)显示7位二进制数对应的字符:
实现了从键盘输人7位二进制数(二进制只有0和1,所以判断输入的数字是否是0或1即可),显示对应的字符。
(3)显示四位十六进制数对应的二进制数:
实现了从键盘输入一个四位的十六进制数,可以将其转换为二进制数并且显示输出。
(4)简单计算器程序:
① 从键盘输人算式,只接受不超过4位的十进制正整数。运算结果为不超过65535的整数
② 不接受复合算式,如3+5x6。
③ 计算器使用运算符‘+-×÷’、回车键和‘=’键、清除键‘C’。回车键或‘=’键给出计算结果,清除键‘C’为清0。按清除键后,可接受下一算式。
④ 程序分算式输人模块、计算模块、输出显示模块。输入模块和计算模块在同一程序文件中,输出显示模块为另一程序文件。