实验教学目的学习汇编语言程序设计的基本方法和技能;掌握编辑、调试和运行程序的方法;学习接口的设计与编程方法。要求根据实验任务前进行预习。独立完成实验。整理实验结果记录。实验结束后,请指导教师检查原始数据、实验结果。规定的时间内完成并上交实验报告。可以参考,但必须搞懂!实验报告格式采用学院要求格式实验报告内容实验题目实验目的和要求实验设备实验内容实验过程基本思路硬件原理图及其说明:主要元器件的作用、名称程序功能结构说明(含程序名、功能、算法说明、输入信息的格式)流程图源程序调试过程(如上机时遇到的问题及解决办法,观察到的现象及分析)实验结果总结与体会参考资料郑学坚等.微型计算机原理及应用实验指导.清华大学出版社.刘均等.汇编语言程序设计实验教程.科学出版社18086CPU内部结构1.算术逻辑单元(运算器)2.寄存器组3.指令处理单元(控制器)8088的内部结构1234内部暂存器IPESSSDSCS输入/输出控制电路外部总线执行部分控制电路∑ALU标志寄存器AHALBHBLCHCLDHDLSPBPSIDI通用寄存器地址加法器指令队列执行部件(EU)总线接口部件(BIU)16位20位8位8位返回控制寄存器8位寄存器IPFLAGCSDSSSES代码段寄存器数据段寄存器堆栈段寄存器附加段寄存器AHALBHBLCHCLDHDLAXBXCXDXSPBPSIDI累加器基地址寄存器计数器数据寄存器堆栈指针寄存器基地址寄存器源变址寄存器目的变址寄存器(PC)指令指针寄存器(PSW)状态标志寄存器段寄存器16位寄存器通用寄存器寄存器组(RegisterSet)4.寄存器的配置实验一DEBUG调试工具使用实验目的掌握DUBUG调试工具中的常用命令;熟悉DUBUG调试界面中的相关区域;掌握用DEBUG查看、修改寄存器、内存、代码的方法及代码运行的方法。关于DUBUGDEBUG最初是MS-DOS中的一个外部命令,从DOS1.0起,Microsoft的操作系统就一直带有此命令。DEBUG的主要用途在于纠错,即修正汇编语言程序中的错误,不过也可以用来编写较短的汇编语言程序。对初学者而言,DEBUG更是比较好的入门工具。因为DEBUG操作相对容易,可以避免一开始就碰到许多难以理解的程序行。DEBUG还可用来检查和修改内存位置、载入存储和执行程序、检查和修改寄存器等。DEBUG通过单步、设置断点等方式为汇编语言程序员提供了有效的调试手段。注意DEBUG命令字母不区分大小写只使用十六进制,没有后缀分隔符只在两个数值之间是必须的命令按回车后才执行,可以用Ctrl+Break中止命令的执行如果命令不符合DEBUG的规则,则将以“error”提示,并用“^”指示错误所在的位置启动DEBUG的方法方法1:在Windows“开始”菜单中单击“运行”命令,直接在“运行”对话框中输入“DEBUG”并回车。方法2:在“运行”对话框中输入“CMD”,启动DOS命令窗口,并在DOS命令提示符“”后面输入“DEBUG”并回车。方法3:如果需要调试.exe或者.com的文件,则用“DEBUG文件名.exe”或者“DEBUG文件名.com”DEBUG的常用命令(1)显示存储单元命令D(Dump)格式D[地址]显示当前或指定开始地址的主存内容D[范围]显示指定范围的主存内容说明:D[范围]这种形式中,最后一个单元只能写偏移地址,不能写段地址。默认和第一个单元同段。举例-d-d0af9:0103-d0af9:01000107-dds:01000107等价于-dds:0100L7-d0100L8DEBUG的常用命令DEBUG的常用命令修改存储单元命令E(Enter)格式E地址数据表用数据表的数据修改指定单元的内容E地址查看指定单元内容后再修改说明数据表中为要写入每个单元的数据,可以是十六进制数据,也可以是单引号括起来的字符或字符串。数据和数据间要用空格间隔,数据和字符可以不分隔。举例-e0AF9:01000102-e010041’a’-e0100‘ABCD’或-e010041424344-e0104操作的时候用空格键表示移到下一单元,用减号键“-”可以回到上一单元,按回车表示修改完毕。要修改的值必须以十六进制数据的形式输入DEBUG的常用命令填充命令F(Fill)格式F地址范围数据表说明如果数据个数超过指定的单元个数范围,则忽略多出的数据项;如果数据个数小于指定的单元个数范围,则重复使用这些数据,直到填满指定的范围区域。因为像BIOS等系统程序一般都放在内存的高端区域,不能被用户修改举例f0AF9:0100L100Af0AF9:0100L10‘ABCD’DEBUG的常用命令寄存器显示或修改命令R(Register)格式R;显示CPU内所有寄存器内容和标志寄存器中标志位值R寄存器名;显示和修改指定的寄存器RF;显示和修改标志寄存器中的标志位举例rraxrf要让CF=1,DF=1,ZF=1,则需要输入CY,DN,ZR。输入的顺序可以任意标志名标志为1标志为0OF溢出(是/否)OV(OVerflow)NV(NooVerflow)DF方向(减量/增量)DN(DowN)UP(UP)IF中断(允许/关闭)EI(EnableInterrupt)DI(DisableInterrupt)SF符号(负/正)NG(NeGative)PL(Plus)ZF零(是/否)ZR(ZeRo)NZ(NoZero)AF辅助进位(是/否)AC(AuxiliaryCarry)NA(NoAuxiliary)PF奇偶(偶/奇)PE(ParityEven)PO(ParityOdd)CF进位(是/否)CY(CarryYes)NC(NoCarry)DEBUG的常用命令提示:运行DEBUG程序时,如果不带被调试程序,则所有段寄存器值相等,都指向当前可用的主存段;除SP之外的通用寄存器都设置为0,而SP指示当前堆栈顶在这个段的尾部;IP=0100h;状态标志都是清0状态。运行DEBUG程序时,如果带入的被调试程序扩展名不是.exe,则BX、CX包含被调试文件大小的字节数(BX为高16位),其他同不带被调试程序的情况。运行DEBUG程序时,如果带入的被调试程序扩展名是.exe,则需要重新定位。此时,CS:IP和SS:SP根据被调试程序确定,分别指向代码段和堆栈段。DS=ES指向当前可用的主存段,BX、CX包含被调试文件大小的字节数(BX为高16位),其他通用寄存器为0,状态标志都是清0状态。DEBUG的常用命令汇编命令A(Assemble)格式A[地址];从指定地址开始输入汇编指令说明A命令支持标准的80x86指令系统以及汇编语言语句格式,但要注意以下一些规则:1)指令中不能出现变量和标号。2)所有输入的数值都是十六进制数。3)段跨越指令要在相应指令前单独一行输入。4)段间(远)返回的助记符要使用RETF。5)A命令也支持最常用的两个伪指令DB和DW。举例下面的程序段存放到内存0100:0100存储区。movax,1234;将数据1234H传送到AX寄存器中movbx,ax;将AX的数据传送到BX中mov[0000],ax;将AX的数据传送到数据段的0000H单元-a0100:0100DEBUG的常用命令反汇编命令U(Unassemble)格式:U[地址];从指定地址开始,反汇编32个字节(80列显示模式)U范围;对指定范围的主存内容进行反汇编举例-u0100:0100-u0100:01000107-u0100:0100L8DEBUG的常用命令运行命令G(Go)格式G[=地址][断点地址1[,断点地址2[,…[,断点地址10]]]]说明G命令中的地址都是不能指定段地址的,默认为CS所指的段断点地址指示G命令执行时停下来的指令地址,断点可以没有,但最多只能有10个。程序会停在第一个断点,后面要继续,仍要使用G命令设置新断点。设置多个断点主要是为了在分支结构中能够在分支点停止程序执行。如果没有结束指令,需要设置断点举例-g=01000108DEBUG的常用命令跟踪命令T(Trace)格式:T[=地址];逐条指令跟踪T[=地址][数值];多条指令跟踪说明T命令从指定地址起执行一条或执行由[数值]参数指定条数的指令后停下来。每条指令执行后都要显示所有寄存器和标志位的值以及下一条指令。T命令逐条指令执行程序,遇到子程序(CALL)或中断调用(INTn)指令也不例外,会进入到子程序或中断服务程序当中执行。举例-t=01003DEBUG的常用命令继续命令P(Proceed)格式:P[=地址][数值]说明P命令类似于T命令,只是执行时不会进入子程序或中断服务程序中。当不需要调试子程序或中断服务程序时,应使用P命令而不是T命令。退出DEBUG命令Q(Quit)格式:-QDEBUG的常用命令(补)命名命令n格式N文件标识符说明把命令中给定的文件标识符格式化,放在CS:5C和CS:6C的两个文件控制块中,然后可以用L/W命令装载/写程序装入命令L写命令WBX,CX为装入/写的程序的长度实验内容进入DEBUG查看所有寄存器的值,并指明显示结果中各内容的含义修改寄存器的值原始值查看方法,查看的结果修改的命令修改后结果的查看方法,修改后的结果查看存储单元的内容查看的命令,查看的结果修改存储单元的内容修改的命令,修改后的结果实验内容汇编命令A的操作将以下指令放入程序段0200单元起始的存储空间中Movax,1234hMovbx,5678hMovcx,9abch这段程序占多少字节,它的起始位置是多少?这段程序对应的机器码分别是什么?反汇编命令U的操作用反汇编命令查看上面的代码,列出相应的结果实验内容跟踪命令的T的操作逐条执行前面的汇编指令,列出执行的结果运行命令G的操作修改AX,BX,CX中的值为0用G命令再次执行前面的汇编指令,列出执行的结果退出DEBUG