1、第4章 第1个程序,一个源程序从写出到执行的过程 程序加载并运行的原理 程序执行过程的跟踪、调试,一、一个源程序从写出到执行的过程,第一步:编写汇编源程序,第二步:对源程序汇编,第三步:对目标文件连接,第四步:执行可执行文件的程序,可执行文件的构成: 程序和数据 相关的描述信息,ASSUME CS:CODESG CODESG SEGMENT START: MOV AX, 0123HMOV BX, 0456HADD AX, BXADD AX, AXMOV AX, 4C00HINT 21H CODESG ENDSEND,汇编 指令,伪指令,标号,二、源程序汇编源程序:用汇编语言写出的程序代码,1、
2、伪指令没有对应的机器码,不要求CPU执行具体操作,仅仅给汇编程序提供相应的汇编信息。 (程序中段的信息、堆栈的大小、调用的数据库) 例题中出现的三种伪指令:segmentends、assume、end,(1)段定义伪指令SEGMENTENDS,segment和ends是一对成对使用的伪指令,用于定义一个段。 segment说明一个段开始,ends 说明一个段结束。 格式为:段名 segment段名 ends,注:一个段必须有一个名称来标识。,(1)段定义伪指令SEGMENTENDS,段名是由用户自己任意选定的,符合标识符定义规则的一个名称。,最好选用与该逻辑段用途相关的名称。如第一个数据段为D
3、ATA1,第二个数据为DATA2等。,一个段的开始与结尾用的段名必须一致。,(2)汇编结束伪指令END 格式: END 标号 功能:表示源程序到此结束,对其后的语句不再进行汇编。 说明:一个源程序必须有且只能有一个END语句,一般放在源程序的最后一行。,ASSUME CS:CODESG CODESG SEGMENT START: MOV AX, 0123HMOV BX, 0456HADD AX, BXADD AX, AXMOV AX, 4C00HINT 21H CODESG ENDSEND,START,如果要加标号,则标号与程序中第一条指令语句前所加的标号必须一致。,若源程序是一个独立的程序或
4、主模块,则伪指令END后面一定要附带标号;如果源程序仅是一个普通模块,则END后面就一定不能附带标号。,(3) 段分配伪指令 ASSUME 格式: ASSUME 段寄存器:段名 , 段寄存器:段名, 功能:用于说明源程序中定义的段由哪个寄存器去寻址,即建立段寄存器与段之间的对应关系。,注意:段寄存器名必须是CS、DS、ES、SS中的一个,段名必须是由SEGMENT定义的段名,例如:ASSUME CS:CSEG, DS:DSEG, ES:ESEG, SS:SSEG,(3)ASSUME 段分配伪指令 例: ASSUME CS:CODE, DS:DATA, SS:STACK CODE SEGMENT
5、MOV AX, 1234HMOV DS, AXCODE ENDSEND,一般放在源程序首行或代码段的第一行位置,CODESG SEGMENTASSUME CS:CODESG START: MOV AX, 0123HMOV BX, 0456HADD AX, BXADD AX, AXMOV AX, 4C00HINT 21H CODESG ENDSEND,ASSUME并不设置各个段寄存器的具体内容,段寄存器的值(除CS外)是在程序运行时用MOV指令设定的。,2、标号:代表某一存储单元地址的名字,一个标号指代了一个地址。 功能 供转移和循环指令控制转移 格式 标号 汇编语言指令,ASSUME CS:C
6、ODESG CODESG SEGMENT START: MOV AX, 0123HMOV BX, 0456HADD AX, BXADD AX, AXMOV AX, 4C00HINT 21H CODESG ENDSEND,汇编指令中的标号必须以冒号结束,而伪指令中的标号后不可以有冒号!,2、标号:代表某一存储单元地址的名字标识符命名原则: 字母:AZ数字:09特殊字符:? . _ $ 注意:数字不能作名称的第一个字符。圆点只能用作第一个字符,标号最长为31个字符。,3、源程序中的“程序”,ASSUME CS:CODESG CODESG SEGMENT START: MOV AX,0123HMOV
7、 BX,0456HADD AX,BXADD AX,AXMOV AX,4C00HINT 21H CODESG ENDS END,描述信息,B8 23 01 BB 56 04 03 C3 03 C0 B8 00 4C CD 21,编译连接,MOV AX,0123H MOV BX,0456H ADD AX,BX ADD AX,AX MOV AX,4C00H INT 21H,4、汇编语言源程序的结构,完整的汇编语言源程序由段组成; 可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列; 需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点; 所有的可执
8、行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内; 通常,程序还需要一个堆栈段,段定义时一般最后定义代码段。,定义堆栈段,定义数据段,定义代码段,END,ASSUME,段分配,程序结束,MAIN:,例:编程运算2 3,assume cs:abc abc segmentmov ax, 2add ax, axadd ax, ax abc endsend,1、定义一个段,名字为abc 2、在段中写入汇编指令,实现任务 3、指出程序何处结束 4、将abc段作为代码段,ASSUME CS:CODESG CODESG SEGMENT START: MOV AX, 0123HMOV BX,
9、0456HADD AX, BXADD AX, AXMOV AX, 4C00HINT 21H CODESG ENDSEND,5、程序的执行与返回,如何运行可执行程序P2? 正在运行的程序P1调用P2,将P2加载到内存,并将CPU控制权交给P2,P2得以运行。 P2运行结束要将CPU控制权交还给P1,这个过程称为程序返回。, 段结束,伪指令,汇编程序执行, 程序结束,伪指令,汇编程序执行,语法错误:程序在汇编时被汇编程序发现的错误。 逻辑错误:源程序汇编后运行时发现的错误。,6、语法错误和逻辑错误,asume cs:abc abc segmentmov ax, 2add ax, axadd ax,
10、 ax abc endsend,assume,三、编写汇编源程序 使用工具:可使用各种文本编辑工具(记事本、写字板、WORD等),我们使用DOS下的EDIT文本编辑器。 功能:产生一个存储源程序的文本文件。 使用方法:在DOS下运行EDIT.EXE程序。 1、 DOS提示符后面输入EDIT 1.asm,回车; 2、 输入汇编源程序并保存。,使用工具:使用汇编程序MASM5.0 功能:使用汇编程序对源程序文件进行汇编,生成包含机器代码的目标文件( .obj)。 使用方法:在DOS下运行MASM.EXE程序(假设汇编程序放在D:MASM目录下)。 1、 D:MASMMASM.EXE 2、输入要进行
11、汇编的源程序文件路径及名称。 3、输入汇编后产生的目标文件保存的路径及名称。 4、输入列表文件名: 5、输入交叉文件名:,四、对源程序进行汇编,使用工具:使用 LINK . EXE连接器 功能:对目标文件进行连接,从而得到一个可执行文件 . EXE 。 使用方法:在DOS下运行LINK . EXE程序。 1、 D:MASMLINK . EXE 2、输入要进行连接的目标文件路径及名称。 3、输入进行连接后产生的可执行文件 .exe 保存的路径及名称。 4、输入映像文件名: 5、输入库文件名:,五、对目标文件进行连接,连接的作用: 当源程序较大时,汇编程序会将源程序文件分成多个部分来编译,每个源程
12、序编译成为目标文件后,再用连接程序将它们连接在一起,生成一个可执行文件。 程序中调用了某个库文件中的内容时,需要将这个库文件和该程序生成的目标文件连接在一起。 一个源程序汇编后,得到了存有机器码的目标文件,目标文件中有的内容不能直接生成可执行文件,必须通过连接程序将这些内容处理为最终可执行的信息。,忽略中间文件,仅产生目标文件和可执行文件,保存在当前路径下。 D:MASMMASM XXX; D:MASMLINK XXX;七、可执行文件.exe的执行,六、以简化的方式进行编译和连接,八、可执行文件中的程序装入内存并运行的原理,CPU,内存,硬盘,DATA SEGMENTDATA ENDS COD
13、E SEGMENTCODE ENDS,command,?,操作系统的外壳操作系统是由多个功能模块组成的庞大、复杂的软件系统。任何通用的操作系统,都要提供一个称为外壳(shell)的程序,用户使用这个程序来操作计算机系统进行工作。 就是DOS系统的外壳,在DOS中称为命令解释器。DOS启动时,先完成其他重要的初始化工作,然后运行command , command 运行后,在屏幕上显示出“C:”,然后等待用户的输入。如果用户要执行一个程序,则输入该程序的可执行文件的名称,command首先根据文件名找到可执行文件,然后将这个可执行文件中的程序加载入内存,设置CS:IP指向程序的入口。此后,comm
14、and 暂停运行,由CPU运行程序。程序运行结束后,返回到command中。,使用工具:Debug 使用方法:在DOS下运行DEBUG . EXE程序。 D:MASMDEBUG xxx.EXE,九、程序执行过程的跟踪,在DOS中可执行文件.EXE中程序加载的过程,xxxx:0000,PSP,xxxx+10h:0000,程 序,1、找到一段起始地址为xxxx:0000的容量足够的空闲内存区。,2、在这段内存区的前256个字节中,创建一个称为程序段前缀(PSP)的数据区,DOS要利用PSP来和被加载的程序进行通信;,3、从xxxx+10H:0开始,将程序装入,程序的地址被设为xxxx+10H:0,4、将该内存区的段地址存入DS中,初始化其他相关寄存器后,设置CS:IP指向程序入口。,程序加载后,ds=xxxx 为程序加载的段地址。,数据区,堆栈区,代 码 区,注意:PSP区和程序区虽然物理地址连续,但为更好的区分,DOS将它们划分到不同的段中。,