1、 1微机原理实验内容 2015实验一 上机方法及寻址方式练习一 实验目的1 学习汇编语言上机方法。2 深入了解 DEBUG 动态调试软件的应用,掌握下列命令的使用方法:U 反汇编 G 运行程序D 显示内存内容 R 显示修改寄存器内容 E 修改内存内容 T 单步执行命令 Q 返回 DOS3 实际感受段地址,偏移地址,存储器组织及 CPU 寄存器等概念。4 掌握 8086/8088 的主要寻址方式。二 实验任务一 双字相加把内存字单元 DATA1 和 DATA2 中的两个数相加(例如 123456H+456789H),结果存入 SUM 单元。此程序的功能很简单,目的是为了通过该例掌握上机过程和实验
2、方法。首先,对书写好的源程序进行编辑,汇编及连接,生成可执行的 EXE 文件。然后对 EXE 文件进行动态调试,排除错误,最终形成一个完全正确的程序。1 建立源程序 .ASM 为了使大家对标准汇编语言程序结构有一个了解,并牢固掌握 DEBUG 调试程序的应用。在这里给出上面实验任务的程序清单。程序 1 是一个标准的汇编语言程序,共有三个段:数据段、堆栈段及代码段,在以后的编程中可以仿照这一结构。程序 1:双字相加DATA SEGMENT ;define data segmentDATA1 DW 1234HDATA2 DW 5678HSUM DW ?DATA ENDSSTACK SEGMENT
3、PARA STACK STACK ;define stack segment DW 100 DUP (?) TOP LABEL WORDSTACK ENDSCODE SEGMENT ;define code segmentASSUME CS: CODE,DS:DATA,SS:STACKSTART:MOV AX, DATA ;set DS register to current data segmentMOV DS, AXMOV AX, STACK ;set up stack SS and SP registMOV SS, AXMOV SP, OFFSET TOPMOV AX, DATA1ADD
4、 AX, DATA2 MOV SUM, AXMOV AH,4CH ;return to DOSINT 21HCODE ENDS ;end of code segmentEND START ;end assembly22 汇编生成 .OBJ 文件对.ASM 文件进行汇编,生成目标文件 .OBJ。汇编结束时会显示警告错误的个数(Warning Errors)和严重错误的个数(Severe Errors) ,这两种错误属于.ASM 文件中的语法性错误。若出现错误应对源文件(.ASM 文件)进行修改,修改之后再进行汇编直至错误数为零时方可进行下一步操作。3 连接生成 .EXE 文件连接后生成 .EXE
5、 可执行文件。4. 利用 DEBUG 命令对 .EXE 文件进行调试DEBUG 是 DOS 提供的一种调试软件。它可用于检查修改存储单元的内容,装载及运行用户程序。进入 DEBUG 后其状态提示符为一短横线“” ,在此状态下可用各种命令对 .EXE 进行操作。下面是 DEBUG 的主要命令。(1) 对 .EXE 文件进行反汇编U 命令U 命令格式一: U CS:00001501: 0000 B8F314 MOV AX, 14F3.上述命令从 CS 段,偏移地址为 0000 的单元开始反汇编 32 个字节。在以上的反汇编清单中,最左一列是代码段的段地址值,第二列是各指令的偏移地址值(指令的起始地
6、址) ,然后依次是指令的机器码与助记符。U 命令格式二:U在 32 个字节的指令代码反汇编完之后,可再次使用 U 命令对后续代码进行反汇编,在此,U 命令之后省略了地址,则从上一个 U 命令的最后一条指令的下一个字节开始反汇编 32 个字节。可反复使用上述两种 U 命令格式,将原程序清单与反汇编清单进行对比分析,然后回答下列问题:问题 1: .EXE 装入内存后,其数据段的段地址是 。在未运行 .EXE 程序前,数据段的段地址是否已装入到 DS 寄存器中? (请选择回答:是/否) 。问题 2:反汇编清单中倒数第一行(按实际显示行计算)是不是.EXE 程序中的有效指令? (请选择:是/不是) 。
7、(2) 检查 RAM 区中的数据D 命令D 命令格式:D 数据段段地址:偏移地址(0000)D 命令从给定地址开始连续显示内存单元中的数据,每行显示 16 个字节,每行的显示格式为段地址:偏移地址 16 个字节数据及各字节数据所对应的 ASCII 码字符。若 D 命令中没有给出地址,则从上一个 D 命令所显示的最后一个字节的下一个字节开始显示。合理使用 U 命令和 D 命令,分析所显示的信息并填写表 1-1。(3)运行程序G 命令G 命令格式:G = CS:0000 断点地址CPU 从 CS 段,0000 单元开始连续执行指令,当遇到断点时便会停止执行。用 G 命令执行完程序后再使用 D 命令
8、显示内存单元的内容,填写表 1-2 中各项数据和运行结果,并分析结果是否正确。(4)检查寄存器内容R 命令R R 命令会显示/修改 CPU 所有寄存器的内容,并给出程序执行后各标志位的当前状态。在此,不再列3出执行情况。请用 R 命令显示 CPU 寄存器的内容,填写表 1-3。(5) 修改内存单元内容E 命令 不连续修改内存单元内容,命令格式如下:E 1500:0000 设显示 1500H:0000H 单元内容为:1500:0000 24. 如果需要修改该单元内容可以由键盘输入数据,按空格则显示/修改下一单元的内容。例如:把1500H:0000H 单元的 24H 内容修改成(注意,在 DEBU
9、G 中显示的地址码数据均默认为十六进制形式)78H,其操作如下:1500:0000 24. 78 36.其中 36H 为 1500H:0001H 单元的内容。用户可以不断修改相继单元的内容,若某一字节无需修改可用空格键跳过,直到用回车结束该命令为止。 修改连续单元的内容。命令格式为:E 1500:0000 12 34 123该命令将 12H、 34H、 31H(1的 ASCII 码)32H、 33H 存放到从 1500:0000 开始的连续单元中去。现在要求用 E 命令按表 1-4 中给出的数据修改 DATA1 和 DATA2 单元的内容,然后用 G 命令运行程序,填写表 1-4。(6)单步执
10、行命令T 命令使用 T 命令之前,先使用 G 命令执行程序,使程序暂停在断点处,然后可以使用 T 命令单步执行指令,其命令格式为:T 其功能是从当前的 CS:IP 处执行一条指令后暂停,自动显示各寄存器的内容、标志位的状态并给出下一次将要执行的指令地址及代码。注意,对 REI 指令、中断指令、DOS 功能调用指令等不能用 T 命令单步执行。请用 T 命令单步执行程序,一次执行一条指令,注意观察各寄存器如 AX、IP 等的变化情况。(7)退出 DEBUGQ 命令QQ 命令后退出 DEBUG,返回 DOS。三实验任务二: 寻址方式练习下列程序用于练习 8086/8088 的立即寻址寄存器寻址直接寻
11、址寄存器间接寻址寄存器相对寻址等七种寻址方式,为了方便调试程序,程序清单的代码段中给出了指令的行号,输入程序时请不要输入行号。程序清单如下:DATA1 SEGMENTM1DB 0A0H,0A1H,0A2H,0A3H,0A4H,0A5H,0A6H,0A7HM2 DB 0A8H,0A9HDATA1 ENDSDATA2 SEGMENTN1DB 0B0H,0B1H,0B2H,0B3H, 0B4H,0B5H,0B6H,0B7HN2DB 0B8H,0B9HDATA2 ENDSSTACK SEGMENT PARA STACK STACK 4DB 0C0H,0C1H,0C2H,0C3H,0C4H,0C5H ,
12、0C6H,0C7HDB 0C8H,0C9HDW 100 DUP (?)TOP LABEL WORDSTACK ENDSCODE SEGMENT ASSUME CS: CODE,DS:DATA1,ES:DATA2,SS:STACK1 START:MOV AX,DATA1 2 MOV DS,AX 3 MOV AX,DATA2 4 MOV ES,AX 5 MOV AX,STACK 6 MOV SS,AX 7 MOV SP,OFFSET TOP 8 MOV SI,0001H 9 MOV DI,0002H10 MOV BP,0003H11 MOV BX,0004H12 MOV AL,10013 MOV
13、AL,BL14 MOV AL,M115 MOV AL,BX16 MOV AL,ES:BX17 MOV AL,BP 18 MOV AL,BX+05H 19 MOV AL,M1BX20 MOV AL,ES:N1BX 21 MOV AL,BXSI22 MOV AL,M1BXSI23 MOV AL,N1BXDI24 MOV AL,BPDI25 MOV AH,4CH26 INT 21HCODE ENDSEND START1.建立源程序,然后汇编、连接生成目标文件。2.合理使用 DEBUG 的 U 命令和 D 命令,检查 RAM 区中的数据,分析所显示的信息并填写表 1-5。3. 利用 U 命令对 .EX
14、E 文件进行反汇编, 分析反汇编清单,从第 12 条指令开始把每条指令的偏移地址填入表 1-6 的“指令的偏移地址”一栏中。4. 利用 T 命令从第 12 条指令开始单步执行程序,每执行一条指令填写表 1-6 中对应行的其它栏(“SRC寻址方式” 、 “SRC 的地址” 、及“AL 之值” ) 。5实验数据记录页 实验一 上机方法及寻址方式练习姓 名: 学 号: 实验室门牌号: 实验桌号: 表 1-1 运行程序前的数据存储情况标号(变量名) 段地址 偏移地址 内存中的内容DATA1DATA2SUM表 1-2 运行程序后的数据存储情况标号(变量名) 段地址 偏移量 内存中的内容DATA1DATA
15、2SUM表 1-3 有关寄存器内容寄存器名 CS DS IP AX BX CX SI DI内容表 1-4 另一组实验数据及运行结果标号(变量名) 段地址 偏移量 内存中的内容DATA1 (你学号的前 4 位)DATA2 (你学号的最后 4 位)SUM6表 1-5 各段的数据分配情况DATA1 区地址与数据 DATA2 区地址与数据 STACK 区地址与数据段地址 偏移地址 数据 段地址 偏移地址 数据 段地址 偏移地址 数据0000H 0000H 0000H0001H 0001H 0001H0002H 0002H 0002H0003H 0003H 0003H0004H 0004H 0004H0
16、005H 0005H 0005H0006H 0006H 0006H0007H 0007H 0007H0008H 0008H 0008H0009H 0009H 0009H表 1-6 指令地址及执行情况行号 指令 指令的偏移地址SRC 的寻址方式SRC 的偏移地址指令执行后AL 之值12 MOV AL,10013 MOV AL,BL14 MOV AL,M115 MOV AL,BX16 MOV AL,ES:BX17 MOV AL,BP18 MOV AL,BX+05H19 MOV AL,M2BX20 MOV AL,ES:N2BX21 MOV AL,BXSI22 MOV AL,M2BXSI23 MOV
17、AL,N2BXDI24 MOV AL,BPDI注:SRC 指源操作数。7实验二 串处理程序设计一 实验目的1 进一步使用 DEBUG 的调试命令,达到熟练掌握的目的。2 学习串处理程序的设计方法,牢固掌握串操作指令及其用法。3 学习 DOS 功能调用方法。二 实验任务一 字符串传送编写程序,建立数据段 DATA,将你的姓名(汉语拼音)及学号存入数据段的 BUFFER1 区域,然后利用程序将 BUFFER1 区域中的字符串(姓名及学号)依次传送到从 BUFFER2 开始的内存区域中去。1. 编程提示数据段可以定义为两个段:源数据区定义为数据段,目的数据区定义为附加段。DATA SEGMENTBU
18、FFER1 DB WANG HUAN 01982001M EQU $-BUFFER1DATA ENDSEXTRA SEGMENTBUFFER2 DB M DUP (?)EXTRA ENDS串的传送可用 MOVSB 指令来实现,注意,MOVSB 要求 DS 与 SI 寄存器配合使用,ES 与 DI 配合使用。另外,用 CX 中的计数值可控制 MOVSB 指令的重复次数。指令格式为: REP MOVSB2.实验要求及问题(1) 编写程序,在 DEBUG 下运行并观察结果,填写表 2-1。表 2-1 反汇编清单中所反映的相关信息*注:最后一条指令是对应于代码段中最后一条指令(2)在未执行程序之前,用
19、 D 命令显示内存区域的内容,填写表 2-2。表 2-2 未执行程序前的数据区内容(3)执行程序以后用 D 命令显示内存区的内容,填写表 2-3。表 2-3 执行程序之后的数据区内容(4)用 R 命令检查寄存器的内容填写表 2-4。表 2-4 有关寄存器内容寄存器名 CS DS IP AX BX CX SI DI内容8三实验任务二 DOS 功能调用DOS 系统为程序员提供许多子程序可供用户直接调用。调用时需要使用中断指令:INT 21H在使用该指令前,应将调用的功能号送入 AH,有关入口参量送入指定寄存器。若有出口参量,中断调用返回后,结果在指定的寄存器或存储单元中。其调用方法如下:送入口参量
20、给指定寄存器;AH 功能号;INT 21H ;主要的几个 DOS 功能调用说明文件如下。1. 4CH 号功能调用 MOV AH,4CH ;子程序编号 4CHAH;即功能号 4CHAHINT 21H ;返回 DOS2. 01H 号功能调用 ;从键盘输入一个字符(功能号=1);功能号 1 AH;入口参数:无INT 21H ;等待按键,按下一个键则该句执行完毕;字符回显;出口参数:AL 中有键入的字符(ASCII 码)3. 08H 号功能调用 ;从键盘输入一个字符;功能号 08 AH;入口参数:无INT 21H ;等待按键,按下一个键则该句执行完,;字符不回显;出口参数:AL 中有键入的字符(ASC
21、II 码)4. 02H 号功能调用 ;在显示器上显示一个字符(功能号=2);功能号 02H AH;入口参数:要显示的字符(ASCII 码)DLINT 21H02H 号功能调用注意事项:(1)02H 号功能调用会占用 AL 寄存器。为了防止 02H 号功能调用破坏 AL 寄存器的内容,调用前可把 AX 压栈,调用完后从堆栈中弹出 AX,以便恢复 AL 之值。(2)调用 21H 中断的 02 号功能时,当 DL 中置入 00(或 20H)时即可显示一个空格,必须注意,用DOS 调用显示字符,当 ASCII 码为 07H、08H、09H、0AH 和 0DH 时,不会显示与之对应的字符,DOS 分别将
22、这些 ASCII 码解释为振铃(BEL) 、退格(BS) 、制表(TAB) 、换行(LF)和回车(CR)的控制符,这时屏幕上不会有字符显示,仅仅是执行控制码所表示的操作。所以当按递增顺序显示 ASCII 码时,应在显示这些控制码的地方显示空格,否则显示格式不对。(3)用 DOS 调用时,应用控制码 0AH 和 0DH 分别控制换行和回车操作。实验任务二要求:编写下列程序并上机运行,由键盘输入 1 个英文字母,屏幕上显示该字母。若输入的是小写字母,则另起一行显示对应的大写字母;若输入的是大写字母,则另起一行显示对应的小写字母。9实验三 分支程序设计一 实验目的1 掌握分支程序的设计方法。2 掌握
23、无条件转移指令(JMP)及条件转移指令的应用。3 进一步使用 DEBUG 的调试命令,达到熟练使用的目的。在 DEBUG 中提供了测试各个标志位的手段,各标志位的复位(“0”状态)和置位(“1”状态)是用字符表示的,如表 3-1 所示。在实验过程中要善于使用 T 命令、 R 命令观察分析标志位的变化情况。表 3-1 标志寄存器各标志位的显示字符二 实验任务 码制转换码制转换的内容很多,现代技术中有各种各样的编码形成。在计算机领域中,最常用的码制有ASCII 码、十进制码、二进制码及十六进制码等。这些码制在实际应用中有时需要进行相互转换,在转换过程中可用旋转、移位、比较、转移等指令来实现。至于转
24、换算法,对不同的编码规则其算法就不同,请大家参阅有关书籍准备下列实验内容。任务 3-1: 二进制到 ASCII 码的转换在 DATA 单元存放有一个 8 位二进制码,将其按位转换成一串 ASCII 码,即1转换成1的ASCII 码 31H;0转换成 30H。并依次存放在以 STRING 开始的 RAM 区中(高位在前,低位在后) 。转换示例见表 3-2。实验要求:1. 在表 3-2 中分别给出了 DATA 单元中的三个数据。分别将十六进制数 6B、72 和 C9 送入 DATA 单元,运行程序后把结果填写到表 3-2 的对应栏目中,并分析结果的正确性。2. 按调试过程中的实际内存分配情况回答下
25、列问题:(1)代码的段地址是 ,第一条指令的偏移地址是 ,最后一条指令的偏移地址是 。(2)源字符串所在数据段的段地址是 ,偏移地址是 。(3)目标字符串所在段的段地址是 ,偏移地址是 。表 3-2 二进制转换成 ASCII 码实验数据 实验结果 次数 及示例 十六进制 二进制示例 D2 11010010 31 31 30 31 30 30 31 301 6B 011010112 72 011100103 C9 1100100110任务 3-2 : ASCII 码到十进制的转换从 STRING1 单元开始,存放有一串 ASCII 码字符(其字符长度为十六个字节,每一个 ASCII 码占一个字节
26、) 。将 STRING1 中每个字符转换成与之对应的十进制数字,并存放在以 STRING2 开始的区中(每个十进制数字占一个字节) 。如果某一个 ASCII 码不是 0-9 之间的数,则将 STRING2 字串中对应单元置为FFH。实验要求:1 请参阅表 4-1,编写程序上机调试。2 运行程序,填写表 3-3。表 3-3 ASCII 码到十进制转换的实验数据与运行结果任务 3-3:多分支程序设计 编程显示一个简单菜单 1,2,3(菜单显示形式不限) 。当按下 1 时,在屏幕上显示你的姓名(汉语拼音) ;当按下 2 时,在屏幕上显示你的学号。当按下 3 时,程序结束。要求:姓名和学号不能在同一行显示(即要控制换行操作) 。