1、微机原理及接口技术实验指导书福建工程学院计算机与信息科学系计算机系统结构教研室实验操作指导一、汇编语言程序上机操作1软件将包含EDIT(文本编辑器)、MASM(宏汇编程序)、LINK(连接程序)、DEBUG(调试程序)等软件的文件夹存放在计算机的D盘中masm目录中(或其它),免安装。2程序实例,以下的操作以下列程序的调试为例进行说明,该程序在屏幕上输出字符串“Hello World !”DATA SEGMENTSTR DB Hello World !$DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOVAX,DATA MOV DS,AX
2、MOV AH,09H MOV DX,OFFSET STR INT 21H MOV AH,4CH INT 21HCODE ENDS ENDSTART3上机操作(1)进入DOS。点击“开始”“运行”,输入命令“cmd”后单击“确定”进入DOS。(2)依次输入“d: 8”和“cd masm 8”进入masm目录。(3)编辑源程序。启动文本编辑器edit(也可以用记事本编辑源程序),文件名也可以在编辑完成时保存文件时输入,记住以.asm为后缀,此例文件名为t1_2.asm。按汇编语言程序格式要求编辑源程序并保存。(4)汇编按(1)、(2)操作另外打开一个窗口,然后输入命令“masm t1_2 8”进行
3、汇编,过程的对话信息直接回车即可。若源程序有错误,则会提示错误位置和错误信息。警告错误严重错误直接回车出错位置、代码、信息光标所在位置(行、列)修改第7行的“A”为“AX”,保存后再汇编。表示汇编成功汇编成功,则在d:/masm/下生成目标文件t1_2.obj 。说明:aMASM汇编程序的主要功能有以下3点:(1)检查源程序中存在的语法错误,并给出错误信息。(2)源程序经汇编后没有错误,则产生目标程序文件,扩展名为.OBJ。(3)若程序中使用了宏指令,则汇编程序将展开宏指令。汇编过程的错误分警告错误(Warning Errors)和严重错误(Severe Errors)两种。其中警告错误是指汇
4、编程序认为的一般性错误;严重错误是指汇编程序认为无法进行正确汇编的错误,并给出错误的个数、错误的性质。这时,就要对错误进行分析,找出原因和问题,然后再调用屏幕编辑程序(EDIT)加以修改,修改以后再重新汇编,一直到汇编无错误为止。b经汇编以后产生的目标程序文件(.OBJ文件)并不是可执行程序文件,必须经过连接以后,才能成为可执行文件(即扩展名为.EXE)。如果连接过程中出现错误,则显示出错误信息,根据提示的错误原因,要重新调入编辑程序加以修改,然后重新汇编,再经过连接,直到没有错误为止。连接以后,便可以产生可执行程序文件(.EXE文件)。(5)连接输入命令“link t1_2 8”进行连接,过
5、程的对话信息直接回车即可,连接成功,则在d:/masm/下生成可执行文件t1_2.exe。直接回车该警告信息可忽略(6)运行输入“t1_2 8”执行程序。显示内容二、DEBUG的使用DEBUG是一个DOS实用程序,可供程序员进行汇编语言程序的调试和分析,可以检查和修改寄存器、内存的内容;可以用于逐指令执行某个程序以验证程序运行的正确性,也可以追踪执行过程、比较一个指令执行前后的值以及比较与移动内存中一定范围的数据,读写文件与磁盘扇区。每个功能都用一个字符命令来实现,地址和数据均默认采用十六进制,输入时不用进制符号“H”。当需要输入地址参数的命令,地址格式为 ,如果没有输入地址,DEBUG将假定
6、为当前地址。命令大小写均可。(一)DEBUG常用命令(其它命令及具体操作请查阅相关资料)1.进入与退出DEBUG在DOS状态下输入DEBUG 8进入DEBUG,命令Q退出。DEBUG的命令提示符 “-”2.A ;汇编命令。将指令直接汇编成机器码输入到内存中。address指定键入汇编语言指令的位置。对 address 使用十六进制值,并键入不以“H”字符结尾的每个值。如果不指定地址,A将在它上次停止处开始汇编。【例】 -a 0100 08F1:0100 MOV AH,09 08F1:0102 MOV DX,109 08F1:0105 INT 2108F1:0107 INT 2008F1:010
7、9 db THIS IS AN EXAMPLE !$ 08F1:0115 8;离开a状态 -g 8 ;运行 THIS IS AN EXAMPLE !;运行结果 Program terminated normally;程序正常结束,表示运行正常3. C range address;比较命令。比较两内存区域中的内容是否相同,若不同则显示其地址和内容。 range 指定要比较的内存第一个区域的起始和结束地址,或起始地址和长度。 address 指定要比较的第二个内存区域的起始地址。【例】-C 4000:0 3F 100 就是用来比较4000;0000-4000:003F与DS:0100-DS:013
8、F之间的内容,其显示格式如下: 内存地址1(段地址:偏移地址) 内含值1 内含值2 内存地址2 如果要比较的范围在DS内,则段地址不必指出: 【例】-C 0 4 100;比较DS:0-DS:4与DS:100-DS:104 C命令的另一种格式如下:C 地址1 L长度 地址2 【例】-C000:0 L4 0;由0000:0与DS:0开始比较它同-C0000:0 3 0命令相等,显示结果如下: 0000:0000 8A C0 08F1:0000 0000:0001 10 20 08F1:0001 ;它们都比较4个字节 0000:0002 1C 00 08F1:0002 0000:0003 49 7F
9、 08F1:0003 4. D ;显示内存内容。参数range 指定要显示其内容的内存区域的起始和结束地址,或起始地址和长度。如果不指定 range,Debug 程序将从以前D命令中所指定的地址范围的末尾开始显示 128 个字节的内容。 当使用 D命令时,Debug 以两个部分显示内存内容:十六进制部分(每个字节的值都用十六进制格式表示)和 ASCII 码部分(每个字节的值都用 ASCII 码字符表示)。每个非打印字符在显示的 ASCII 部分由“.” 表示。每个显示行显示 16 字节的内容,第 8 字节和第 9 字节之间有一个连字符。每个显示行从 16 字节的边界上开始。 【例】ASCII码
10、部分十六进制部分5. E range list ;修改内存命令。从指定的地址开始修改内存值。 成批修改单个修改6. F range list ;填充命令。使用指定的值填充指定内存区域中的地址。 可以指定十六进制或 ASCII 格式表示的数据。任何以前存储在指定位置的数据将会丢失。 参数 range 指定要填充内存区域的起始和结束地址,或起始地址和长度。list 指定要输入的数据。list 可以由十六进制数或引号包括起来的字符串组成。【例】7. G ;执行命令。执行正在调试的程序,当达到断点时停止执行,并且显示寄存器标志和下一条要执行的命令。如果没有指定起始地址,那么当前指令地址由CS、IP寄存
11、器的内容来决定,如果用户指定起始地址就从指定的起始地址开始执行。如果指定断点,当指令到达指令地址时停止执行,并显示各寄存器标志位的内容和下一条要执行的命令,最多允许用户设定10个断点。8. H value1 value2 ;十六进制算术运算命令。分别显示两个十六进制数相加的和以及第一个数减去第二个数的差,替用户完成简单的十六进制数的运算。参数value1 代表从 0 到 FFFFh 范围内的任何十六进制数字。 value2 代表从 0 到 FFFFh 范围内第二个十六进制数字。 Debug 首先将指定的两个参数相加,然后从第一个参数中减去第二个参数。这些计算的结果显示在一行中:先计算和,然后计
12、算差。 9. I port ;输入。从指定的端口读取并显示一个字节值。参数 port 按地址指定输入端口。地址可以是 16 位的值。10. L ;装载。将一个文件或盘的绝对扇区装入存储器。11. M range address ;移动。将一个内存块中的内容复制到另一个内存块中。 参数 range 指定要复制内容的内存区域的起始和结束地址,或起始地址和长度。 address 指定要将 range 内容复制到该位置的起始地址。 复制操作对现有数据的影响。如果新数据没有写入正在被复制的数据块中的地址,则源数据将保持不变。但是,如果目标块已经包含数据(就象它在覆盖副本操作中一样),则将改写该数据。(覆
13、盖复制操作是指那些目标数据块部分内容覆盖原数据块部分内容的操作。) 执行覆盖复制操作。M 命令执行目标地址的覆盖复制操作,而不丢失数据。将改写的地址内容首先复制。因此,如果将较高位地址的数据复制到较低位地址,则复制操作从原块的最低位地址开始并向最高位地址进行。反之,如果要将数据从低地址复制到高地址,复制操作从原块的最高地址开始,向最低地址进行。12. N filename ;定义文件名。 指定 Debug L(加载)或 W(写入)命令的可执行文件的名称,或者指定正在调试的可执行文件的参数。 13. O port byte-value ;输出。将字节值发送到输出端口。参数 port 通过地址指定
14、输出端口,端口地址可以是 16 位值。 参数byte-value 指定要指向 port 的字节值。14. Q ;退出。停止 Debug 会话,不保存当前测试的文件,控制返回到 DOS 的命令提示符。15. R ;显示、修改寄存器内容。显示或改变一个或多个 CPU 寄存器的内容。 如果在没有参数的情况下使用,则 R 命令显示所有寄存器的内容以及标志寄存器中的标志。 register-name 的有效值:ax、bx、cx、dx、sp、bp、si、di、ds、es、ss、cs、ip、pc 及 f。ip 和 pc 都引用指令指针。 如果指定寄存器名称,而不是从前面的列表中指定,将显示: br erro
15、r 。使用 f 字符而不是寄存器名如果键入 f 字符代替寄存器名,Debug 将每个标记的当前设置显示为两字母代码,然后显示 Debug 提示符。要更改标志的设置,请从下表中键入适当的两字母代码:状态标志位状态显示形式溢出标志OF有/无OV/NV方向标志DF减/增DN/UP中断标志IF开/关EI/DI符号标志SF负/正NG/PL零标志ZF零/非零ZR/NZ奇偶标志PF偶/奇PE/PO进位标志CF有/无CY/NC辅助进位标志AF有/无AC/NA16. T ;跟踪命令。逐条跟踪程序的执行,每条指令执行后都将显示各寄存器的内容。通常采用跟踪一条指令,但用户也可以用指令条数设定一次跟踪多条指令,每执行
16、一条指令之后,显示所有寄存器的内容和标志状态。如未指定地址则从当前CS:IP开始执行。17. U ;反汇编。反汇编字节并显示相应的原语句,其中包括地址和字节值。参数range 指定要反汇编代码的起始地址和结束地址,或起始地址和长度。如果在没有参数的情况下使用,则 U 命令反汇编 20H(32)个字节(默认值),从前面U命令所显示地址后的第一个地址开始。 18. W 地址 ;写盘命令。将修改过的数据写到磁盘上。可以将指定内存地址开始的数据写在磁盘上,可以在没有指定参数,或指定地址参数的情况下,将调试文件写在磁盘上。在运行W时需设置文件的大小存入BX和CX寄存器。(二)DEBUG的基本操作下面通过
17、汇编语言程序调试的例子,综合上述命令的应用。1.在DEBUG下直接输入程序、设置参数、运行程序,适合于简单程序的调试。【例】要将DS:2000H开始的2个数相加,并将结果送入DS:2002H单元。程序段如下:MOV SI,2000HMOV AL,SIINC SIADD AL,SI INC SIMOV SI,ALINT 20H;在DEBUG下,用INT 20结束(1)用A-汇编命令(使用默认地址,不输入参数)输入程序并保存;输入程序,出错则重新输入。存盘:用N命令定义文件名;用R命令修改BX、CX值,设置文件大小,该值为机器码长度(BX=0,不用修改);用W命令写入。定义文件名时没有加参数,因为
18、这里的操作都是在路径D:MASM下进行的,则文件存放在MASM目录下,可以在WINDOWS的资源管理器下查看该文件。可以尝试退出DEBUG,然后重新进入,用L命令装载程序,然后用反汇编命令U显示程序。也可以在DOS状态下直接输入DEBUG 直接装载文件。2)用R、D、E等命令查看和设置相关寄存器和存储单元的内容。本例要实现DS:2000H、DS:2001H相加,在这里设置两个单元的内容分别为49H、3CH,并且可以看出与程序运行相关的寄存器如AL、SI的初值,等下可以通过观察它们的变化情况,检查程序的运行是否正确。(3)用T、G命令运行程序,检查结果。 T为跟踪命令,逐条执行指令,并显示中间结
19、果。注意:T命令可以加上不同参数;执行到“INT 20”前就停止。存储单元寄存器结果下一条指令 G为运行命令,可以连续运行程序,也可以设置断点运行。检查结果程序正常结束;重新设置单元内容验证;设置断点运行断点前指令执行结果G、T命令可以交叉应用,程序执行的过程也可以去检查、设置相关寄存器、存储单元内容,但要记住重新使用G、T命令时应清楚当前的CS:IP值。2.利用“汇编语言程序上机操作”的方法,生成可执行文件,然后在DEBUG下装载程序、设置参数、运行程序,适合于简单程序的调试。【例】将内存单元BUF开始的三个数相加,结果存入SUM单元。DATA SEGMENT BUF DB 34H,6AH,
20、2CH SUM DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX LEA SI,BUF MOV AL,SI INC SI ADD AL,SI INC SI ADD AL,SI MOV SUM,AL MOV AH,4CH INT 21H CODE ENDS END START(1)利用“汇编语言程序上机操作”的方法,生成可执行文件,假设文件名为T2.EXE;(2)进入DEBUG,装载文件;汇编语言源程序经过汇编、连接后,伪指令就失去作用,DEBUG装载的都是可执行指令,但是,大家一定要清楚
21、它与源程序的对应关系,才能确切知道程序运行所需的数据及结果存放的位置。由下图3个箭头对应的指令,可以知道:系统安排的数据段地址DS=1444H;变量BUF的有效地址是0000H;变量SUM的有效地址是0003H。而变量BUF之后由DB伪指令定义的三个数据已经在1444:0000H开始的三个单元中,可以用命令D查看。(3)运行程序,检查结果。理解了(2)的内容,接下来调试程序的方法与“在DEBUG下直接输入程序、设置参数、运行程序”的方法相同。 T命令。可通过运行的中间结果逐条检查程序是否正确。 G命令;结果可以通过E命令直接修改内存的数据,检验其它数据运行的结果注意:若要查看相关寄存器的内容,
22、则不要运行返回DOS的指令,它会改变相关寄存器的内容。三、微机接口实验操作(一)微机接口实验箱介绍拨向“88”端选96008086/8088微机接口实验箱自带CPU,通过USB接口(内部USB转RS-232串口)与上位机通信,实验箱上有多种接口和外设模块供实验使用。1.常用模块(1)地址译码:用一片74LS138对地址A9A3译码,用于接口的选择,共提供5个译码输出,每个可选择8个单元,地址A2、A1、A0用于片内端口选择,地址范围分别为:200H207H、208H20FH、210H217H、218H21FH、220H227H。(2)发光二极管:共有8个发光二极管L0L7供输出指示用。(3)开
23、关量发生器:提供了8个开关量发生电路K0K7做开关量输入实验用。(4)8255接口:CS55插孔用于连接片选信号,插孔PA0PA7、PB0PB7、PC0PC7用于连接输入、输出设备。其它信号已经连接好。(5)8253时钟(6)脉冲源电路:提供单脉冲信号和各种频率的脉冲信号。此外,实验箱还提供8251、8259、ADC0809、DAC0832、74LS273、74LS245等各种接口及直流电机、步进电机、传感器等各种外设供实验使用。2.实验箱的连接实验箱的电源输入、USB接口及电源开关位于箱子后面。电源接AC220V,故使用过程中请注意安全。实验电路接线时,务必关掉电源,否则会损坏器件!USB电
24、源开关(二)实验操作以8255应用为例,要求采用查询传送方式编程实现:已知在内存BUF起始有N个8位数据,每当PC0出现一下降沿时,从PA口输出一个数据。1.接线实验电路原理图如下,其中红线表示需要接线的地方,本实验主要使用8255接口、地址译码、单脉冲电路和发光二极管电路。关掉电源,用导线按原理图进行连接,导线的接头为锥形插头,连接时轻压即可;拆线时捏住插头的塑料部分稍微旋转后提起。切勿直接拔起或拽着导线拔插头。2.编辑源程序、编译和连接。在这里,用软件hk88te完成上述功能。(1)双击桌面上的图标启动软件。界面如右图。新建编译当前文件编译并连接加载调试(2)点击工具栏的“新建”,编辑源程
25、序,并保存成.ASM的文件,路径和文件名不要带中文字符。注意:在此环境下,只要定义一个代码段,如有数据,也在代码段中定义,代码段与数据段重叠。故DS的值与CS相等,或给DS赋值8100H。(3)编译与连接,如有错误,修改源程序直至通过。3.打开实验箱电源,设置通信口、检测串口通信是否正常(1)上电后,数码管显示器正常显示内容 (2)设置通信口(3)测试串口,如通过,则可以下载。如果失败,复位(键盘右上角的RST键)或重新上电、检查连接线、板上的波特率设置拨码开关,然后再尝试。4.加载调试。将程序下载到系统的存储器,然后可以调试、运行程序,观察结果。(1)加载加载过程(2)调试、运行程序注意:调试或全速运行后,要进行其它操作,点“退出调试”并对实验箱复位。【说明】HK88TE的帮助文件提供了部分实验的实验指导,可以查看实验的实验内容、实验程序、实验电路、实验操作等。