1、第4章 程序加载与执行,本章重点:本章主要介绍了操作系统概念、BIOS启动程序及系统加载程序;要求熟悉DEBUG调试程序的应用环境,掌握DEBUG命令的基本格式及其使用方法;汇编语言源程序的编辑、汇编、连接的方法。,课程介绍,4.1 操作系统的组成 4.2 BIOS 启动程序 4.3 系统加载程序 4.4 调试程序DEBUG应用举例 4.5 汇编语言程序的运行,4.1 操作系统的组成,操作系统OS(Operating System)是计算机管理和控制计算机系统中的硬件及软件资源、合理地组织计算机工作流程,以便有效利用这个资源为用户提供一个功能强大、使用方便和可扩充的工作环境,从而在计算机与用户
2、之间起到接口作用。具有处理机管理、存储管理、设备管理、文件管理、用户接口等功能。构成微型计算机操作系统的组件包括以下项目:,处理机管理组件,处理机对其运行进程有效控制和管理。在多道程序环境下,处理机的分配和运行都是以进程为基本单位。执行进程控制、进程同步、进程通信、进程调度等操作。当系统运行应用程序时,处理机管理组件必须先为它创建一个或几个进程,并给它分配必要的资源。进程结束的时候要立即撤消这个进程,以便收回该进程所占用的各类资源,进程控制的主要任务就是为作业创建进程,撤销已结束的进程以及控制进程在运行中的状态转换。,进程同步的主要任务是对诸进程的运行进行协调。进程调度从进程的就绪队列中,按照
3、一定的算法选出一个进程,把处理机分配给它。 内存管理组件当程序从磁盘载入相应的内存空间时,内存管理组件配置一块足够程序运行的内存空间给该程序,包括指令、数据及堆栈空间。内存分配为每道程序分配内存空间,减少不可用的内存空间。内存保护为确保每道用户程序都在自己的内存空间中运行,互不干扰。内存扩充是借助于虚拟存储技术,从逻辑上去扩充内存容量。,若内存中已没有足够的空间来装入调入程序的时候,系统能将内存中的一部分暂时不用的程序和数据调到磁盘上,以腾出更多的内存空间. 设备管理组件设备管理组件用来完成用户提出的I/O请求,为用户分配I/O设备,提高CPU和I/O设备的利用率。具体包括:缓冲管理是管理好各
4、类型的缓冲区,以缓和CPU和I/O设备速度不匹配的矛盾。设备分配是根据用户的I/O请求,为之分配其所需的设备。设备处理的基本任务是实现CPU和设备之间的通信。虚拟设备把每次只允许一个进程使用的物理设备变换为多个对应的,逻辑设备,提高了设备的利用率,使每个用户感觉自己在独占该设备。 输入输出组件 对用户文件和系统文件进行管理,方便用户的使用。程序需要从系统输入数据或将数据输出,这要靠中断来处理,使得程序设计者免于自己设计低级的输入输出程序。,文件管理组件 操作系统维护存储在系统磁盘的文件(file)及目录(directory),对用户文件和系统文件进行管理,方便用户的使用。程序可建立(creat
5、e)及更新(update)文件数据,但操作系统负责处理数据存放在磁盘的位置。 中断处理组件 操作系统提供中断处理机制,让您可以轻松地访问存储于外部设备的数据。,4.2 BIOS 启动程序,当我们打开计算机的电源开关时,处理器进入复位(Reset)状态,将所有内存清零,并执行内存同位测试,将段寄存器CS的内容设为FFFFH,其他寄存器都清零,IP=0000H。因此第一个要执行的指令是位于CS:IP中的指令,它的物理地址为0FFFF0H,所以将存储器的高地址分配给ROM BIOS,作为BIOS的入口地址。,随后BIOS启动一个程序,进行主机自检,主机自检的主要工作是确保系统的每一个部分都得到了电源
6、支持,内存储器、主板上的其它芯片、键盘、鼠标、磁盘控制器及一些I/O端口正常可用,此后,自检程序将控制权还给BIOS。接下来BIOS读取BIOS设置,得到引导驱动器的顺序,依次检查。BIOS将所检查磁盘的第一个扇区(512B)载入内存,放在0x0000:0x7c00处,如果这个扇区的最后两个字节是“55AAH”,那么这就是一个引导扇区,磁盘也就是一块可引导盘,调用该驱动器上磁盘的引导扇区进行引导。,BIOS在ROM中提供一组例行程序支持的用于在设备上的数据的访问。BIOS的例行程序位于FFFF00H,它检查各个输入输出I/O端口,然后对于存在的设备进行初始化,接着BIOS建立两个数据区:1中断
7、向量表中断向量表是中断类型号与对应的中断处理程序之间的连接表,他提供了各种中断类型号对应的中断服务程序的入口地址。中断向量表占用主存储器至少1KB的地址空间,地址范围是00000H003FFH。表内内容分256项,分别对应256个中断类型号0255。,每个中断类型号对应4字节长的存储单元,存放中断处理程序首地址(为32位),其逻辑地址格式为:段地址:偏移地址 ;(如0x000000x003FF共1024单元为中断向量表存储区域) 当中断发生时,BIOS及操作系统使用中断向量表来执行该中断例行程序。 2BIOS 数据区BIOS驻留在系统板上ROM中,其物理地址是FE000HFFFFFH,共8KB
8、字节。BIOS除驻留在ROM中外,还使用了RAM数据区,BIOS 数据区的起始地址为00400H,其大小依设备的多少而定。,BIOS程序是靠近硬件例行程序,直接对外部设备进行输入/输出操作,用户通过中断方式进行功能调用。BIOS程序由许多功能模块组成,每个功能模块的入口地址都在中断矢量表中。接着BIOS检查系统磁盘是否存在,并从系统磁盘载入启动程序,启动程序随后从系统磁盘加载系统文件至内存,并将控制权交给操作系统。操作系统的一个主要任务是与BIOS产生互动。当需要BIOS提供服务时操作系统会调用BIOS的相关例行程序。,4.3 系统加载程序,一旦BIOS将控制权交给操作系统之后,就可以向操作系
9、统申请运行程序了。可执行的程序有两种:*.com程序及*.exe程序。程序在内存的配置情况如图4-1所示。 一个*.com的程序只包含一个段,段内包括指令、数据及堆栈,这种程序小而精,适合用于小的应用程序或常驻程序。汇编语言绝大部分的程序均使用*.exe的格式。 这里*.com程序被加载运行时有下列的特点:,.一个*.com程序占用一个段(64KB)的运行空间,PSP(Program Segment Prefix)、指令、数据及堆栈都安排在这个段内。段寄存器CS、DS、ES及SS均指到这一段的起始地址。 段内安排以程序段前缀PSP在前,指令及数据居中,堆栈则安排在段的高地址部分。PSP占用25
10、6个字节的空间,因此第一个指令的偏移地址必须从0100H开始,IP寄存器的初值即是0100H。 PSP及堆栈都由系统配置,系统会在堆栈顶端存入两个字节,其内容为零值,SP就指到这个零值的数据项,这时SP的内容为0FFFEH。,具体的*.com的程序编写参考第5章的5.5.2节汇编语言程序的可执行文件。,图4-1 PC-DOS的内存配置(a为DOS启动后,b为用户程序装入后), EXE可执行文件有以下特点: 在实体模式下,一个*.exe格式的程序分别包含指令段、数据段及堆栈段,这种程序是较为严谨的一种,适合用于大型的应用程序,或结合多种目标程序(object program)的大型程序。 通常*
11、.exe程序被加载运行时运行下列步骤: 从磁盘取得*.exe程序。 在内存里为该程序建立一个占256字节的程序段前缀PSP区域,存放所要执行程序的有关信息。再将*.exe程序放在PSP后端,并为程序定位。内存分配见图4-3-1, 将PSP地址存入DS及ES寄存器中。 将指令段的地址存入CS段寄存器中,同时将CS内第一个要执行的指令的偏移地址存入IP寄存器中。 栈地址存入SS段寄存器中,同时将SP的值设定为堆栈长度。 将控制权交给*.exe程序,执行第一个指令,开始执行程序。 从上面的步骤可以看出系统加载程序帮我们设定了CS:IP地址,也设定了SS:SP地址,但却将PSP地址存入DS及ES,因此
12、如果我们想让DS及ES指到自己的数据段,必须通过自己设定 。,4.4 调试程序DEBUG应用举例,DEBUG.EXE程序是专门为分析、研制和开发汇编语言程序而设计的一种调试工具,具有跟踪程序执行、观察中间运行结果、显示和修改寄存器或存储单元内容等多种功能。它能使程序设计人员或用户触及到机器内部,因此可以说它是80X86CPU的心灵窗口,也是我们学习汇编语言必须掌握的调试工具,必须熟练掌握其一些的命令的使用。,4.4.1 DEBUG程序的启动和退出 1直接启动 DEBUG.EXE是DOS环境下的可执行程序。在DOS提示符下键入命令: 如:C: DEBUG 在调用DEBUG程序后,出现“一”提示符
13、,等待使用DEBUG命令。 2启动DEBUG并装入需要调试的用户程序 命令格式: C: DEBUG 盘符:路径文件名.EXE参数1参数2,这时屏幕上出现DEBUG的提示符“-”,表示系统在DEBUG管理之下,此时可以用DEBUG进行程序调试。若所有选项省略,仅把DEBUG装入内存,可对当前内存中的内容进行调试,或者再用N和L命令,从指定盘上装入要调试的程序;若命令行中有文件名,则DOS把DEBUG程序调入内存后,再由DEBUG将指定的文件名装入内存。 如C:DEBUG EXAMPLE.EXE 其中EXAMPLE是文件名,扩展名是EXE,例如我们在此前已编译好了一个文件,它的名字为:EXAMPL
14、E.exe要对它进行调试时就在 DOS提示符下打:DEBUG djx.exe 回车,便可见到DEBUG 提示符-,如无任何提示说明正确,可进行调试。,DOS在调用DEBUG程序后,再由DEBUG把被调试文件装入内存。当被调试文件的扩展名为COM时,装入偏移量为01OOH的位置:当扩展名为EXE时,装入偏移量为0000H的位置,并建立程序段前缀(PSP),为CPU寄存器设置初始值。 4.4.2 DEBUG程序的常用命令 启动C:DEBUG ;出现提示符“”时,就可以使用DEBUG的所有命令。,1DEBUG下汇编语言的语法规则 所有数值全为十六进制数,且不需要加后缀H; 只能使用DB或DW,直接把
15、字节、字的数值或字符串的ASC码送入相应单元中; 不允许使用变量和标号,但变量和标号可用直接地址代替,且直接地址加方括号; 短、近和远转移或调用的目标地址,取决于到目标地址的字节位移量。远返回的助记符为RETF。 修改存储单元字节操作数类型,用BY(BYTE PTR),修改存储单元字操作数类型,用WO(即WORD PTR)。段超越助记符为CS:、DS:、ES:和SS:,2DEBUG的常用命令 (1)汇编命令 A 格式:A 地址 功能:从指定地址单元开始存放输入汇编语言的指令语句。若缺省起始地址,则从当前CS:100地址开始存放。每当输入一行语句后,按Enter键,输入的语句有效。若输入的语句中
16、有错,DEBUG会显示“Error”,并需要重新输入。用A命令输入程序语句完毕后,最后一行不要输入并直接按Enter键(或Ctrl+C),退出A命令。A命令按行汇编,主要是用于小段程序的汇编或对目标程序的修改。如图4-2所示。,说明:所有输入的数据均默认为十六进制且不用H字符(省略H)支持伪指令DB,DW等对于需要转移的指令应该直接给出具体的偏移地址(具体的数值) (2)反汇编命令 U格式1:U起始地址格式2:U起始地址结束地址|字节数功能:格式1从指定起始地址处开始将32个字节的目标代码转换成汇编指令形式。缺省起始地址,则从当前地址CS:IP开始。格式2将指定范围的内存单元中的目标代码转换成
17、汇编指令。起始和结束地址范围是可选项,无此项则从当前的地址单元开始反汇编32个字节。如:U 0100 ;从地址0100H处对指令语句进行反汇编,(3)跟踪命令 T格式:T=起始地址正整数功能:从指定地址开始执行正整数条指令,若缺省正整数,表示执行一条指令,若两项都缺省,表示从当前CS:IP指示地址开始执行一条指令。如图4-3所示。, 程序在执行该地址处的指令后停下来,且显示CPU当前所有寄存器及标志寄存器的内容。并显示下一条指令的地址和内容。 若无地址就从起始地址处单步执行一条指令。,(4)显示、修改寄存器命令 R格式:R寄存器名功能:若给出寄存器名,则显示该寄存器的内容并可进行修改。缺省寄存
18、器名,则按以下格式显示所有寄存器的内容及当前值(不能修改)。如:R ;显示所有寄存器的内容及当前值(不能修改) AX=0000 BX=0004 CX=0020 DX=0000 SP=0080 BP=0000 SI=0000 DI=0000 DS=3000 ES=23A0 CS=138E IP=0000 NV UP DI PL NZ NA PO NC 138E:0000 MOV AX,1234 ;第三行显示CS:IP的当前值,指向下一条即将执行的指令。, 键入R寄存器名命令后,显示寄存器名及其内容,输入修改内容后,按Enter键有效。若无须修改原内容,可直接键入回车符。 如:R AX ;显示寄存
19、器AX的内容并进行修改AX 1234 ;显示AX的原有内容:5000 ;将AX修改为5000H,若不修改则直接按Enter键。,(5)显示存储单元命令 D 格式1:D起始地址 格式2:D起始地址结束地址|字节数 功能:格式1从起始地址开始按十六进制显示80H个字节单元的内容,每行16个单元,共8行,每行右边显示16个单元的ASC码,不可显示的ASC码则显示“”。格式2显示指定范围内存储单元的内容,其他显示方式与格式1一样。如果缺省起始地址或地址范围,则从当前的地址开始按格式1显示。如图4-4所示。,(6)修改存储单元命令 E 格式1:E起始地址 内容表 格式2:E地址 功能:格式1按内容表的内
20、容修改从起始地址开始的多个存储单元内容,即用内容表指定的内容来代替存储单元当前内容。如图4-5所示。 例如:E DS:0100 VAR,12,34 表示从DS:0100 为起始单元的连续五个字节单元内容依次被修改为V、A、R、12H、34H。,格式2是逐个修改指定地址单元的当前内容。如图4-6所示。,如:E DS:00301371:0030 00.11 其中1371:0030单元原来的值是00H,11H为输入的修改值。若只修改一个单元的内容,这时按回车键即可;若还想继续修改下一个单元内容,此时应按空格键,就显示下一个单元的内容,需修改就键入新的内容,不修改再按空格跳过,如此重复直到修改完毕,按
21、回车键返回DEBUG“”提示符。如果在修改过程中,将空格键换成按“”键,则表示可以修改前一个单元的内容。 如:E DS:0120 4D 12 6F ABC ;修改指定内存范围(DS:0120H0125H)的6个存储单元的内容。也可以逐个单元相继修改。,(7)运行命令 G 格式:G=起始地址第一断点地址第二断点地址 功能:CPU从指定起始地址开始执行,依次在第一、第二等断点处中断。若缺省起始地址,则从当前CS:IP指示地址开始执行一条指令。最多可设置10个断点。 (8)指定文件命令 N 格式:N 图4-6 Debug的E命令 功能:指定即将调入内存或从内存写入磁盘的文件名。该命令应该用在L命令和
22、W命令之前。,(9)装入命令 L 格式1:L起始地址盘符号扇区号扇区数 格式2:L起始地址 功能:格式1根据盘符号,将指定扇区的内容装入到指定起始地址的存储区中。 格式2将N命令指出的文件装入到指定起始地址的存储区中,若省略起始地址,则装入到CS:100处或按原来文件定位约定装入到相应位置。,(10)写磁盘命令 W 格式1:W驱动器号 格式2:W起始地址 功能:格式1把指定地址开始的内容数据写到磁盘上指定的扇区中。 格式2将起始地址的BX10000HCX个字节内容存放到由N命令指定的文件中。在格式2的W命令之前,除用N命令指定存盘的文件名外,还必须将要写的字节数用R命令送入BX和CX中。,(1
23、1)退出命令 Q 格式:Q 功能:退出DEBUG,返回到操作系统。 以上介绍的是DEBUG常用命令,其他命令请参考有关书籍。 4.5 汇编语言程序的运行 汇编语言程序的上机过程包括编辑、汇编、连接和执行。建立和编辑汇编语言源程序可以使用EDIT、记事本、写字板等,也可以使用TC等来输入源程序,但扩展名必须是ASM,而不能用他们默认的扩展名。下面我们用记事本输入一个字符串比较程序例子程序。,4.5.1 8086汇编语言程序的一个例子 例1:字符串比较程序 编写一个汇编语言源程序:比较两个字符串String1和String2所包含的所有字符是否一致,若相同就显示Match,否则,显示No matc
24、h.。我们可以用串比较指令完成上述功能,参考程序如下:DATA SEGMENT ;定义数据段String1 DB move the cursor backworad.,13,10,$String2 DB move the cursor backworad.,13,10,$Mess1 DB Match,13,10,$Mess2 DB No match,13,10,$DATA ENDS,CODE SEGMENT ;定义代码段 ASSUME CS:CODE, DS:DATA, ES:DATA ; BEGIN: PUSH DS ;设置堆栈返回 SUB AX,AX PUSH AX MOV AX,DATA
25、 ; MOV DS,AX ;数据段寄存器赋初值 MOV ES,AX ;附加段寄存器赋初值 LEA SI,STRING1 LEA DI,STRING2 CLD MOV CX,25 ;设置比较次数 REPZ CMPSB,JZ NEXT ;相等则转NEXT LEA DX,MESS2 JMP SHORT DISP NEXT: LEA DX,MESS1 DISP: MOV AH,09H ;显示比较结果 INT 21H LEA DX,STRING1 ;显示字符串STRING1 MOV AH,09H INT 21H LEA DX,STRING2 ;显示字符串STRING2 MOV AH,09H INT 21
26、H RET MOV AX,4C00H ; INT 21H ; CODE ENDS ;代码段结束 END BEGIN ;程序结束,说明:汇编语言的源程序是由多条语句构成。语句说明了段和段寄存器之间的对应关系。和实现对段寄存器DS和ES赋初值。ASSUME说明语句只起说明作用,它不会对段寄存器赋值,所以,必须对有关段寄存器赋初值。在以后的其它源程序中也都是用此方法来实现对数据段寄存器赋值的。语句和是调用中断21H的4CH号功能来结束本程序的执行,程序的返回代码由寄存器AX来确定。结束本程序执行的指令是所有主模块必须书写的语句。,从上述例子可以看出,源程序的结构特点如下: 汇编语言源程序由若干个段构
27、成,相当于一篇文章由若干个段构成。 段的个数可任意,段的顺序也可随意。 每个段由若干个语句构成的,语句由单词构成,单词之间由一个或若干个空格分开。 必须明确指出整个源程序的结束。 汇编语言不区分大小写。 内存分段,故程序也分段,程序的段装入内存的段中。,4.5.2 汇编语言程序的编辑、汇编、连接和调试 1、编辑源程序 汇编语言源程序:用汇编语句编写的解决应用问题的程序。 汇编程序:将汇编语言源程序翻译成机器语言程序的系统。 汇编:将汇编语言程序翻译成机器语言程序的过程。在编辑汇编语言源程序时,对计算机硬件工作环境无特殊要求,对软件工作环境要求也很简单,只需用建立ASC码文本文件的软件即可。编辑
28、软件有:EDIT.COM、TC、WORD、TEXT、CodeView 等。当输入、建立和修改源程序时,可任选一种编辑软件,不要用格式控制符,要求编辑完成的文件扩展名必须是.ASM文件,否则不能汇编。,编辑过程:在DOS状态下,调用CodeView编辑程序建立文件名为ex1.ASM的汇编源程序,如图4-7所示。,2、 汇编源程序 源程序文件建立完毕后,调用宏汇编程序MASM对ex1.ASM进行汇编,才能产生EX1.OBJ文件。为此,需键入: 格式1 C: MASM 如ex1.asm 格式2 C: MASM 按格式1键入,屏幕上显示: Microsoft(R) Macro assemble Ver
29、sion 5.00 Copyright(C) Microsoft Corp 1981-1985,1987 ALL rights reserved OBJ filename.obj: Source listingnul.lst: Cross-referencenul.crf:,以上信息中方括号中为该项提示的缺省回答值,冒号后面等待用户输入信息,若不改变缺省值则直接按Enter键。汇编后生成以下几个文件: (1)ex1.OBJ文件 ex1.OBJ文件是必须生成的一个目标代码文件,当源程序中无语法错误时,则在当前工作盘上自动存入一个ex1.OBJ文件,供下一步连接用。目标文件(OBJ):是一个纯二进
30、制代码文件,不能直接在屏幕上显示。若源程序有语法错误时,会出现错误信息提示: 源程序文件行 错误信息代码 错误说明信息 信息提示:, Warning errors (警告错误) Severe errors (严重错误) 若严重错误总数不为0,则ex1.OBJ文件没有生成,需回到编辑状态下修改源程序直到无错为止。 (2)ex1.LST文件(列表文件) ex1.LST文件对调试程序有帮助,列表文件包含源程序中各语句及其对应的目标代码,各语句所属段内的偏移量,并且列出了源程序中所用标号、变量和符号的名字、类型和值。列表文件可以打印出来以供检查。如果需要,在屏幕显示的第二个提问的冒号后输入文件名即可,
31、如果不需要,直接按回车键。,(3)ex1.CRF文件(交叉引用文件) 交叉引用.CRF文件给出了源程序中定义的符号引用情况,按字母顺序排列。EX1.CRF文件不可显示,汇编程序提供的交叉引用文件,对于一般程序不需要建立此文件。 若按格式2输入,系统会依次出现四个提示信息,比格式1多了一项源程序文件名的输入。然后应答方式与格式1相同。 屏幕上出现以下提示信息:Microsoft(R) Macro assemble Version 5.00 Copyright(C) Microsoft Corp 1981-1985,1987 ALL rights reserved Run file .EXE: L
32、ist File nul.map: Libraries .lib:连接后,可生成两种文件:EX1.EXE和EX1.MAP,(1)EX1.EXE文件(可执行文件) 若采用方括号中的默认值,直接按回车键,否则需重新输入一文件名。 若连接过程中无错误,则自动在当前工作盘生成.EXE文件。若有错误,则会给出错误信息提示,这时必须重新修改源程序,再汇编、连接。 (2)EX1.MAP(连接映像文件) (3)EX1.LIB库文件 连接程序询问是否使用某种库文件,不需使用库文件直接按回车键。,4、 运行程序 经过汇编、连接后生成的EX1.EXE文件,可在DOS系统直接运行,只要键入相应的文件名即可。如:C:
33、EX1.EXE DOS的COMMAND.COM模块将该程序装配到内存,并设置和分配启动地址。也可在DEBUG调试程序下运行。如何用DEBUG程序来运行和调试程序将在DEBUG调试程序中详细讨论。,习题 4 一、选择题 1. 下列叙述正确的是( )。 A. 不同类型机器的指令系统不相同 B. 机器指令都是8位 C. 16位机的指令系统完全相同 D. 机器指令都是16位 2. 上机操作过程中,LINK命令执行后除生成一个可执行文件外,根据选择还可生成一个( )文件。 A. OBJ B. LST C. CRF D. MAP,二、程序填空题 1. 利用DEBUG调试下面的程序段,并完成填空。 (1)用
34、A命令在内存100H处键入下列指令内容: MOV AX,1234 ;AX=_ MOV BX,5678 ;BX=_ XCHG AX,BX ;AX=_,BX=_ MOV AH,35 ;AH=_ MOV AL,48 ;AL=_ MOV DX,75AB ;DX=_ XCHG AX,DX ;AX=_,DX=_ 用U命令检查键入的程序并填写记录,特别注意左边的机器码。用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况。并注意标志位有无变化。用命令Q退出DEBUG。,(2)内存操作数及各种寻址方式使用 MOV AX,1234 ;AX=_ MOV 1000,AX MOV BX,1002
35、MOV BYTE PTRBX,20 ;BX=_ MOV DL,39 INC BX ;BX=_ MOV BX,DL DEC DL ;DL =_ MOV SI,3 MOV BX+SI,DL ;BX+SI =_ MOV BX+SI+1,DL ;BX+SI+1 =_ MOV WORD PTRBX+SI+2,2846 ;BX+SI+2 =_,(3)累加和程序 MOV BX,1000 ;BX=_ MOV CX,10 ;CX=_ SUB AX,AX ;AX=_ LOP: ADD AL,BX ;AL=_ ADC AH,0 ;AH=_ INC BX ;BX=_ DZHJ: LOOP LOP ;CX=_ INT
36、20H 用A命令将程序键入到100H开始的内存中,在键入时记下标号LOP实际地址_和DZHJ的实际地址_,在键入LOOP指令时LOP用实际地址值代替。,2、上机完成下列程序调试 将ABC为起始地址的两位十六进制(ASC码)转换成八位二进制数存入BIN单元。 分析:采用查表法来完成十六进制数到八进制数的转换。首先要定义一张转换表,因为要转换的十六进制数是用ASC码表示,例如十六进制数5AH,在ABC单元中存储形式为35H、41H(5和A的ASC码),因此,设置起始地址从1030H开始的30H-39H(0-9)的转换表和从1041H开始的41H和46H(A-F)转换表,这样只需要分别取十六进制数的
37、高位和低位作为转换表的增量进行直接查表即可完成。,参考程序如下: DATA SEGMENTORG 1000HBIN DB ?ABC DB 5AORG 1030HDB 00H,01H,02H,03H,,09H ;09对应的二进制转换表ORG 1041HDB 0AH,0BH,0CH,0DH,0EH,0FH DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA,START: MOV AX,DATAMOV DS,AX ;初始化数据段MOV AL,ABCMOV BX,OFFSET BINXOR AH,AHADD BX,AX ;形成转移地址表 BX1035HMOV DL
38、,BXMOV CL,4SHL DL,CLMOV AL,ABC+1MOV BX,OFFSET BINXOR AH,AHADD BX,AXMOV AL,BXOR AL,DL MOV BIN,ALHLT CODE ENDSEND START,3、上机练习。用文本编辑软件Edit、WINDOWS 中的记事本或其它的文本编辑器(如TC)输入汇编语言源程序, 注意在最后一行的 END。输入完后要按一次回车键,命名并且保存。注意源文件的扩展各一定要是 .ASM (如: Example.ASM) 题目:十六进制到BCD转换。(要求将AL中的十六进制数如EFH(239D)分拆为三个BCD码,并存入Result开
39、始的3个单元中)。 参考汇编源程序如下。 DATA SEGMENT ;数据段 DAT1 DB 0EFH RESULT DB 3 DUP(?),$ DATA ENDS,STACK SEGMENT STACKSTACK ;堆栈段 STA DB 20 DUP(?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT ;代码段ASSUME CS:CODE , DS:DATA , SS:STACK , ES:DATA START: ; 程序开头必须要有的六条指令MOV AX, DATAMOV DS, AX ;送数据段地址MOV AX, STACKMOV SS, AX ;
40、送堆栈段地址MOV AX, TOPMOV SP, AX ; 程序的中间部分,MOV AX, DAT1MOV CL, 100DIV CLADD AL, 30H MOV RESULT, AL ;除以 100, 得百位数MOV AL, AHMOV AH, 0 MOV CL, 10DIV CLADD AL, 30HADD AH, 30H MOV RESULT+1, AL ;余数除以 10, 得十位数MOV RESULT+2, AH ;余数为个位数MOV AH,09H ;显示输出,MOV DX, OFFSET RESULT INT 21H ; 程序结束必须要有的两条指令MOV AX,4C00H ;返回D
41、OSINT 21H CODE ENDS END START ; 最后一行要按回车键 D:MASM50MASMDIR EBUG EXE 20,554 05-05-99 22:22 DEBUG.EXE LINK EXE 43,988 04-22-99 22:05 LINK.EXE MASM EXE 85,566 04-22-99 22:05 MASM.EXE EXAMPLE ASM 1,730 02-25-03 21:02 EXAMPLE.ASM,EXAMPLE OBJ 156 02-25-03 21:03 EXAMPLE.OBJ EXAMPLE EXE 573 02-25-03 21:03 EX
42、AMPLE.EXE10 file(s) 264,866 bytes2 dir(s) 1,043,791,872 bytes free汇编源程序操作: D:MASM50MASMMASM EXAMPLE ; Microsoft (R) Macro Assembler Version 4.00 Copyright (C) Microsoft Corp 1981, 1983, 1984, 1985. All rights reserved.50860 Bytes symbol space free,0 Warning Errors0 Severe Errors连接并生成扩展名为 .EXE 可执行文件的
43、操作: D:MASM50MASMLINK EXAMPLE ; Microsoft (R) 8086 Object Linker Version 3.05 Copyright (C) Microsoft Corp 1983, 1984, 1985. All rights reserved. D:MASM50MASM D:MASM50MASM EXAMPLE ;运行该程序对可执行文件进行调试的操作: D:MASM50MASMDEBUG EXAMPLE.EXE - -U CS:0000 ; 用反汇编命令”U 代码段地址:起始偏移地址“ 显示出程序的表示符,129D:0000 B89C12 MOV A
44、X,129C ; 程序的起始地址是 129DH:0000H 129D:0003 8ED8 MOV DS,AX 129D:0014 F6F1 DIV CL 129D:001D B10A MOV CL,0A 129D:001F F6F1 DIV CL - 129D:0008 8ED0 MOV SS,AX 129D:000A B81400 MOV AX,0014 129D:000D 8BE0 MOV SP,AX 129D:001D B10A MOV CL,0A 129D:001F F6F1 DIV CL -U,129D:0021 A20100 MOV 0001,AL 129D:0024 882602
45、00 MOV 0002,AH 129D:0028 B8004C MOV AX,4C00 ; 程序的结束地址是 129DH:0028H 129D:002B CD21 INT 21 129D:002D 0BA1D65D OR SP,BX+DI+5DD6 29D:0036 83C402 ADD SP,+02 129D:0039 C686FCF3FF MOV BYTE PTR BP+F3FC,FF 129D:003E EBAF JMP FFEF 129D:0040 3D9600 CMP AX,0096 -执行程序前观察内存中的数据 -D DS:0000 ; 用显示内存中的数据命令命令”D 数据段地址:
46、存放数据的偏移地址“ 显示内存中的数据,128C:0000 CD 20 00 A0 00 9A F0 FE-1D F0 4F 03 F1 0B 8A 03 . O. 128C:0010 F1 0B 17 03 F1 0B E0 0B-01 01 01 00 02 FF FF FF 128C:0040 07 0A 00 00 00 00 00 00-00 00 00 00 00 00 00 00 128C:0050 CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20 .!. 128C:0060 20 20 20 20 20 20 20 20-00 00
47、 00 00 00 20 20 20 . 128C:0070 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00 - -G=CS:0000 0028 ; 连续执行程序命令 代码段地址:指令的起始偏移地址 指令的结束偏移地址,AX=0302 BX=0000 CX=000A DX=0000 SP=0014 BP=0000 SI=0000 DI=0000 DS=129C ES=128C SS=12A0 CS=129D IP=0028 NV UP EI PL NZ NA PO NC 129D:0028 B8004C MOV AX,4C00 -执行程序后观察内
48、存中的数据( 结果 ) -D DS:0000 ; 用显示内存中的数据命令命令”D 数据段地址:存放数据的偏移地址“ 显示内存中的数据 129C:0000 01 02 03 00 00 00 00 00-00 00 00 00 00 00 00 00 129C:0010 B8 9C 12 8E D8 B8 A0 12-8E D0 B8 14 00 8B E0 B8 129C:0040 5D 48 50 E8 85 0C 83 C4-02 C6 14 00 00 00 28 00 HP.(. 129C:0050 9D 12 F1 0B C7 3D 98 00-74 A2 3D 9A 00 74 AE 3D .=t.=t.=,