资源描述
汇编与接口技术实验指导书(汇编语言部分)
实验室要求
实验设备安全至关重要,特别是以下几点:
1、 严格遵守实验室规章制度;
2、 注意人身安全和实验设备的安全;
3、 没有编写源代码,原则上不能参加试验;
4、 插接或拔掉实验连接线时,必须要关闭实验设备的电源;
5、 在加电后,严禁用手触摸芯片管脚或连线的金属部分;
6、 严禁私自挪动实验设备;
7、 严禁在实验室吃食物、喝饮料,保持实验室的清洁卫生;
8、 离开实验室前,要收拾好实验平台,并按要求放在指定的位置。
实验时间地点安排
周次
星期
日期
时间段
实验地点
第03周
星期2
2013-9-17
08:00--09:50
北402外
第06周
星期4
2013-10-10
10:10--12:00
北402里
第08周
星期2
2013-10-22
08:00--09:50
北402里
第09周
星期4
2013-10-31
10:10--12:00
北402里
第11周
星期2
2013-11-12
08:00--09:50
北402里
第12周
星期4
2013-11-21
10:10--12:00
北402里
第14周
星期2
2013-12-3
08:00--09:50
北402里
第15周
星期4
2013-12-12
10:10--12:00
北402里
实验工具:Debug调试实验指导书
一、编辑、连接
1、利用写字板等编辑软件编辑一个求三个数最大值的源程序MAX.ASM
2、利用MASM进行编译,并成功, 查看MAX.LST 文件,与MAX.ASM进行对比;
3、利用LINK进行连接,生成执行文件MAX.EXE。
参考源程序:MAX.ASM
DATA SEGMENT
X DB 115
Y DB 23
Z DB -20
MAX DB ?
DATA ENDS ;数据定义
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX ;数据段初始化
MOV AL,X ;X取到AL中
CMP AL,Y ;X和Y比较
JG NEXT ;X>Y转NEXT
MOV AL,Y ;否则Y取到AL中
CMP AL,Z ;Y和Z比较
JG EXIT ;Y>Z转EXIT
MOV AL,Z ;否则Z取到AL中
JMP EXIT ;转EXIT
NEXT:
CMP AL,Z ;X和Z比较
JG EXIT ;X>Z转EXIT
MOV AL,Z ;否则Z取到AL中
EXIT:
MOV MAX,AL ;AL中内容送MAX单元
MOV AH,4CH
INT 21H ;返回DOS
CODE ENDS
END START
二、调试
(1)调入:
c:\masm>debug max.exe
-r
AX=0000 BX=0000 CX=003D DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=1458 ES=1458 SS=1468 CS=1469 IP=0000 NV UP EI PL NZ NA PO NC
1469:0000 B86814 MOV AX,1468
-u 1469:0
1469:0000 B86814 MOV AX,1468
1469:0003 8ED8 MOV DS,AX
1469:0005 A00000 MOV AL,[0000]
1469:0008 3A060100 CMP AL,[0001]
1469:000C 7F0F JG 001D
1469:000E A00100 MOV AL,[0001]
1469:0011 3A060200 CMP AL,[0002]
1469:0015 7F0F JG 0026
1469:0017 A00200 MOV AL,[0002]
1469:001A EB0A JMP 0026
1469:001C 90 NOP
1469:001D 3A060200 CMP AL,[0002]
1469:0021 7F03 JG 0026
1469:0023 A00200 MOV AL,[0002]
1469:0026 A20300 MOV [0003],AL
1469:0029 B44C MOV AH,4C
1469:002B CD21 INT 21
(2)必须执行才能调试:
-g=0,2b
-r
AX=4C73 BX=0000 CX=003D DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=1468 ES=1458 SS=1468 CS=1469 IP=002B OV UP EI NG NZ AC PE CY
1469:002B CD21 INT 21
-d 1468:0
1468:0000 73 17 EC 73 00 00 00 00-00 00 00 00 00 00 00 00 s..s............
1468:0010 B8 68 14 8E D8 A0 00 00-3A 06 01 00 7F 0F A0 01 .h......:.......
1468:0020 00 3A 06 02 00 7F 0F A0-02 00 EB 0A 90 3A 06 02 .:...........:..
1468:0030 00 7F 03 A0 02 00 A2 03-00 B4 4C CD 21 53 6D 83 ..........L.!Sm.
1468:0040 C4 06 FF 76 06 FF 76 04-8D 86 74 FF 50 E8 5A FD ...v..v...t.P.Z.
1468:0050 8B E5 5D C3 55 8B EC 83-EC 08 56 A1 58 27 39 46 ..].U.....V.X'9F
1468:0060 06 77 03 E9 8A 00 A1 36-22 2B 06 58 27 89 46 FE .w.....6"+.X'.F.
1468:0070 2B C0 89 46 F8 89 46 FA-89 46 FC EB 22 90 8A 46 +..F..F..F.."..F
三、问题
有一个程序的数据区内容如下(部分内容):
1463:0000 73 17 EC 00 00 00 00 00-00 00 00 00 00 00 00 00
该程序的DEBUG反汇编代码如下:
1464:0000
B86314
MOV
AX,1463
1464:0003
8ED8
MOV
DS,AX
1464:0005
A00000
MOV
AL,[0000]
1464:0008
3A060100
CMP
AL,[0001]
1464:000C
7F0F
JG
001D
1464:000E
A00100
MOV
AL,[0001]
1464:0011
3A060200
CMP
AL,[0002]
1464:0015
7F0F
JG
26
1464:0017
A00200
MOV
AL,[0002]
1464:001A
EB0A
JMP
26
1464:001C
90
NOP
1464:001D
3A060200
CMP
AL,[0002]
1464:0021
7F03
JG
26
1464:0023
A00200
MOV
AL,[0002]
1464:0026
A20300
MOV
[0003],AL
1464:0029
B44C
MOV
AH,4C
1464:002B
CD21
INT
21
1464:002D
请回答以下问题(填空,每空2分,小计14分):
(1)、该程序的数据段的段地址是:( 1463 )H,代码段的段地址是:( 1464 ) H,代码段长度是:(002dH )H;
(2)、如果当前状态为:
AX=1473 BX=0000 CX=003D DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=1463 ES=1453 SS=1463 CS=1464 IP=000C NV UP EI PL NZ AC PE NC
1464:000C 7F0F JG 001D
那么,当前将执行的指令CS:IP = (1464:000C )H,该指令的机器指令代码是( 7F0F )H;该指令执行后如转移条件为真值时其下一条将执行的指令物理地址是:(1464:001D) H,否则下一条将执行的指令物理地址是: ( 1464:000E ) H。
实验、作业一、寻找最大和最小数实验
一、 实验目的
1、 学习循环程序结构,掌握编写循环处理程序的方法和技巧。
2、 通过循环结构程序熟悉汇编语言程序设计的主要方法。
3、 了解和掌握程序设计过程中算法的选择。
4、 掌握汇编语言调试方法。
二、 实验内容
以buff开始的内存单元中有10个有符号数(字节型DB):
-37、28、-115、-2、98、-100、93、120、56、-99
请编写程序,找出最大的数并存入MAX单元中,同时也找出最小的数并存入MIN单元中,在Debug下运行程序,查看数据区MAX和MIN的内容检验运行结果。
三、 编程提示
1、 在数据段设置buff 区(DB)存放10个被测试的数,再分别设置字节数据MAX、MIN。例如:buff db -37、28、-115、-2、98、-100、93、120、56、-99
MAX db
MIN db
2、通过一个循环程序完成比较,先用第一个数与第二个,把较小的数放在AL中,较大的数放在AH中。
3、以后每次都用AL与后面的数比较,把小的总放在AL中;然后再用AH与后面的数比较,把大的放在AH中;比较结束后AL和AH分别放最小和最大数。
四、 实验步骤
1、 在EDIT或其它编辑方式下输入源程序,并以XXX.ASM名保存。
2、 用MASM 文件汇编源程序,C>MASM XXX; 如有错误,回到第一步,如没错误,到第三步。
3、 用LINK连接程序,C>LINK XXX; 形成XXX.EXE文件。
4、 在DEBUG调试环境下调试并运行XXX.EXE程序。
C>DEBUG XXX.EXE回车
首先用R指令,然后使用U指令查看自己所编写的程序,确定断点后,使用G命令执行程序到断点,查看结果,程序运行结束后,用 D DS:0 检查数据区MAX及MIN内容,检查结果是否正确。
五、 思考
1、 查看DOS操作系统把可执行程序装载到的内存的首地址及结束地址。
2、 查看MAX和MIN的段地址及偏移地址。
3、 分别计算数据段和代码段占用的地址空间大小。
实验、作业二、统计学生成绩
一、 实验目的
1、 熟悉汇编语言各种跳转指令的功能和用法。
2、 学会用程序流程图来分析和设计分支程序。
3、 通过顺序和分支结构来熟悉汇编语言程序设计的主要方法。
4、 了解和掌握程序设计过程中算法的选择。
二、 实验内容
设有20个学生成绩分别56、78、67、40、87、99、63、51、74、100,90,80,68、88、55、66、84、96、45、73分。编写程序实现统计低于60分、60-69分、70-79分、80-89分、90-99分及100分的人数,并分别存放在s5、s6、s7、s8、s9、s10单元中。
三、 实验编程提示
1、 设计实现算法,并画出程序流程图。
2、 定义一数据段,首先定义一变量组存储学生的分数,再定义6个字节变量s5、s6、s7、s8、s9、s10用于统计各分数段的人数。
3、 在代码段中实现程序功能,程序开始应实现初始化存储变量及程序循环次数;并通过比较指令实现判断分支。
四、 实验步骤
1、 在EDIT或其它编辑方式下输入源程序,并以XXX.ASM名保存。
2、 用MASM 文件汇编源程序,C>MASM XXX; 如有错误,回到第一步,如没错误,到第三步.
3、 用LINK连接程序,C>LINK XXX; 形成XXX.EXE文件。
4、 在DEBUG环境下运行调试程序:C> DEBUG XXX.EXE回车,使用U命令反汇编自己编写的程序,查找到断点地址,用G命令使程序执行到完成初始化的功能;此时使用D命令查看数据段的内容,是否有学生的分数并查看s5、s6、s7、s8、s9、s10字节变量的地址及内容。然后查找程序功能结束的命令对应的断点地址,用G命令使程序运行到断点;此时再使用D命令查看存储各分数段的学生人数是否正确。如正确,调试结束;否则,从新单步调试查找错误。再从第一步修改源程序开始。
五、 思考
1、 请问存放学生分数的变量物理地址是什么?
2、 请问各分数段的变量地址是多少?
3、 如果想在屏幕上显示结果将怎样编写下面的程序?
实验、作业三、统计键盘输入字符、数字个数
一、 实验目的
1、 学习循环程序结构,掌握编写循环处理程序的方法和技巧。
2、 通过循环结构程序熟悉汇编语言程序设计的主要方法。
3、 了解和掌握程序设计过程中算法的选择。
4、 掌握汇编语言的调试方法。
二、 实验内容
从键盘输入一系列字符(每种字符不超过9)并以回车符结束,请统计出字母、数字及其它字符的个数,最后在屏幕上显示计数结果。
三、 实验编程提示
1、 在数据段中定义三个字节变量分别存放数字、字符、及其它字符的个数。
2、 在代码段中设计一循环程序接收键盘输入的字符,并在循环程序中判断输入字符的 类型,根据结果计数变量值,循环程序以回车符退出。
3、 提示:MOV AH,1
INT 21H
等待键盘输入,输入字符的ASCII码放在AL寄存器中。
提示:MOV AH,2
INT 21H
在屏幕上显示单个字符,被显示字符的ASCII码放在DL寄存器中。
四、 实验步骤
1、 在EDIT或其它编辑方式下输入源程序,并以XXX.ASM名保存。
2、 用MASM 文件汇编源程序,C>MASM XXX; 如有错误,回到第一步,如没错误,到第三步。
3、 用LINK连接程序,C>LINK XXX; 形成XXX.EXE文件。
4、 运行程序:C> XXX回车,屏幕光标应停在一行的起始位置,并等待键盘输入字符;如输入若干字母和数字字符后,输入回车字符,屏幕上应显示出所统计的字母、数字及其它字符的个数,说明程序运行正确;否则进入调试程序步骤。
调试程序:C>DEBUG XXX.EXE回车
首先用R指令,然后使用U指令查看自己所编写的程序,确定断点后,使用G命令执行程序到断点,查看结果是否正确,不断扩大运行程序的范围直到找到问题。
五、 思考
1、 回车字符的ASCII码是什么?
2、 统计出的数值如何在屏幕上显示出来。如果统计个数超过9时,又将如何处理?
怎样判断输入的是字母、数字及其它字符?
实验、作业四、建立学生名次表
一、 实验目的
1、 学习循环程序结构,掌握编写循环处理程序的方法和技巧。
2、 通过循环结构程序熟悉汇编语言程序设计的主要方法。
3、 了解和掌握程序设计过程中算法的选择。
4、 掌握汇编语言的调试方法。
二、 实验内容
以grade为首地址的10个字的数组中保存了学生的成绩,要求建立10个字的rank数组,并根据grade中的学生成绩将学生名次填入rank数组中。
三、 实验编程提示
1、 在数据段中,先定义一个字数组变量grade,并存入10个学生的分数,然后在定义一个字数组变量rank dw dup (?)用于存放学生的名次 。
2、 一个学生的名次等于成绩高于该学生的人数加1。
3、 可以采用两重循环结构来实现。
4、 内层对应于每个学生的名次计算,在进入内循环之前使用指令mov ax,grade[bx]先把此学生的分数放在ax寄存器中,grade 的首地址放在si,当前被测学生的相对地址指针放在bx;进入循环后可用指令cmp ax,[si]计算此学生的名次,并把名次存入dx中,内循环结束后用mov rank[bx],dx 指令把该学生名次存入。
5、 外循环解决所以学生的名次计算;在退出内循环,并返回外循环之前要add bx,2使之指向下一个被测学生,注意在外循环重新初始化所需寄存器。
四、 实验步骤
1、 在EDIT或其它编辑方式下输入源程序,并以XXX.ASM名保存。
2、 用MASM 文件汇编源程序,C>MASM XXX; 如有错误,回到第一步,如没错误,到第三步。
3、 用LINK连接程序,C>LINK XXX; 形成XXX.EXE文件。
4、 C>debug xxx.exe 回车,用r命令找到第一条指令,再用u命令找到程序结束的断点,再用G命令执行到断点;此时用D命令查看数据段的内容,前10个数据是学生分数,后面就应是所对应名次,如果正确,调试结束;否则分块执行查找错误,直到正确。
五、 思考
1、 内循环和外循环分别用什么指令实现?
请问存放分数、名次的起始地址分别是多少?
实验、作业五、显示ASCII码
一、 实验目的
1、 了解汇编语言子程序的概念。
2、 掌握汇编语言子程序的定义、调用和返回。
3、 掌握设计汇编语言子程序及过程的基本方法。
4、 清楚调用指令CALL及返回指令RET执行时堆栈内容及指针的变化。
5、 掌握子程序和主程序间的参数传递方法(地址表传递参数)。
二、 实验内容
试编写一个有主程序和子程序结构的程序模块。
将两个8位和16位二进制数分别转换为相应二进制数的ascii码。
三、 实验编程提示
1、 主程序提供转换数据的地址、转换后存放ASCII码的首地址共2个参量的地址。
首先在数据段中定义两个变量分别存放8位和16位的数据,再定义一个空变量区用于存放二进制相应的ASCII码,还要定义一个地址表用于存上述地址。
例如: zhu8 db 35h(也可通过键盘输入)
Zhu16 dw 0ab39h(也可通过键盘输入)
Ascbuf db 32 dup(0)
Adr_tab dw 3 dup(0)
2、 主程序再将这两个地址组成一个地址表,并将地址表的首地址为入口参数传递给子程序。
Mov adr_tab,offset zhu8
Mov adr_tab+2,offset zhu16
Mov bx,offset adr_tab
3、 子程序的任务是实现二进制数的ASCII码转换。
4、 子程序可设置两个入口地址:一个为BIN8,转换8位二进制;一个为BIN16,转换16位二进制。
BIN8: MOV DI,[BX]
MOV DH,[DI]; DH取得待转换8位二进制数
而 BIN16: MOV DI,[BX+2]
MOV DX,[DI];DX取得待转换16位二进制数
四、 实验步骤
1、 根据上述算法先画出程序框图。
2、 在EDIT或其它编辑方式下输入源程序,并以XXX.ASM名保存。
3、 用MASM 文件汇编源程序,C>MASM XXX; 如有错误,回到第一步,如没错误,到第三步.
4、 用LINK连接程序,C>LINK XXX; 形成XXX.EXE文件。
5、 运行程序:C> DEBUG XXX.EXE 回车
首先使用R命令,再通过U命令查看反汇编程序找到调用子程序前的断点。G命令执行到断点,D命令看数据段的内容是否正确。
执行CALL BIN8后,查看数据段相应地址是否有8位二进制的ASCII存入。
执行CALL BIN16后,查看数据段相应地址是否有16位二进制的ASCII存入。
如果程序有问题,则在debug环境下查找错误后,回到第一步。
如果想再C>下执行程序,可加入DOS调用显示,看屏幕显示。
6、显示信息可使用DOS调用MOV AH,9;INT 21H;DX存显示信息的偏移地址。
五、 思考
1、 子程序和主程序之间的参数传递是通过什么方式实现的?
2、 在DEBUG环境下观察执行CALL指令时CS、IP寄存器是否变化。
3、 在DEBUG环境下观察执行CALL、RET时堆栈的变化。
实验、作业六、进制之间的转换与显示
一、 实验目的
1、 学习循环程序结构,掌握编写循环处理程序的方法和技巧。
2、 通过循环结构程序熟悉汇编语言程序设计的主要方法。
3、 了解和掌握程序设计过程中算法的选择。
4、 掌握汇编语言的调试方法。
二、 实验内容
编写一汇编语言程序,要求从键盘接收一个四位的十六进制数,并在显示器上显示与之等值的二进制数。
四、 实验编程提示
1、 设计一个循环四次的循环程序来接收键盘输入的四位十六进制数。
2、 使用DOS调用mov ah,1
int 21h接收键盘输入的字符,并把字符的ASCII码转换成相应的数值;注意把输入字符相应的ASCII码变成数时,分两种情况:第一种是处理0-9之间的字符,只需减去30H就变成数;第二种是处理A-F(a-f)的字符,还需分大小写的不同处理。
3、 在接收第二、三、四个字符时,要在前面输入数的基础上乘以10H后加上本次输入的数,因此需一个寄存器或变量存储每次生成的数。
4、 输入结束后,四位十六进制数已存储在某寄存器或变量里,再设计一循环16次的循环程序,在程序中可以通过逻辑左移(还有其它方法)指令使二进制位移入CF标志中,再用JC(JNC)判断CF=0或1。如果CF=1,则DL=31H 通过DOS功能显示“1”;如果CF=0,则DL=30通过DOS功能调用显示“0”。
五、 实验步骤
1、 在EDIT或其它编辑方式下输入源程序,并以XXX.ASM名保存。
2、 用MASM 文件汇编源程序,C>MASM XXX; 如有错误,回到第一步,如没错误,到第三步。
3、 用LINK连接程序,C>LINK XXX; 形成XXX.EXE文件。
4、 运行程序:C> XXX回车,屏幕光标应停在一行的起始位置,并等待键盘输入十六进制字符;如输入四位十六进制后回车,在屏幕上应显示相应的16位二进制,此时说明程序运行正确;否则进入调试程序步骤。
六、 思考
请观察每次输入一位十六进制后,存储变量(或寄存器)的变化。至少想出两种方法显示16位二进制。
- 10 -
展开阅读全文