实验一 汇编语言程序的调试与运行 一、实验目的 1.熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。 2.掌握数据在内存中的存放方式和内存操作数的寻址方式。 3.掌握汇编语言源程序的组成格式。 4.掌握8086/8088指令及伪指令的格式及用法。 5.掌握汇编语言源程序的编辑、调试及运行方法。
二、实验准备知识 1.DEBUG程序的启动 DEBUG是专门为汇编语言设计的一种汇编语言调试工具,它通过单步执行,设置断点连续执行等方式为汇编语言程序员提供了非常有效的调试手段。 在DOS提示符下,可输入命令: C>DEBUG [d:][path][文件名][ 参数1][参数2] 其中文件名是被调试文件的名称,它必须是执行文件(.EXE),两个参数是运行被调试文件时所需要的命令参数,在DEBUG程序调入后,出现提示符“–”,此时,可键入所需的DEBUG命令。 在启动DEBUG时,如果输入了文件名,则DEBUG程序把指定文件装入内存。用户可以通过DEBUG的命令对指定文件进行修改,显示和执行。如果没有文件名,则是以当前内存的内容进行工作。 2.DEBUG的主要命令 1)汇编命令A 格式:– A [起始地址] 功能:该命令从指定地址开始允许输入汇编语句,把它们汇编成机器代码相继存放在从指定地址开始的存储器中。 2)反汇编命令U (1)格式1:– U [起始地址] 功能:该命令从指定地址开始,反汇编32个字节,若地址省略,则从上一个U命令的最后一条指令的下一个单元开始显示32个字节。 (2)格式2:– U [起始地址 终止地址] 格式3:– U [起始地址 L 字节数] 功能:该命令对指定范围的内存单元进行反汇编。例如: 3)运行命令G 格式:– G [= 起始地址1][断定点地址2[断点地址3„„]] 功能:从指定地址开始执行程序。在设定的断点处程序暂停,并显示全部寄存器内容和下一条要执行的指令。 一般设置断点前最好用U命令查看一下指令开始的地址。断点数最多为10个。 如: – G=100 108 4)跟踪命令(单步执行)T 格式1:– T [=起始地址] 格式2:– T [=起始地址 指令条数] 功能:从指定地址开始执行程序,每次执行一条指令,然后显示各寄存器的内容和状态寄存器的内容,及以助记符形式表示的下一条指令。 如: – T=100 5)显示内存单元内容的命令D 格式1:– D [起始地址] 格式2:– D [起始地址 终止地址] 格式3:– D [起始地址 L 字节数] 功能:显示指定内存单元的内容。 6)修改内存单元内容的命令E (1)用给定的内容代替指定范围的单元内容 格式:– E 地址 内容表 例如:– E 2000:0100 F3 "XYZ" 8D 其中F3、"X"、"Y"、"Z"和8D各占一个字节,用这五个字节代替原内存单元2000:0100到0104的内容,"X"、"Y"、"Z"将分别存入其ASCII码值。 (2)逐个单元相继地修改 格式 :– E地址 例如:– E 100 系统显示如下: 18E4:0100 89. 78 此命令是将原100号单元的内容89改为78,78是用户输入的。 7)检查和修改寄存器内容的命令R (1)显示CPU内部所有寄存器内容和标志位状态 格式:– R R命令显示中标志寄存器中各标志位状态的含义如表1所示。 表1 标志寄存器标志位含义 标 志 名 置位(1) 复位(0) 溢出Overflow(是/否) OV NV
方向Direction(减量/增量) DN UP
中断Interrupt(允许/屏蔽) EI DI
符号Sign(负/正) NG PL
零Zero(是/否) ZR NZ
辅助进位Auxiliary Carry(是/否) AC NA
奇偶Parity(偶/奇) PE PO
进位Carry(是/否) CY NC
(2)显示和修改某个指定寄存器内容 格式: – R 寄存器名 例如输入:–R AX 如显示如下: AX 2000 : 则表示AX当前内容为2000H,此时若不对其作修改,可按ENTER键;否则,输入修改后内容,如输入: :3000 则AX内容由2000H改为3000H。 (3)显示和修改标志寄存器 格式:– R F 如系统将显示如下: OV DN EI NG ZR AC PE CY – 这时若不作修改可按ENTER键,否则在“–”号之后键入修改值,键入顺序任意。如: OV DN EI NG ZR AC PE CY – PO NZ DI NV 8)退出DEBUG命令Q 格式:– Q 功能:退出DEBUG程序,返回DOS。 3.汇编语言源程序的分段结构 (1)段的定义 1)段定义伪指令:数据段、堆栈段、代码段的定义 2)段的定位类型、组合类型、段的别名的说明 (2)段寄存器的装入 1)指定段寄存器与段之间的对应关系伪指令:ASSUME 2)将段地址装入指定段寄存器:MOV指令 4.8086/8088的指令系统 (1)常用指令:掌握其格式及用法 1)数据传送类指令 ①数据传送:MOV(数据传送) ②数据交换:XCHG(数据交换) ③入栈及出栈:PUSH(入栈)、POP(出栈) 2)算术运算类指令 ①加法运算:ADD(加法运算)、ADC(带进位加法运算)、 INC(加1运算) ②减法运算:SUB(减法运算)、SBB(带借位减法运算)、DEC(减1运算) ③比较运算:CMP(数据比较,设置标志寄存器) 3)逻辑运算类指令 ①逻辑运算:AND(逻辑与)、OR(逻辑或)、XOR(逻辑异或)、NOT(逻辑非)、TEST(测试) ②移位运算:SHL(逻辑左移)、SHR(逻辑右移)、SAR(算术右移)、ROL(循环左移)、ROR(循环右移)、RCL(带进位循环左移)、RCR(带进位循环右移) 4)程序控制类指令: ①无条件转移指令:JMP(无条件转移) ②条件转移指令: 判断是否相等转移:JZ/JE(等于零/相等转移)、JNZ/JNE(不等于零/不相等转移) 判断无符号数大小转移:JA/JNBE(高于/不低于等于转移)、JAE/JNB(高于等于/不低于转移)、JB/JNAE(低于/不高于等于转移)、JBE/JNA(低于等于/不高于转移) 判断有符号数大小转移:JG/JNLE(大于/不小于等于转移)、JGE/JNL(大于等于/不小于转移)、JL/JNGE(小于/不大于等于转移)、JLE/JNG(小于等于/不大于转移) ③循环控制指令 循环转移指令:LOOP(CX≠0循环) 条件循环转移指令:LOOPZ/LOOPE(CX≠0且ZF=1循环) LOOPNZ/LOOPNE(CX≠0且ZF=0循环) 5)串操作类指令 ①数据串传送:MOVSB(字节操作)、MOVSW(字操作) ②数据串比较:CMPSB(字节操作)、CMPSW(字操作) ③数据串搜索:SCASB(字节操作)、SCASW(字操作) ④数据串存取:STOSB(字节操作)、STOSW(字操作)、LODSB(字节操作)、LODSW(字操作) ⑤重复前缀:REP(CX≠0重复执行串指令) REPZ/REPE(CX≠0且ZF=1时重复执行串指令) REPNZ/REPNE(CX≠0且ZF=0时重复执行串指令) (2)常用伪指令:掌握其格式及用法 1)数据定义伪指令:DB、DW、DD等 2)表达式赋值伪指令:EQU、= 3)定位伪指令:ORG 5.8086/8088常用运算符 1)算术运算符:+、-、*、/、MOD 2)逻辑运算符:AND、OR、XOR、NOT——注意与逻辑运算指令的区别 3)关系运算符:EQ、NE、LT、LE、GT、GE 4)数据返回运算符:TYPE、LENGTH、SIZE、OFFSET、SEG 5)属性运算符:PTR
三、实验性质 本实验为设计性实验。 四、实验学时 本实验学时为2学时。 五、实验内容与步骤 1、实验内容 将两个多位十进制数相加,要求被加数和加数均以ASCII码形式各自顺序存放在DATA1和DATA2为首的5个内存单元中,结果送回DATA1处。 2、程序框图 两个多位十进制相加的程序流程图如图30所示。 图30 两个多位十进制相加程序流程图 3、实验步骤 1.编辑源程序,建立一个以后缀为 .ASM的文件. 2.汇编源程序,检查程序有否错误,有错时回到编辑状态,修改程序中错误行。无错时继续第3步。 3.连接目标程序,产生可执行程序。 4.DEBUG调试可执行程序,记录数据段的内容。 5.在操作系统状态下,运行程序,并将记录屏幕显示内容记录到表2中。 表2 屏幕显示记录 被加数 加数 屏幕显示内容 12732 06815 10732 43691 65087 17631
六、实验要求 1.实验前要做好充分准备,包括汇编程序清单,调试步骤,调试方法,以