版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机组成原理及汇编语言计算机组成原理及汇编语言教学大纲教学大纲计算机科学技术系网络技术教研室计算机科学技术系网络技术教研室目目 录录前言前言 大纲说明大纲说明.- 1 -第一部分:理论课大纲第一部分:理论课大纲.- 3 -第一章第一章 计算机系统概论计算机系统概论.- 3 -第二章第二章 运算方法和运算器运算方法和运算器.- 6 -第三章第三章 存储系统存储系统 .- 11 -第四章第四章 8086/8088 寻址方式及指令系统寻址方式及指令系统.- 16 -第五章第五章 中央处理器中央处理器 CPU.- 22 -第六章第六章 汇编程序设计及高级汇编语言技术汇编程序设计及高级汇编语言技术.-
2、 26 -第七章第七章 总线系统总线系统 .- 28 -第八章第八章 输入输入/输出及中断系统输出及中断系统.- 29 -第九章第九章 常用外设及其应用常用外设及其应用.- 32 -第二部分:实践教学大纲第二部分:实践教学大纲.- 33 -第一章第一章 程序的基本结构练习程序的基本结构练习 .- 33 -第二章第二章 程序的基本结构练习程序的基本结构练习 .- 45 -第三章第三章 应用程序设计应用程序设计.- 63 -第三部分:考试大纲第三部分:考试大纲.- 84 -一、一、考核知识点考核知识点.- 84 -二、考核要求二、考核要求.- 85 - 1 -前言前言 大纲说明大纲说明课程名称:计
3、算机组成原理总 学 时:90(理论学时 64,实验课时 26)学 分:6推荐教材:计算机组成原理及汇编语言 ,张思发主编,高等教育出版社,2000 年参 考 书:(1) 计算机组成原理 ,马玉良主编,电子工业出版社,2000 年(2) 计算机组成原理 ,俸远祯主编,电子工业出版社,1999年一、课程的性质与任务计算机组成原理是电子信息工程以及其他各专业必修的一门专业基础课程。本课程主要介绍计算机的基本构成、内部的数据表示方法;运算器、存储器、控制器、输入和输出等各部件的构成,功能及相关算法;最后简单介绍计算机硬件技术的发展趋势。- 2 -二、课程内容、基本要求与学时分配 教教 学学 内内 容容
4、课内学时课内学时实验学时实验学时第一章计算机系统概论22第二章运算方法和运算器82第三章存储系统 42第四章 8086/8088 寻址方式及指令系统10第五章中央处理器 CPU10第六章汇编程序设计及高级汇编语言技术1410第七章总线系统6第八章 输入/输出及中断系统6第九章 常见外设及其应用4总 计6426四、教学方法和教学手段课堂授课采用多媒体教室,按由浅入深、循序渐进、综合练习的学习步骤。通过课堂讲述,使学生对计算机硬件有较全面的认识。五、必要的说明本课程必须安排在第二学年第一学期进行。建议本课程考试权重平时成绩占 30%,其末成绩占 70%。- 3 -第一部分:理论课大纲第一部分:理论
5、课大纲第一章第一章 计算机系统概论计算机系统概论本章目的与要求:本章对计算机的发展、应用和特性进行了概述,并简要地讨论计算机系统的两大组成部分,即硬件系统和软件系统。最后,介绍计算机系统的层次结构模型,以及各部件间的关系,使读者能从整体看局部,从系统看部件,为以后各章的学习建立一个总体概念。第一节 计算机的发展状况1、计算机的发展自从 1946 年 2 月世界上第一台数字电子计算机问世以来,计算机科学和技术获得了日新月异的飞速发展,性能价格比不断降低,应用领域也发函来越广。发展一般可分为五个阶段。2、微处理器的发展微型计算机是第四代计算机的典型代表。构成微机的核心部件是微处理器 MPU,也叫中
6、央处理器或中央处理单元 CPU,简称处理器。30 年来微处理器和微机的发展迅速,几乎每两年微处理器的集成度和性能提高一倍,几乎每 34 年微机就会更新换代一次。第二节 计算机的类别、特点及应用现代科学的发展使不同类型的计算机几乎进入了各个领域,计算机能得到文学的应用是与它的特殊性能相关的。1、计算机的分类- 4 -从不同的角度计算机具有三种分类方法。2、计算机的特点计算机能得到广泛的应用是与它的特殊性能相关的。这些特性是其他工具所不具备的。3、计算机的应用按照计算机加工住处的方式和处理信息的特点,计算机的应用一般分为两大类:数值计算和非数值应用,非数值应用范围已远远超过了数值计算。第三节 计算
7、机系统的组成实际应用的计算机系统是由计算机硬件系统、软件系统以及通信网络系统组成的一个整体系统。硬件与软件的结合,才能使计算机正常运行,发挥作用。因此,对计算机的理解不能仅局限于硬件部分,应该看作一个系统,即计算机系统。计算机系统中,硬件和软件都有各自的组成体系,分别称为硬件系统和软件系统。1、计算机硬件系统计算机硬件系统是指构成计算机的所有实体部件的集合,通常这些部件由电路、机械等物理部件组成。2、计算机软件系统所谓软件是指为运行、维护、管理、应用计算机所编制的所有程序及文档的总和。软件通常分为系统软件和应用软件。3、计算机硬件系统和软件系统的关系软件系统是在硬件系统的基础上,为有效地使用计
8、算机而配置的。- 5 -没有系统软件,现代计算机系统就无法正常地、有效地运行;没有应用软件,计算机就不能发挥效能。第四节 计算机系统结构1、计算机系统的层次结构计算机系统是由硬件与软件系统组成的,硬件系统与软件系统又各自包含许多子系统,因此,计算机系统的结构十分复杂。从功能上看,现代计算机系统可分为 5 个层次级别,每一层都能进行程序设计。2、软件与硬件的逻辑等价性计算机系统的功能由硬件或由软件实现,在逻辑功能上是等价的。也就是说,用硬件实现的功能,在原理上可以用软件实现;用软件实现的功能,在原理上也可以用硬件完成。第五节 8086/8088 宏汇编语言的基础知识1、进位计数制及相互转换凡是用
9、数字符号排列,由低位向高位进位计数的方法叫做进位计数制,简称进位制。数据无论使用哪种进位制,都涉及两个基本要素:基数与各数位的“位权” 。2、Intel 8086/8088 微处理器简微型计算机主要由微处理器、主存储器、外部设备及互联设备组成、总线在各部件之间提供通信。其中,CPU 是它的核心部分,主要由 Intel 8086 微处理器组成,主存储器用来保存程序和数据。3、主存储器和堆栈- 6 -计算机的存储系统由主存储器和辅助存储器组成,存储器是用来存放程序和数据的装置。主存储器的读取规则:“高高低低”规则,即高地址对应高字节,低地址对应低字节。第二章第二章 运算方法和运算器运算方法和运算器
10、教学目的与要求:本章将讨论数据信息在计算机中的表示方法、数据信息加工处理的原理和方法、对数据进行加工处理的部件运算器。计算机中有两类数据信息:数值数据和非数值数据,它们在计算机中都是以二进制编码形式表示的。计算机中主要进行两类基本运算:一类是算术运算,另一类是逻辑运算。第一节 数据与字符的机内表示计算机处理的数据分为两大类:数值数据与非数值数据。本节着重介绍数值与非数值数据在计算机内的表示方式。1、数值数据在机内的表示在选择计算机的数值数的表示方式时,需要考虑以下几个因素:(1)要表示的数的类型(小数、整数、实数和复数) ;(2)可能遇到的数值范围;(3)数值精确度;(4)数据存储和处理所需要
11、的硬件代价。2、非数值数据在机内的表示计算机中数据的概念是广义的,机内除了有数值的信息之外,还有数字、字母、通用符号、控制符号等,字符信息有逻辑信息、图形、图像、语音等信息,这些信息进入计算机都转变成 0、1 表示的- 7 -编码,所以称为非数值数据。第二节 定点加法、减法运算1、补码加法运算补码加法的公式是: x补 +y补=x + y补(mod 2)2、补码减法运算x y补=x补-y补=x补+-y补(mod 2)3、溢出概念及检测方法在计算机中,若采用方定点小数,数的表示范围为|x|.0B3F:0050 04 C7 86 FE FE 00 00 EB-05 90 FF 86 FE FE A1
12、 56 .V0B3F:0060 07 39 86 FE FE 73 7D 8B-9E FE FE D1 E3 D1 E3 8B .9.s.0B3F:0070 87 BE 22 0B 87 C0 22 74-E1 8B 9E FE FE D1 E3 D1 .t.g9 表示从当前 IP(0)所指指令处执行到地址 9 处的指令停下。注意:可执行程序刚被- 41 -Debug 装载入内存时,IP0。此时,数据段寄存器 Ds 的内容变成了 0B3FH,我们的数据段的段地址就是该值,可查看自己定义的 5 个字节数,在这一行内:0B3F:0000 0101 0202 0303 0404 0505 00 00
13、 00-00 00 00 00 00 00 00 00 .对应着源程序,我们不难发现 avg 单元的偏移地址是 0005H(这一点是要理解的吆!) 。好了,到这儿我们已经初步领略了汇编语言程序调试的要点那就是:好了,到这儿我们已经初步领略了汇编语言程序调试的要点那就是:根据需要找出断点、分段执行程序、查看相关内容、比较是否与自根据需要找出断点、分段执行程序、查看相关内容、比较是否与自己设想的内容一致、决定下一步做什么。己设想的内容一致、决定下一步做什么。当前程序执行到什么地方,我们可用 R 命令显示,如下所示:-rAX=0B3F BX=0000 CX=0032 DX=0000 SP=FFFC
14、BP=0000 SI=0000SI=0000 DI=0000DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=0009 NV UP EI PL ZR NA PE NC0B40:0009 8D360000 LEA SI,0000 DS:0000=0201说明下面要执行 LEA SI,0000指令。当前 SI=0000,因为 LEA SI,0000执行后 SI 仍为 0,为了能反映出 SI 的变化,我们先改掉 SI 的值,如下所示:-rsiSI 0000:1234-rAX=0B3F BX=0000 CX=0032 DX=0000 SP=FFFC BP=0000 SI=1234S
15、I=1234 DI=0000DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=0009 NV UP EI PL ZR NA PE NC0B40:0009 8D360000 LEA SI,0000 DS:0000=0201SI 的值修改成了 1234H。 OK! 我们现在可以单步执行一条指令,如下所示:-tAX=0B3F BX=0000 CX=0032 DX=0000 SP=FFFC BP=0000 SI=0000SI=0000 DI=0000DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=000D NV UP EI PL ZR NA PE NC0B40
16、:000D B90500 MOV CX,0005显然,此时 SI 是 0000,下面要执行的指令为 MOV CX,0005。我们当然也可以单步执行 2 条指令,如下所示:-t2AX=0B3F BX=0000 CX=0005CX=0005 DX=0000 SP=FFFC BP=0000 SI=0000 DI=0000DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=0010 NV UP EI PL ZR NA PE NC0B40:0010 B000 MOV AL,00AX=0B0000 BX=0000 CX=0005CX=0005 DX=0000 SP=FFFC BP=000
17、0 SI=0000 DI=0000- 42 -DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=0012 NV UP EI PL ZR NA PE NC0B40:0012 8A14 MOV DL,SI DS:0000=01执行结果是将计数器 CX 赋值为 5,将累加器 AL 清为 0。下面,我们将断点设在 0019H,亦即执行到循环退出,如下所示:-g19AX=0B0F0F BX=0000 CX=0000 DX=0005 SP=FFFC BP=0000 SI=0005 DI=0000DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=0019 NV UP
18、EI PL NZ NA PE NC0B40:0019 98 CBWg19 表示从当前 IP(0012H)所指指令处执行到 CBW指令停下。此时,累加和在 AL中且值为 0FH,与所设想的值 15 一致,说明没有发现程序错误。注意:没有发现错误并不能表示程序一定对。下面把断点放在 0021H 处,执行命令如下:-g21AX=000303 BX=0005 CX=0000 DX=0005 SP=FFFC BP=0000 SI=0005 DI=0000DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=0021 NV UP EI PL NZ NA PE NC0B40:0021 CB
19、RETF至此,平均数已经求出在 AL 中且送到了 avg 内存单元。我们可用 d 命令显示如下:-d00B3F:0000 01 02 03 04 05 0303 00 00-00 00 00 00 00 00 00 00 .0B3F:0010 1E 33 C0 50 B8 3F 0B 8E-D8 8D 36 00 00 B9 05 00 .3.P.?.6.0B3F:0020 B0 00 8A 14 02 C2 46 E2-F9 98 B3 05 F6 FB A2 05 .F.0B3F:0030 00 CB E9 B3 00 89 3E E6-99 C6 06 E8 99 00 80 3E .0
20、B3F:0040 A4 98 01 75 1D E8 57 E3-75 18 50 A0 C6 96 04 41 .u.W.u.P.A0B3F:0050 E8 2E 01 B0 3A E8 29 01-58 89 3E E6 99 C6 06 E8 .:.).X.0B3F:0060 99 00 E8 7E E0 74 06 E8-17 01 AC EB 78 80 3E A4 .t.x.0B3F:0070 98 01 75 03 E8 96 E0 3C-2E 75 09 FE 06 E9 99 C6 .u.0B3F:0040 A4 98 01 75 1D E8 57 E3-75 18 50 A
21、0 C6 96 04 41 .u.W.u.P.A0B3F:0050 E8 2E 01 B0 3A E8 29 01-58 89 3E E6 99 C6 06 E8 .:.).X.- 43 -0B3F:0060 99 00 E8 7E E0 74 06 E8-17 01 AC EB 78 80 3E A4 .t.x.0B3F:0070 98 01 75 03 E8 96 E0 3C-2E 75 09 FE 06 E9 99 C6 .u.0B3F:0040 A4 98 01 75 1D E8 57 E3-75 18 50 A0 C6 96 04 41 .u.W.u.P.A0B3F:0050 E8
22、2E 01 B0 3A E8 29 01-58 89 3E E6 99 C6 06 E8 .:.).X.0B3F:0060 99 00 E8 7E E0 74 06 E8-17 01 AC EB 78 80 3E A4 .t.x.0B3F:0070 98 01 75 03 E8 96 E0 3C-2E 75 09 FE 06 E9 99 C6 .u.0B3F:0040 A4 98 01 75 1D E8 57 E3-75 18 50 A0 C6 96 04 41 .u.W.u.P.A0B3F:0050 E8 2E 01 B0 3A E8 29 01-58 89 3E E6 99 C6 06 E
23、8 .:.).X.0B3F:0060 99 00 E8 7E E0 74 06 E8-17 01 AC EB 78 80 3E A4 .t.x.0B3F:0070 98 01 75 03 E8 96 E0 3C-2E 75 09 FE 06 E9 99 C6 .u.u.Debug 命令 g=9 9 21 表示从代码段内偏移地址为 9 处开始执行程序到偏移地址为 21H 处停下,很明显,此时平均数变成了 2。好了,第二论调试也结束了,仍然没有发现错误。因此,我们得出结论本程序似乎没有问题。该程序的调试工作就此结束。通过这个例子,笔者给出了部分 Debug 命令的使用方法,若读者能掌握它们的基本用
24、法,亦即达到目的。当然,还有一部分命令本示例中并未提及,这需要读者在日后的学习中不断积累,多思多练。- 45 -第二章第二章 程序的基本结构练习程序的基本结构练习21 循环程序设计一、实验目的通过本部分的学习,学生要熟练掌握 Do_While 和 Do_Until 两种循环程序的基本结构;掌握计数方式和条件控制方式等不同的循环控制方法的使用。二、示例例例 2.1 从 buffer 缓冲区中取出字符显示在屏幕上,直到遇到$结束。1.1.流程图流程图见图 2.1图 2.1 例 2.1 的程序框图2.2.程序结构的简要说明程序结构的简要说明本程序分为两个部分:第一步,要在数据段中定义一个缓冲区 bu
25、ffer,并将该缓冲区的首地址赋给地址指针 bx,以便依次取出字符。第二步,根据 bx 依次取出字符显示,直到遇到$结束。这一步是程序的主体,显然它可以使用循环结构。循环的结束条件就是从 bx 指向的内存单元中取出的字符为$。在屏幕上显示字符可使用 DOS 功能调用的 02 号功能。3.3.源程序清单(源程序清单(recurse.asm)见图 2.2;*Data Segment;定义数据段buffer db abcedfghijklmn$Data Ends;*Code Segment;定义代码段开始初始化地址指针 BX根据 BX 取字符到 DL(DL)$?结束YN输出 DL 中的字符- 46
26、-assume cs:Code,ds:Datastart: mov ax, Data;装载数据段 mov ds, ax mov bx, offset buffer;初始化地址指针 BXnext:mov dl, bx;从数据段缓冲区中取出数据放入 DL cmp dl,$;循环判断条件,取出的字符是否结束标志 jz exit;ZF=1,表示是结束标志则返回操作系统结束程序 mov ah,02h;ZF=0,则在屏幕上输出该字符 int 21h inc bx;地址指针加 1 jmp next;取下一个字符exit:mov ax, 4c00h;返回 DOS 操作系统 int 21h Code EndsE
27、nd start;*图 2.2 例 2.1 的程序框图4.4.调试过程调试过程我们首先用 Debug 进行调试,格式如下:E:masmdebug recurse.exeDebug 以-应答,表示已进入调试状态。首先进行反汇编,命令各式如下:-u0B3B:0000 B83A0B MOV AX,0B3A0B3B:0003 8ED8 MOV DS,AX0B3B:0005 BB0000 MOV BX,00000B3B:0008 8A17 MOV DL,BX0B3B:000A 80FA24 CMP DL,240B3B:000D 7407 JZ 00160B3B:000F B402 MOV AH,020B
28、3B:0011 CD21 INT 210B3B:0013 43 INC BX0B3B:0014 EBF2 JMP 00080B3B:0016 B8004C MOV AX,4C000B3B:00190019 CD21 INT 210B3B:001B 3C2A CMP AL,2A0B3B:001D 7530 JNZ 004F0B3B:001F 80CF02 OR BH,02- 47 -我们发现,当程序执行到 0B3B:00190019 CD21 INT 21 指令时,程序便执行结束返回到 DOS 系统。我们可以将断点设置在 0019h,这样程序一旦执行至此,应该可以看出程序的执行结果。这种方法是从
29、总体上有一个大概的认识,发现问题后再逐步调试。好了,我们用如下命令:-g 1919abcedfghijklmn程序执行结果正确。如果你的程序一上来就能执行正确,说明的基本功很不错,那我可要恭喜你了。下面,我们再尝试着从头执行程序,看逐步输出的结果。如何从头执行呢?有两个办法,修改 IP 或用 g 命令的加起始地址的命令格式。我们选择前者,命令如下:-ripIP 0019:0 0表示将 IP 的值由 0019 改成 0,使得 IP 指向程序的第一条指令。我们可看一下:-rAX=0BE0 BX=0000 CX=002B DX=0061 SP=0000 BP=0000 SI=0000 DI=0000
30、DS=0BE0 ES=0BD0 SS=0BE0 CS=0BE1 IP=0000 NV UP EI PL NZ AC PO NC0BE1:0000 B8E00B MOV AX,0BE0单步执行两条语句,装入数据段。命令如下:-t 2AX=0B3A BX=0000 CX=002B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=0B2A ES=0B2A SS=0B3A CS=0B3B IP=0003 NV UP EI PL NZ NA PO NC0B3B:0003 8ED8 MOV DS,AXAX=0B3A BX=0000 CX=002B DX=0000 SP=
31、0000 BP=0000 SI=0000 DI=0000DS=0B3A ES=0B2A SS=0B3A CS=0B3B IP=0005 NV UP EI PL NZ NA PO NC0B3B:0005 BB0000 MOV BX,0000此时,通过 d 命令可显示数据段中的数据,如下命令所示:-d ds:00B3A:0000 6161 6262 6363 6565 6464 6666 6767 68-6968-69 6A6A 6B6B 6C6C 6D6D 6E6E 2424 00 abcedfghijklmn$abcedfghijklmn$.0B3A:0010 B8 3A 0B 8E D8 B
32、B 00 00-8A 17 80 FA 24 74 07 B4 .:.$t.0B3A:0020 02 CD 21 43 EB F2 B8 00-4C CD 21 3C 2A 75 30 80 .!C.L.!.u.$.x.0B3A:0040 3E E9 99 00 74 02 B4 02-B0 3F 2A 26 E8 99 72 EB .t.?*&.r.- 48 -0B3A:0050 86 E1 E3 09 86 E1 E8 C8-00 86 E1 E2 F7 86 E1 E8 .0B3A:0060 DD E2 75 21 80 CF 04 80-3E 22 9A 00 74 05 F6
33、 C7 .u!.t.0B3A:0070 02 75 48 89 3E E6 99 FF-06 E6 99 C6 06 E8 99 FF .uH.这里须注意的是:只有装载了 DS 段寄存器后,才能看到自己定义的数据、再进行访问。继续运行到比较处,看取出的字符是否是结束字符$ 。 命令如下:-t 3AX=0B3A BX=0000 CX=002B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=0B3A ES=0B2A SS=0B3A CS=0B3B IP=0008 NV UP EI PL NZ NA PO NC0B3B:0008 8A17 MOV DL,BX D
34、S:0000=61AX=0B3A BX=0000 CX=002B DX=0061 SP=0000 BP=0000 SI=0000 DI=0000DS=0B3A ES=0B2A SS=0B3A CS=0B3B IP=000A NV UP EI PL NZ NA PO NC0B3B:000A 80FA24 CMP DL,24AX=0B3A BX=0000 CX=002B DX=0061 SP=0000 BP=0000 SI=0000 DI=0000DS=0B3A ES=0B2A SS=0B3A CS=0B3B IP=000D NV UP EI PL NZ AC PO NC0B3B:000D 740
35、7 JZ 0016观察标志位 ZF 是否为 1?如果为 1 则调转到偏移地址为 0016H 处执行程序,即返回操作系统。结果为 NZ,即 ZF=0,则继续向下顺序执行程序。-tAX=0B3A BX=0000 CX=002B DX=0061 SP=0000 BP=0000 SI=0000 DI=0000DS=0B3A ES=0B2A SS=0B3A CS=0B3B IP=000F NV UP EI PL NZ AC PO NC0B3B:000F B402 MOV AH,02设置断点到 0008H,观察第一次的字符输出结果,命令格式如下:-g 008a aAX=0261 BX=0001 CX=00
36、2B DX=0061 SP=0000 BP=0000 SI=0000 DI=0000DS=0B3A ES=0B2A SS=0B3A CS=0B3B IP=0008 NV UP EI PL NZ NA PO NC0B3B:0008 8A17 MOV DL,BX DS:0001=62输出的第一个字符为 a。单步执行一条指令,再重新设置断点到 0008H,以观察第二次的字符输出结果,命令格式如下:-t- 49 -AX=0261 BX=0001 CX=002B DX=0062 SP=0000 BP=0000 SI=0000 DI=0000DS=0B3A ES=0B2A SS=0B3A CS=0B3B
37、IP=000A NV UP EI PL NZ NA PO NC0B3B:000A 80FA24 CMP DL,24-g 008b bAX=0262 BX=0002 CX=002B DX=0062 SP=0000 BP=0000 SI=0000 DI=0000DS=0B3A ES=0B2A SS=0B3A CS=0B3B IP=0008 NV UP EI PL NZ NA PO NC0B3B:0008 8A17 MOV DL,BX DS:0002=63单步执行一条指令,再重新设置断点到 0008H,以观察第三次的字符输出结果,命令格式如下:-tAX=0262 BX=0002 CX=002B DX
38、=0063 SP=0000 BP=0000 SI=0000 DI=0000DS=0B3A ES=0B2A SS=0B3A CS=0B3B IP=000A NV UP EI PL NZ NA PO NC0B3B:000A 80FA24 CMP DL,24-g008c cAX=0263 BX=0003 CX=002B DX=0063 SP=0000 BP=0000 SI=0000 DI=0000DS=0B3A ES=0B2A SS=0B3A CS=0B3B IP=0008 NV UP EI PL NZ NA PE NC0B3B:0008 8A17 MOV DL,BX DS:0003=65可通过 e
39、 命令修改内存单元中预先定义的字符,如将 ds 段中偏移地址为 0003 处的e字符改为2字符,命令格式如下:-e 0003 22单步执行一条指令,再重新设置断点到 0008H,以观察第四次的字符输出结果。命令格式如下:-tAX=0263 BX=0003 CX=002B DX=0032 SP=0000 BP=0000 SI=0000 DI=0000DS=0B3A ES=0B2A SS=0B3A CS=0B3B IP=000A NV UP EI PL NZ NA PE NC0B3B:000A 80FA24 CMP DL,24-g 0082 2AX=0232 BX=0004 CX=002B DX=
40、0032 SP=0000 BP=0000 SI=0000 DI=0000DS=0B3A ES=0B2A SS=0B3A CS=0B3B IP=0008 NV UP EI PL NZ NA PO NC0B3B:0008 8A17 MOV DL,BX DS:0004=64发现输出的字符为2 ,而是刚开始装入的字符为e。- 50 -使用 d 命令观察内存,发现在内存中原先的字符e变成了字符2 。-d ds:00B3A:0000 61 62 63 3232 64 66 67 68-69 6A 6B 6C 6D 6E 24 00 abc2 2dfghijklmn$.0B3A:0010 B8 3A 0B
41、8E D8 BB 00 00-8A 17 80 FA 24 74 07 B4 .:.$t.0B3A:0020 02 CD 21 43 EB F2 B8 00-4C CD 21 3C 2A 75 30 80 .!C.L.!.u.$.x.0B3A:0040 3E E9 99 00 74 02 B4 02-B0 3F 2A 26 E8 99 72 EB .t.?*&.r.0B3A:0050 86 E1 E3 09 86 E1 E8 C8-00 86 E1 E2 F7 86 E1 E8 .0B3A:0060 DD E2 75 21 80 CF 04 80-3E 22 9A 00 74 05 F
42、6 C7 .u!.t.0B3A:0070 02 75 48 89 3E E6 99 FF-06 E6 99 C6 06 E8 99 FF .uH.通过 g 命令输出剩余的所有字符。-g 19dfghijklmn因为该程序的运行结果是送往显示器的,所以可在 Dos 命令行执行,格式如下: E:masm recurse.exeabcedfghijklmnE:masm至此,整个调试过程结束。三、实验题实验实验 1求最大值1.题目题目在 buffer 缓冲区中存放 10 个数,从中选择最大的数放入 ax 寄存器中。2.提示提示定义的数可以是正数也可以是负数。可用 CX 寄存器存放计数初值,然后用 LO
43、OP指令进行循环。实验实验 2用表格形式显示字符1.题目题目按 15 行16 列的表格形式现显示 ASCII 码为 10h100h 的所有字符,以 ASCII 码递增的次序依次显示对应的字符。每 16 个字符为一行,字符之间以空白符(ASCII为 0)隔开。2.提示提示显示每个字符可使用功能号为 02h 的显示输出功能调用,方法如下:- 51 -movah,02hmovdl,输出字符的 ASCII 码值int21h可把 dl 初始化为 10h,不断加 1 进行输出。显示空白符、回车和换行时,将其其对应的 ASCII 码值 00h、0dh 和 0ah 置入 dl寄存器中进行输出。由于逐个显示相继
44、的 ASCII 字符时,需要保存并不断修改 dl 寄存器的内容,而显示空白、回车换行时也需要使用 dl,为此可是使用堆栈来保存相继的ASCII 字符。方法是:在显示空白、回车换行前用如下指令:pushdx把 dl 中的内容保存到堆栈中,在显示空白、回车换行后用如下指令:popdx恢复 dl 中的原始内容。实验实验 3建立学生名次表 rank1.题目题目以 grade 为首地址的 10 个字的数组中保存了学生的成绩,其中 grade +i 保存学号为i+1 的学生的成绩。要求建立一个 10 个字的 rank 数组,并根据 grade 中的学生成绩将学生名次填入 rank 数组中,其中 rank+
45、i 的内容是学号为 i+1 学生的名次。2.提示提示一个学生的名次等于成绩高于该学生的人数加 1。22 分支程序设计一、实验目的分支程序是汇编语言中另一个重要的程序结构,通过本部分的实验,要熟练掌握分支程序的编写以及调试方法。二、示例例例 2.2 编写一个分支程序,实现如下的符号函数: 1(X0)Y = 0 (X=0) -1(X0) 其中变量 X 和 Y 均为字节变量存放在数据段的存储单元中。1.程序结构的简要说明程序结构的简要说明这一题目的算法很简单,采用简单的分支结构,关键是要正确选择有符号数比较转移指令,应该从这一组中选取:jg、jge、jl、jle。流程图如图 2.3 所示,源程序清单
46、如图 2.4 所示。2.流程图流程图(AL)=0?装载DSYNYNALXY0Y1Y1开 始(AL)0?结 束- 52 - 图 2.3 例 2.2 的程序框图3.3.程序清单程序清单(compare.asm);*data segment;定义数据段x db 12y db ?data ends;*code segment;定义代码段assume cs:code,ds:datastart: mov ax ,datamov ds ,ax ;装载 DSmov al ,x ;X 的值放入 AL 寄存器cmp al ,0 ;AL 和 0 相比jge largeequ ;AL 大于等于 0 就跳转到 larg
47、eequ 分支mov y ,-1 ;AL 小于 0,y=-1jmp exit ;跳转到程序结束largeequ:cmp al ,0 ;AL 和 0 相比jne large ;AL 不等于 0 就跳转到 large 分支mov y ,0 ;AL 等于 0,y0jmp exit ;跳转到程序结束large: mov y ,1 ;AL 大于 0,y1exit: mov ah ,4chint 21h ;返回 DOScode ends;*end start;程序结束 图 2.4 例 2.2 的源程序- 53 -4.调试及运行调试及运行本程序的运行结果在内存中,所以只能通过 Debug 装载调试。装载命令
48、如下:E:masm debug compare.exe-表示已进入 Debug 调试状态,首先反汇编获取调试信息,命令格式如下:-u0B40:0000 B83F0B MOV AX,0B3F0B40:0003 8ED8 MOV DS,AX0B40:0005 A00000 MOV AL,00000B40:0008 3C00 CMP AL,000B40:000A 7D08 JGE 00140B40:000C C6060100FF MOV BYTE PTR 0001,FF0B40:0011 EB12 JMP 00250B40:0013 90 NOP0B40:0014 3C00 CMP AL,000B4
49、0:0016 7508 JNZ 00200B40:0018 C606010000 MOV BYTE PTR 0001,000B40:001D EB06 JMP 00250B40:001F 90 NOP为了能看到我们定义的数,把断点设置在 0005 执行程序,格式如下:-g5AX=0B3F BX=0000 CX=0039 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=0005 NV UP EI PL NZ NA PO NC0B40:0005 A00000 MOV AL,0000 DS:0000=
50、0Cg5 表示从当前 IP 所指指令处执行直到偏移地址 5 所指指令处停下。注意:刚进入 Debug状态时,IP 为 0,即 IP 指向读一条指令。通过 d 命令显示定义的原始数据,命令格式如下:-d00B3F:0000 0C0C 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .0B3F:0010 B8 3F 0B 8E D8 A0 00 00-3C 00 7D 08 C6 06 01 00 .?.0B3F:0020 FF EB 12 90 3C 00 75 08-C6 06 01 00 00 EB 06 90 .0B3F:0050 04 C7 86
51、 FE FE 00 00 EB-05 90 FF 86 FE FE A1 56 .V0B3F:0060 07 39 86 FE FE 73 7D 8B-9E FE FE D1 E3 D1 E3 8B .9.s.0B3F:0070 87 BE 22 0B 87 C0 22 74-E1 8B 9E FE FE D1 E3 D1 .t.0Ch 即是我们定义的数 12,它在 DS 段内的偏移地址为 0000h 的单元中。下面单步执行 2 条指令,命令格式如下:-t2- 54 -AX=0B0C BX=0000 CX=0039 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
52、DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=0008 NV UP EI PL NZ NA PO NC0B40:0008 3C00 CMP AL,00AX=0B0C BX=0000 CX=0039 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=000A NV UP EI PL NZ NA PE NC0B40:000A 7D08 JGE 0014此时已经比较完毕,下面根据比较的结果执行 JGE 0014 ,决定是否转移。很明显12 大于 0,所以会发生转移。我们单步执行一
53、条指令以验证是否转移,命令格式如下:-tAX=0B0C BX=0000 CX=0039 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=0014 NV UP EI PL NZ NA PE NC0B40:00140014 3C00 CMP AL,00已执行到 0014h 处的指令,确实发生了转移。下面的程序是再与 0 作比较,连续单步执行2 条指令,命令格式如下:-tAX=0B0C BX=0000 CX=0039 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=
54、0B3F ES=0B2F SS=0B3F CS=0B40 IP=0016 NV UP EI PL NZ NA PE NC0B40:0016 7508 JNZ 0020-tAX=0B0C BX=0000 CX=0039 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=0020 NV UP EI PL NZ NA PE NC0B40:0020 C606010001 MOVMOV BYTEBYTE PTRPTR 0001,010001,01 DS:0001=00结果说明 12 大于 0,下面准备执行对
55、 y 的赋值操作,亦即要执行 MOV BYTE PTR 0001,01我们能知道 y 在 ds 段内的偏移地址为 0001h。我们先看一下 y 赋值前的值,格式如下:-d00B3F:0000 0C 0000 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .0B3F:0010 B8 3F 0B 8E D8 A0 00 00-3C 00 7D 08 C6 06 01 00 .?.0B3F:0020 FF EB 12 90 3C 00 75 08-C6 06 01 00 00 EB 06 90 .0B3F:0050 04 C7 86 FE FE 00 00 EB
56、-05 90 FF 86 FE FE A1 56 .V0B3F:0060 07 39 86 FE FE 73 7D 8B-9E FE FE D1 E3 D1 E3 8B .9.s.0B3F:0070 87 BE 22 0B 87 C0 22 74-E1 8B 9E FE FE D1 E3 D1 .t.此时,y 的值为 00h,这是系统中本来就有的值。好了,现在单步执行一条指令,格式如下:- 55 -tAX=0B0C BX=0000 CX=0039 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=0B3F ES=0B2F SS=0B3F CS=0B40 IP=
57、0025 NV UP EI PL NZ NA PE NC0B40:0025 B44C MOV AH,4C已经执行完赋值操作,可查看 y 的值,命令格式如下:-d00B3F:0000 0C 0101 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .0B3F:0010 B8 3F 0B 8E D8 A0 00 00-3C 00 7D 08 C6 06 01 00 .?.0B3F:0020 FF EB 12 90 3C 00 75 08-C6 06 01 00 00 EB 06 90 .0B3F:0050 04 C7 86 FE FE 00 00 EB-05 9
58、0 FF 86 FE FE A1 56 .V0B3F:0060 07 39 86 FE FE 73 7D 8B-9E FE FE D1 E3 D1 E3 8B .9.s.0B3F:0070 87 BE 22 0B 87 C0 22 74-E1 8B 9E FE FE D1 E3 D1 .t.y 的值由 0 变成了 1。至此,本轮调试完毕,结果正确。我们可再从头反汇编一下,命令格式如下:-u00B40:0000 B83F0B MOV AX,0B3F0B40:0003 8ED8 MOV DS,AX0B40:0005 A00000 MOV AL,00000B40:0008 3C00 CMP AL,0
59、00B40:000A 7D08 JGE 00140B40:000C C6060100FF MOV BYTE PTR 0001,FF0B40:0011 EB12 JMP 00250B40:0013 90 NOP0B40:0014 3C00 CMP AL,000B40:0016 7508 JNZ 00200B40:0018 C606010000 MOV BYTE PTR 0001,000B40:001D EB06 JMP 00250B40:001F 90 NOP用 d 命令显示当前 ds 段内的数据,命令格式如下:-d00B3F:0000 0C0C 0101 00 00 00 00 00 00-0
60、0 00 00 00 00 00 00 00 .0B3F:0010 B8 3F 0B 8E D8 A0 00 00-3C 00 7D 08 C6 06 01 00 .?.0B3F:0020 FF EB 12 90 3C 00 75 08-C6 06 01 00 00 EB 06 90 .0B3F:0050 04 C7 86 FE FE 00 00 EB-05 90 FF 86 FE FE A1 56 .V0B3F:0060 07 39 86 FE FE 73 7D 8B-9E FE FE D1 E3 D1 E3 8B .9.s.0B3F:0070 87 BE 22 0B 87 C0 22 74-E1 8B 9
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度首付分期购房借款合同范本规定6篇
- 年度线性低密度聚乙烯产业分析报告
- 年度吸污车产业分析报告
- 2025年度楼房建筑工程合同纠纷解决协议4篇
- 二零二四年养老社区三方物业服务委托合同文本3篇
- 二零二五年度船舶租赁船运输协议合同3篇
- 二零二五年酒店客房家具更新换代合同3篇
- 2025年度智能交通信号系统安装与维护承包协议合同范本3篇
- 二零二五版教育培训机构合同标的课程开发与教学质量承诺3篇
- 2025年度生物质能发电项目合作协议合同范本
- GB/T 33688-2017选煤磁选设备工艺效果评定方法
- GB/T 304.3-2002关节轴承配合
- 漆画漆艺 第三章
- CB/T 615-1995船底吸入格栅
- 光伏逆变器一课件
- 货物供应、运输、包装说明方案
- (完整版)英语高频词汇800词
- 《基础马来语》课程标准(高职)
- IEC61850研讨交流之四-服务影射
- 《儿科学》新生儿窒息课件
- 材料力学压杆稳定
评论
0/150
提交评论