第2章机器语言程序的建立与执行第2章机器语言程序的建立与执行2.1机器语言程序2.2实际地址值的确定2.3DEBUG的特殊性质及应用2.4机器语言程序的建立与调试第2章机器语言程序的建立与执行2.1机器语言程序本节介绍两个程序范例,第一个程序范例是将指令所定义的“立即型”数据传送入寄存器内,然后进行算术运算,第二个程序范例是使用单独定义的方法将数据定义在数据段中。经过追踪这些指令的执行,你可以深入了解微型计算机的动作状态以及各寄存器所扮演的角色。第2章机器语言程序的建立与执行2.1.1启动DOSDEBUG程序是在DOS环境下工作的软件。若计算机同时装有两个操作系统(Windows系统和DOS系统),当系统在Windows环境下工作时,用鼠标左键单击“开始”按钮,在弹出的主菜单中单击“关闭系统”项,弹出“关闭Windows”菜单,选择其中的“重新启动计算机并切换到MS-DOS”项并回答“是”,即可启动DOS。第2章机器语言程序的建立与执行若计算机仅装有Windows操作系统,开机时,首先将DOS系统磁盘插入A驱动器,若此时电源关闭,则将电源接通;若电源已经启动,可同时按下Ctrl、Alt与Del键,以热启动方式启动计算机,即可用A盘启动DOS。第2章机器语言程序的建立与执行2.1.2检查存储器内容的方法第一个练习是,使用DOSDEBUG程序检查存储器被选择地址单元的内容。键入DEBUG然后回车,即可启动DEBUG程序。此时系统会将DEBUG程序从磁盘装入到内存储器,并且执行。之后,屏幕会出现DEBUG的提示符(-)。此提示符表示DEBUG等待接受用户的命令(DEBUG命令)。此练习只用到D命令,它的功能是显示存储器单元的内容。第2章机器语言程序的建立与执行1.存储器的容量机器的存储器容量值存放在物理地址是十六进制00413与00414的存储单元中。在DEBUG环境下,你可以观察此地址处的内容,它是以段的起始地址与偏移地址配合的方法来查看的。例如:(1)十六进制00400是段起始位置的地址,而你只能键入0040,因为最后一位数字已假设为0。第2章机器语言程序的建立与执行(2) 13是相对于段起始位置的偏移地址(差距值)。因此,只要键入下列字符串就可看到本机存储器的容量:D0040:13[并按下Enter键]在屏幕上所表示的前两个字节就是存储器的容量,此十六进制数值是以字节反向的顺序出现的,且其单位为K字节即KB。表2-1列举了一些可能出现的反向十六进制数(ReversedHex)、正确十六进制数,以及其等价的十进制数。第2章机器语言程序的建立与执行表2-1反向十六进制、正确十六进制与十进制反向十六进制正确十六进制十进制8000008012800010100256800101803840002020051280020280640第2章机器语言程序的建立与执行2.序列号微型计算机的序列号是存放于ROM存储器中的,其实际位置的地址为FE000。你只要键入下列字符串就可以看到它的内容:DFE00:0[并按下Enter键]此时,屏幕上会显示出一个7位数的数字,其后面跟着版权和日期(CopyrightDate)。第2章机器语言程序的建立与执行3.ROMBIOS日期ROMBIOS日期是存放于位置FFFF5中的,它的表示格式为mm/dd/yy。键入:DFFFF:05[并按下Enter键]就可看到ROMBIOS的日期,据此你可以判断出微型计算机的机型及其机龄。注意:上述三个例子均是早期PC机的存储器容量、序列号以及ROMBIOS日期在内存中的映像。它们可能与你所使用的现代机型不符合,但它不会影响你对D命令的使用和对内存单元内容的观察。第2章机器语言程序的建立与执行到目前为止,你已知道如何使用显示存储器内容的DEBUG命令,并可以正确地设定内存的任何单元的位置(地址),以观察它的内容。你也可以重复地键入D命令,可以不带参数,而逐步地观察存储单元的内容。当你想要退出DEBUG回到DOS的控制下时,只要键入Q然后回车就可以了。接下来,我们利用DEBUG来直接输入程序到内存储器中,并追踪它的执行过程。第2章机器语言程序的建立与执行2.1.3机器语言范例1——立即型数据运算本范例的目的是说明如何将一个机器语言程序输入到内存储器中,以及对其执行的过程。下列机器语言程序操作是以十六进制格式进行的。机器指令码注释B82301;把0123传送入AX寄存器052500;把0025加入AX寄存器第2章机器语言程序的建立与执行89C3;把AX的内容传送入BX01C3;把AX的内容加入BX89D9;把BX的内容传送入CX29C1;把CX的内容减去AX的内容29C0;AX减去AX(AX清0)90;没有运算(不做任何操作)90;但PC+1→PC第2章机器语言程序的建立与执行你也许已注意到每条机器指令的长度是不一样的(有一个、两个或三个字节),而且是以一条指令跟着一条指令的格式存放在内存储器中的。程序从第一条指令开始执行,然后逐步地执行直至完成。目前可以暂时不管机器指令中的操作码所代表的意义。例如,在某种情况下MOV(传送数据)是十六进制B8,而在另一种情况下MOV则为十六进制89。第2章机器语言程序的建立与执行此程序可以直接输入到存储器中,而且可以一次一条指令逐步地执行。同时在每一条指令执行后,你可以观察到诸寄存器的内容。依照前一节的方法将DEBUG程序装入内存储器中并执行,此时屏幕上会出现一个DEBUG的提示符(-)。若要输出打印这个练习程序,可先打开打印机电源,同时按下Ctrl与P键即可成功连接打印机。第2章机器语言程序的建立与执行键入下面的命令,就可以直接将机器语言程序存入内存(命令中字节与字节之间有一个空格):ECS:100B82301052500[按下Enter键]DEBUG的命令E代表输入,CS:100表示指令所要存入的存储单元位置——指令段开始后的第100H(256)个字节,这是在DEBUG环境下的机器指令码存放的正常起始位置地址。E命令每次存入两位十六进制数字(一个字节)到存储器的存储单元内。第2章机器语言程序的建立与执行范例1中,它存放的地址是从CS:100到CS:105,共6个字节。下一个命令为:ECS:10689C301C389C9[按下Enter键]此命令可从CS:106经107、108、109、10A至10B存入6个字节。最后一个存入命令是:ECS:10C29C129C09090[按下Enter键]第2章机器语言程序的建立与执行此命令可从CS:10C开始经10D、10E、10F、110至111存入6个字节。现在你已经存入了第一个机器语言程序。在执行之前先核对输入的资料(机器指令码)是否正确,若发现错误改正过来即可。执行这些指令是很简单的。图2-1显示了所有步骤(包括E命令)。屏幕上所显示出的内容将与你所键入的DEBUG命令产生的结果一样。第2章机器语言程序的建立与执行C:\DEBUG-ECS:100B82301052500-ECS:10689C301C389D9-ECS:10C29C129C09090-RAX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1268ES=1268SS=1268CS=1268IP=0100NVUPEIPLNZNAPONC1268:0100B82301MOVAX,0123第2章机器语言程序的建立与执行-TAX=0123BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1268ES=1268SS=1268CS=1268IP=0103NVUPEIPLNZNAPONC1268:0103052500ADDAX,0025-TAX=0148BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1268ES=1268SS=1268CS=1268IP=0106NVUPEIPLNZNAPENC1268:010689C3MOVBX,AX第2章机器语言程序的建立与执行-TAX=0148BX=0148CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1268ES=1268SS=1268CS=1268IP=0108NVUPEIPLNZNAPENC1268:010801C3ADDBX,AX-TAX=0148BX=0290CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1268ES=1268SS=1268CS=1268IP=010ANVUPEIPLNZACPENC1268:010A89D9MOVCX,BX第2章机器语言程序的建立与执行-TAX=0148BX=0290CX=0290DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1268ES=1268SS=1268CS=1268IP=010CNVUPEIPLNZACPENC1268:010C29C1SUBCX,AX-TAX=0148BX=0290CX=0148DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1268ES=1268SS=1268CS=1268IP=010ENVUPEIPLNZACPENC1268:010E29C0SUBAX,AX第2章机器语言程序的建立与执行-TAX=0000BX=0290CX=0148DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1268ES=1268SS=1268CS=1268IP=0110NVUPEIPLZRNAPENC1268:011090NOP-图2-1机器语言范例1的追踪第2章机器语言程序的建立与执行只要键入R命令再按Enter键即可观察诸寄存器与标志寄存器的内容。此时,DEBUG会以十六进制的格式提示所有寄存器的内容,例如:AX=0000,BX=0000,…因为DOS版本的不同,所以在屏幕上的段寄存器内容可能与图2-1所显示的结果不相同。指令指针寄存器IP=0100表示指令从指令段起始位置地址后的第100H字节开始执行,这就是为什么要求以ECS:100命令作为存入程序的起始位置地址的原因。第2章机器语言程序的建立与执行图2-1中的标志寄存器显示了下列标志的设定:NVUPEIPLNZNAPENC当前这些标志位的意义分别为:NV没有溢出,UP地址值的变化是增值向上(右)方向,EI中断允许,PL正号,NZ非0,NA没有辅助进位,PE奇校验,NC没有进位。第2章机器语言程序的建立与执行R命令同时也显示出位于偏移地址0100处的第一条待执行的指令。注意,图2-1中的CS寄存器内容是CS=1268(你的机器也许不一样),且指令如下所示:1268:0100B82301MOVAX,0123(1)CS=1268表示指令段的起始位置地址在1268(实际的物理地址值是12680)。1268:0100表示紧接着在CS位置地址12680后的100(十六进制)个字节的位置。(2)B82301是你输入在CS:100位置地址处的机器指令码,B8是操作码,2301是立即数。第2章机器语言程序的建立与执行(3) MOVAX,0123是机器指令码的汇编语言助记符指令形式。这是“反汇编”操作的结果,“反汇编”是指将机器指令码翻译成汇编语言符号指令形式。利用DEBUG能使你更容易地理解此机器指令程序。在以后的章节中,你将学习到如何使用汇编语言的符号指令独立地编写程序。目前这条汇编语言指令的意思是,把立即数0123移入AX寄存器内。第2章机器语言程序的建立与执行此时,指令MOVAX,0123尚未执行。为了执行此指令,可键入T(代表Trace)命令并按Enter键。T命令执行之后,DEBUG同时显示各寄存器、标志寄存器的内容,以及下一条待执行的指令。请注意,此刻AX的内容为0123。操作码B8的功能是将紧接着的2301移入AX寄存器。此操作是把23移入AX寄