汇编语言第4章_第1页
汇编语言第4章_第2页
汇编语言第4章_第3页
汇编语言第4章_第4页
汇编语言第4章_第5页
已阅读5页,还剩92页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第4章 汇编语言程序设计v4.1 一个源程序从写出到执行的过程v4.2 源程序v4.3 编辑源程序v4.4 编译v4.5 连接v4.6 以简化的方式进行编译和连接v4.7 1.exe的执行v4.8 可执行文件中的程序装入内存并运行的原理v4.9 程序执行过程的跟踪引言v现在我们将开始编写完整的汇编语言程序,用编译器将它们编译成为可执行文件(如:*.exe文件),在操作系统中运行。v这一章,我们将编写第一个这样的程序。4.1 一个源程序从写出到执行的过程v一个汇编语言程序从写出到最终执行的简要过程: 编写-编译-连接-执行编写汇编源程序v使用文本编辑器(如Edit、记事本等),用汇编语言编写汇编

2、源程序。对源程序进行编译连接v使用汇编语言编译程序对源程序文件中的源程序进行编译,产生目标文件;再用连接程序对目标文件进行连接,生成可在操作系统中直接运行的可执行文件。可执行文件v可执行文件中包含两部分内容:程序(从原程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据)相关的描述信息(比如:程序有多大、要占多少内存空间等)执行可执行文件中的程序v在操作系统中,执行可执行文件中的程序。v操作系统依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存,并进行相关的初始化(比如:设置CS:IP指向第一条要执行的指令),然后由CPU执行程序。4.2 源程序v汇编指令v伪指令 XX

3、X segment XXX ends end assume4.2 源程序v汇编指令有对应的机器码的指令,可以被编译为机器指令,最终为CPU所执行。4.2 源程序v伪指令没有对应的机器码的指令,最终不被CPU所执行。v谁来执行伪指令呢?伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作。它可以完成:数据定义,分配存储区,指示程序结束等功能。本课件由汇编网()制作提供 伪操作(伪指令)伪操作(伪指令) 伪操作是汇编程序对源程序进行汇编时处理的操作,完成处理器选择、存储模式定义、数据定义、存储器分配、指示程序开始结束等功能。 处理器选择伪操作 段定义伪操作 程序开始和结束伪操作 数据

4、定义及存储器分配伪操作 表达式赋值伪操作 地址计数器与对准伪操作 基数控制伪操作定义一个段v segment和ends是一对成对使用的伪指令,这是在写可被编译器编译的汇编程序时,必须要用到的一对伪指令。v segment和ends的功能是定义一个段,segment说明一个段开始,ends 说明一个段结束。v一个段必须有一个名称来标识,使用格式为: 段名 segment 段名 ends定义一个段v一个汇编程序是由多个段组成的,这些段被用来存放代码、数据或当作栈空间来使用。v一个有意义的汇编程序中至少要有一个段,这个段用来存放代码。程序结束标记vEnd 是一个汇编程序的结束标记,编译器在编译汇编程

5、序的过程中,如果碰到了伪指令 end,就结束对源程序的编译。v如果程序写完了,要在结尾处加上伪指令end 。否则,编译器在编译程序时,无法知道程序在何处结束。v注意:不要搞混了end和ends。寄存器与段的关联假设vassume:含义为“假设”。v它假设某一段寄存器和程序中的某一个用 segment ends 定义的段相关联。v通过assume说明这种关联,在需要的情况下 ,编译程序可以将段寄存器和某一个具体的段相联系。4.2 源程序v源程序中的“程序”汇编源程序: 伪指令 (编译器处理) 汇编指令(编译为机器码)程序:源程序中最终由计算机执行、处理的指令或数据。注意注意v我们可以将源程序文件

6、中的所有内容称为源程序,将源程序中最终由计算机执行处理的指令或数据 ,成为程序。v程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中,v图示程序经编译连接后变为机器码4.2 源程序v标号一个标号指代了一个地址地址。codesg:放在segment的前面,作为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址。4.2 源程序v程序的结构任务:编程运算 23。v定义一个段v实现处理任务v程序结束v段与段寄存器关联 汇编程序 assume cs:abc abc segment mov ax,2 add ax,ax add ax,ax abc end

7、s end 4.2 源程序v程序返回我们知道,一个程序结束后,将CPU的控制权交还给使它得以运行的程序,我们称这个过程为:程序返回。如何返回呢?DOS中的程序运行vDOS是一个单任务操作系统。一个程序P2在可执行文件中,则必须有一个正在运行的程序P1,将P2从可执行文件中加载入内存后,将CPU的控制权交给P2,P2才能得以运行。P2开始运行后,P1暂停运行。而当P2运行完毕后,应该将CPU的控制权交还给使它得以运行的程序P1,此后,P1继续运行。4.2 源程序v程序返回应该在程序的末尾添加返回的程序段。 mov ax,4c00H int 21Hv这两条指令所实现的功能就是程序返回。v几个和结束

8、相关的内容段结束、程序结束、程序返回参数、变量和标号参数、变量和标号v下面详细讨论汇编语言程序语句的主要部分:参数 变量名 标号v并引出相关的伪指令和操作符v本节重点掌握:常数的表达变量定义伪指令DB/DW/DD地址操作符和类型操作符变量定义伪指令变量定义伪指令v变量定义(Define)伪指令为变量申请固定长度的存储空间,并可同时将相应的存储单元初始化变量名 伪指令助记符 初值表 变量定义伪指令最常使用变量定义伪指令最常使用变量名v变量名为用户自定义标识符,表示初值表首元素的表示初值表首元素的逻辑地址逻辑地址;用这个符号表示地址,常称为符号地址v变量名可以没有。这种情况,汇编程序将直接为初值表

9、分配空间,无符号地址v设置变量名是为了方便存取它指示的存储单元变量定义伪指令助记符变量定义伪指令助记符v变量定义伪指令根据申请的主存空间单位分类vDB定义字节伪指令定义字节伪指令vDW定义字伪指令定义字伪指令vDD定义双字伪指令定义双字伪指令vDF定义3字伪指令vDQ定义4字伪指令vDT定义10字节伪指令v还有定位伪指令定义字节单元伪指令DBDB伪指令用于分配一个或多个字节单元,并可以将它们初始化为指定值初值表中每个数据一定是字节量(Byte),存放一个8位数据: 可以是0255的无符号数 或是128127带符号数 也可以是字符串常数datasegment;数据段Xdb a,-5db 2 du

10、p(100),?Ydb ABCdataends字节单元定义实例字节单元定义实例 43H 42H 41H 64H 64H FBH 61HYXdata数据段偏移地址偏移地址存储单元存储单元0001H0002H0003H0004H0005H0006H0007H0000H初值表初值表movmov al,X al,X;此处X表示它的第1个数据,故ALadecdec X+1 X+1;对X为始的第2个数据减1,故成为-6movmov Y,al Y,al;现在Y这个字符串成为 aBC字节变量的应用字节变量的应用定义字单元伪指令DWDW伪指令用于分配一个或多个字单元,并可以将它们初始化为指定值初值表中每个数据一

11、定是字量(Word),一个字单元可用于存放任何16位数据: 一个段地址一个偏移地址 两个字符 065535之间的无符号数 3276832767之间的带符号数datasegment;数据段countdw 8000h,?,ABmaxint equequ 64hnumber dw maxintarraydw maxint dup(0)dataends字单元定义实例字单元定义实例 00Hnumbercountdata数据段偏移地址偏移地址存储单元存储单元0000H0002H0004H0006H0008H000aH 80H - - 42H 41H 64H 00H 00H 00H 00H 00H arra

12、y初值表初值表v初值表是用逗号逗号分隔的参数v主要由数值常数数值常数、表达式或?、表达式或?、DUP组成组成?表示初值不确定,即未赋初值;DUP表示重复初值DUP的格式为:重复次数 DUP(重复参数)DUPvdup是一个操作符,在汇编语言中同db、dw、dd 等一样,也是由编译器识别处理的符号。v它是和db、dw、dd 等数据定义伪指令配合使用的,用来进行数据的重复。v示例dupvdup示例db 3 dup (0) 定义了3个字节,它们的值都是0, 相当于 db 0,0,0dup示例db 3 dup (0,1,2) 定义了9个字节,它们是 0、1、2、0、1、2、0、1、2, 相当于 db 0

13、,1,2,0,1,2,0,1,2 dupvdup示例db 3 dup (abc,ABC) 定义了18个字节,它们是 abcABCabcABCabcABC, 相当于db abcABCabcABCabcABCdupv可见,dup的使用格式如下:db 重复的次数 dup (重复的字节型数据)dw 重复的次数 dup (重复的字型数据)dd 重复的次数 dup (重复的双字数据)dupvdup是一个十分有用的操作符 比如我们要定义一个容量为 200 个字节的栈段,如果不用dup,则必须用这样的格式: stack segment dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

14、0,0,0 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 stack endsdupv当然,读者可以用dd,使程序变得简短一些,但是如果要求定义一个容量为1000字节或10000字节的呢? 如果没有dup,定义部分的程序就变得太长了; 有了dup就可以轻松解决。如下: stack segment db

15、 200 dup (0) stack ends 返回本课件由汇编网()制作提供 段定义伪操作:段定义伪操作:完整的段定义格式完整的段定义格式 data segment data segment ; 定义数据段定义数据段 data endsdata ends;-;-extra segment extra segment ; 定义附加段定义附加段 extra endsextra ends;-;-code segment code segment ; 定义代码段定义代码段 assume cs:code, ds:data, es:extraassume cs:code, ds:data, es:ext

16、rastart: start: mov mov ax, data ax, data mov ds mov ds, ax , ax ; 段地址段地址 段寄存器段寄存器 code endscode ends end start end startPSPPSPDSDSESESSSSSCSCSEXE程序的内存映象图装入模块文件头过程定义伪指令过程定义伪指令v格式格式:过程名字过程名字 + PROC + 类型属性类型属性(near/ far) 过程名字过程名字 + ENDPvfar和near是子程序调用时的参数v如果子程序和调用程序在一个段内,子程序参数设置为nearv如果子程序和调用程序不在一个段内,

17、子程序参数设置为farv“main proc far” v注释:注释:这是定义一个子程序的第一行。子程序名是main,类型far。就是说main这个子程序可以被不跟main在同一个段内的程序调用。即主程序和子程序的段基址不同时主程序也可以调用子程序。例如:主程序code的段基址在CS中,子程序main的段基址在ES中,且CS和ES中的内容不同,子程序的类型是far时,code可以调用main。否则,不能调用。 code segmentmain proc farmain proc far assume start: push ds mov ax, 0 push ax retmain endpma

18、in endpcode ends end startcode segmentmain proc far assume start: mov ax,4c00h int 21hmain endpcode ends end start本课件由汇编网()制作提供其他伪操作其他伪操作本课件由汇编网()制作提供 地址计数器与对准伪操作:地址计数器与对准伪操作:地址计数器地址计数器 $ :保存当前正在汇编的指令的地址保存当前正在汇编的指令的地址 ORG $+8 ; 跳过8个字节的存储区 JNE $+6 ; 转向地址是 JNE 的首址 +6 JMP $+2 $ 用在伪操作的参数字段:用在伪操作的参数字段:表示

19、地址计数器的当前值表示地址计数器的当前值 ARRAY DW 1, 2 , $+4 , 3 , 4 , $+4 00H00H 01H 00H 02H 00H 7CH7CH 00H00H 03H 00H 04H 00H 82H82H ARRAY ARRAY 007E007E0078007800740074本课件由汇编网()制作提供SIZE SIZE 变量变量功能:功能:LENGTH LENGTH * * TYPE TYPEOFFSETOFFSET / SEGSEG 变量变量 / 标号标号功能:回送变量或标号的偏址功能:回送变量或标号的偏址 / / 段址段址TYPETYPE 变量变量 / 标号标号

20、/ 常数常数 DB DW DD DF DQ DT NEAR FAR DB DW DD DF DQ DT NEAR FAR 常数常数 1 2 4 6 8 10 -1 -2 01 2 4 6 8 10 -1 -2 0LENGTH LENGTH 变量变量功能:回送由功能:回送由DUP定义的定义的变量的单元数,其它情况回送变量的单元数,其它情况回送1 1本课件由汇编网()制作提供类型类型 PTR PTR 表达式表达式 MOV WORD PTRPTR BX, 5段操作符段操作符 MOV ES:ES: BX, ALSHORT SHORT 标号标号 JMP SHORTSHORT NEXT本课件由汇编网()制

21、作提供 end本课件由汇编网()制作提供v后面内容仅限上机使用,可以不看上机部分上机部分4.4 编辑源程序v进入DOS方式,运行Edit,在其中编辑程序,如下图所示:4.4 编译v进入DOS方式,进入 C:masm 目录,运行masm.exe。v如果源程序文件不是以 asm 为扩展名的话,就要输入它的全名。比如p1.txt。v在输入源程序文件名的时候一定要指明它所在的路径。如果文件就在当前路径下,只输入文件名就可以。4.4 编译v输入要编译的源文件文件名后,按 Enter键。v目标文件(*.obj)是我们对一个源程序进行编译要得到的最终结果。v编译程序默认要输出的目标文件名为1.obj,所以可

22、以不必再另行指定文件名。4.4 编译v列表文件是编译器将源程序编译为目标文件的过程中产生的中间结果。v可以不生成这个文件,直接按 Enter键即可。4.4 编译v编译程序提示输入交叉引用文件的名称。v这个文件同列表文件一样,是编译器将源程序编译为目标文件过程中产生的中间结果。v可以不生成这个文件,直接按 Enter 键即可。4.4 编译v对源程序的编译结束,编译器输出的最后两行告诉我们这个源程序没有警告错误和必须要改正的错误。4.4 编译v一般来说,有两类错误使我们得不到所期望的目标文件:(1)我们程序中有“Severe Errors”;(2)找不到所给出的源程序文件。4.5 连接v在对源程序

23、进行编译得到目标文件后,我们需要对目标文件进行连接,从而得到可执行文件。v继续上一节的过程,我们再将C:masm1.obj连接为C:masm1.exe。4.5 连接v进入DOS方式,进入C:masm目录,运行link.exe。v如果目标文件不是以obj为扩展名的话,就要输入它的全名。比如:p1.bin。v在输入目标文件名的时候,要注意指明它所在的路径。这里,我们要连接的文件是当前路径下1.obj,所以此处输入“1”。4.5 连接v输入要连接的目标文件名后,按Enter键。v可执行文件是我们对一个程序进行连接要得到的最终结果。v连接程序默认要输出的可执行文件名为 1.EXE ,所以可以不必再另行

24、指定文件名。v我们直接按 Enter 键,使用连接程序设定的可执行文件名。4.5 连接v映像文件是连接程序将目标文件连接为可执行文件过程中产生的中间结果。v可以不生成这个文件,直接按 Enter 键即可。4.5 连接v连接程序提示输入库文件的名称。v库文件里包含了一些可以调用的子程序,如果我们的程序中调用了某一个库文件中的子程序,就需要在连接的时候,将这个库文件和我们的目标文件连接到一起,生成可执行文件。v如果没有调用任何子程序,直接按Enter键即可。4.5 连接v对目标文件的连接结束,连接程序输出的最后一行告诉我们,这个程序有一个警告错误:“没有栈段” ,这里我们不理会这个错误。4.5 连

25、接v前面我们通过对 1.obj 进行连接的过程,展示了使用连接器对目标文件进行连接的方法。v我们得到了一个新的文件 1.exe 。当然,如果连接过程中出现错误,那么我们将得不到这个可执行文件。v连接的作用是什么呢?4.5 连接v这里再次强调一下,我们学习汇编的主要目的,就是通过用汇编语言进行编程而深入地理解计算机底层的基本工作机理,达到可以随心所欲地控制计算机的目的。v基于这种考虑,我们的编程活动,大都是直接对硬件进行的。我们希望直接对硬件编程,却并不希望用机器码编程。4.5 连接v我们用汇编语言编程,就要用到 :编辑器(Edit)、编译器(masm)、连接器(link)、调试工具(debug

26、)等所有工具,而这些工具都是在操作系统之上运行的程序,所以我们的学习过程必须在操作系统的环境中进行。4.5 连接v我们在一个操作系统环境中,使用了许多工具,这势必要牵扯到操作系统、编译原理等方面的知识和原理。v我们只是利用这些环境、工具来方便我们的学习,而不希望这些东西分散了我们的注意力。4.5 连接v所以,对于涉及到而又不在我们学习的主要内容之中的东西,我们只做简单的解释。4.5 连接v连接的作用有以下几个:当源程序很大时,可以将它分为多个源程序文件来编译,每个源程序编译成为目标文件后,再用连接程序将它们连接到一起,生成一个可执行文件;程序中调用了某个库文件中的子程序,需要将这个库文件和该程

27、序生成的目标文件连接到一起,生成一个可执行文件;4.5 连接v连接的作用有以下几个(续):一个源程序编译后,得到了存有机器码的目标文件,目标文件中的有些内容还不能直接用来生成可执行文件,连接程序将这此内容处理为最终的可执行信息。所以,在只有一个源程序文件,而又不需要调用某个库中的子程序的情况下,也必须用连接程序对目标文件进行处理,生成可执行文件。v注意,对于连接的过程,可执行文件是我们要得到的最终结果。4.6 以简化的方式进行编译和连接v我们编译、连接的最终目的是用源程序文件生成可执行文件。v在这个过程中所产生的中间文件都可以忽略。我们可以用一种较为简捷的方式进行编译、连接。4.6 以简化的方

28、式进行编译和连接v编译:4.6 以简化的方式进行编译和连接v连接:4.7 1.exe的执行v现在,终于将我们的第一个汇编程序加工成了一个可在操作系统下执行的程序文件。1.exe的执行情况:v程序到底运行没有?程序当然运行了,只是从屏幕上不可能看到任何运行结果。4.7 1.exe的执行v我们的程序没有像显示器输出任何信息。程序只是做了一些将数据送入寄存器和加法的操作,而这些事情,我们不可能从显示屏上看出来。v程序执行完成后,返回,屏幕上再次出现操作系统的提示符。4.8 可执行文件中的程序装入内存并运行的原理v在DOS中,可执行文件中的程序P1若要运行,必须有一个正在运行的程序P2 ,将 P1 从

29、可执行文件中加载入内存,将CPU的控制权交给它,P1才能得以运行;当P1运行完毕后,应该将CPU的控制权交还给使它得以运行的程序P2。v1.exe的执行过程4.8 可执行文件中的程序装入内存并运行的原理v1.exe的执行过程:(1)我们在提示符“C:masm”后面输入可执行文件的名字“1”,按Enter键。 问题4.1(2)1.exe中的程序运行;(3)运行结束,返回,再次显示提示符“C:masm”。 问题4.2 问题4.1v执行第(1)步操作时,有一个正在运行的程序将1.exe中的程序加载入内存,这个正在运行的程序是什么?它将程序加载入内存后,如何使程序得以运行? 问题4.2v执行第(3)步

30、操作,程序运行结束后,返回到哪里?v参考内容v回答问题4.1和4.2操作系统的外壳v操作系统是由多个功能模块组成的庞大 、复杂的软件系统。任何通用的操作系统 ,都要提供一个称为shell(外壳)的程序 ,用户(操作人员)使用这个程序来操作计算机系统工作。vDOS中有一个程序 ,这个程序在 DOS 中称为命令解释器,也就是DOS系统的shell。回答问题4.1和4.2v(1)我们在DOS中直接执行 1.exe 时,是正在运行的command将1.exe中的程序加载入内存。v(2)command设置CPU的CS:IP指向程序的第一条指令(即程序的入口),从而使程序得以运行。v(3)程序运行结束后,返回到command中,CPU继续运行command。4.8 可执行文件中的程序装入内存并运行的原理v汇编程序从写出到执行的过程:4.9 程序执行过程的跟踪v为了观察程序的运行过程 ,我们可以使用Debug。vDebug 可以将程序加载入内存,设置CS:IP指向程序的入口,但Debug并不放弃对CPU 的控制,这样,我们就可以使用Debug 的相关命令来单步执行程序 ,查看每条指令指令的执行结果。4.9 程序执行过程的跟踪v接下来可以用R命令看一下各个寄存器的设置情况:v可以看到,Deb

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论