微机原理第八章.ppt

上传人:小飞机 文档编号:6572837 上传时间:2023-11-13 格式:PPT 页数:44 大小:1.25MB
返回 下载 相关 举报
微机原理第八章.ppt_第1页
第1页 / 共44页
微机原理第八章.ppt_第2页
第2页 / 共44页
微机原理第八章.ppt_第3页
第3页 / 共44页
微机原理第八章.ppt_第4页
第4页 / 共44页
微机原理第八章.ppt_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《微机原理第八章.ppt》由会员分享,可在线阅读,更多相关《微机原理第八章.ppt(44页珍藏版)》请在三一办公上搜索。

1、第八章 汇编语言程序设计,1、什么叫指令?指令由哪两个部分构成?什么是助记符?指令语句的基本格式。2、什么是寻址方式?操作数 可能 在什么地方?3、8088/8086的六大类指令?,数据传送类算术运算类逻辑运算与移位类串操作类控制转移类处理器控制类,汇编语言(Assembly Language)汇编语言是一种面向机器的程序设计语言,它是一种低级语言。它直接利用机器提供的指令系统编写程序,具体地说,用助记符表示指令的操作码和操作数,用标号或符号代替地址、变量和常量。因此可以说,汇编语言是对机器语言的符号化描述。汇编语言源程序(Source File)用汇编语言指令编写的程序称为汇编语言源程序或汇

2、编源程序。通常,汇编源程序以.ASM为扩展名,这是汇编程序默认的扩展名。汇编程序(Assembler)汇编程序是将汇编源程序转变为相应目标程序的翻译程序。这个转变的过程称为汇编。汇编程序按其功能范围又可以分为基本汇编、小汇编和宏汇编(Micro-Assembler)。宏汇编能够对包含宏指令及大量伪指令的汇编语言源程序进行汇编,相对而言,功能较强。我们常用的宏汇编程序有微软公司的MASM.EXE和Borland公司的TASM.EXE(Turbo Assembler)。,机器码,助记符,机器码,反汇编,汇编,ASCII码,面向用户,B81514,MOV AX,1415H,B81514,宏汇编程序的

3、主要功能:1、检查源程序。2、检测出源程序中的语法错误,给出相应的出错信息。3、若没有语法错误,产生目标文件,并可给出列表文件(.LST,同时列出汇编语言和机器语言的文件)。4、展开宏指令。,目标程序(Object Program)目标程序也称为机器语言程序,是微处理器真正可以执行的程序。这种程序的指令都是用二进制代码来表示其操作码和操作数的机器语言指令。汇编语言源程序同其他高级语言源程序一样都需要将它翻译成目标程序才能在计算机中运行。,连接程序(Link Program)汇编后,程序中每个段的开始地址值都置为0,程序装入内存,各段的段地址必须在0地址的基础上浮动一个值,此值要在连接时才确定。

4、连接程序还有一个更重要的功能是可以把多个程序模块连接起来形成一个装入模块,这样,对于每个单独的模块中的外部符号的值是汇编程序无法确定的(因为每个模块是单独汇编的),必须由连接程序来确定。连接程序可以将各种语言编写的源程序经各自的编译程序编译产生的目标程序(扩展名为.obj)、目标程序库 装配成一个可执行程序。当然各目标程序间必须建立必要的通信接口。连接程序的主要工作是:1、找到要连接的所有目标模块。2、对所有的目标模块中的所有的段分配内存单元,即确定所有的段地址值。3、确定所有汇编程序不能确定的偏移地址值(符号地址)。4、构成一个装入模块,即可执行程序。也可给出.MAP文件,文件中记录的是每个

5、段在内存中的分配情况。,可执行程序(Executive Program)可执行程序或称可执行文件是指可以被系统装入内存运行(执行指令)的程序。扩展名为.COM、.EXE等。可执行程序依然是一个存放在外存中的静态程序。它们可以直接被MS-DOS操作系统、调试程序DEBUG装入内存,由微处理器执行(运行)。从连接程序生成的可执行程序的连接映象文件.MAP可以看出,可执行程序的内存分配起始地址依然为0,因此还需要最终确定这个起始地址,将这个可执行程序安全地装入内存(不能同其他内存数据地址发生冲突。例如,从00000H003FFH存放的是中断向量表,DOS操作系统也有常驻内存的部分等等)。假设在DOS

6、下执行用户程序SAMPLE.EXE:C:SAMPLE回车后就开始运行,其过程大致为:首先由DOS的COMMAND.COM在内存中用户程序可以使用的区域建立一个256个字节的程序段前缀PSP(Program Segment Prefix),它包含了执行程序的有关信息和返回DOS的路径(断点保存)。建立PSP以后,可执行程序才被调入内存,将可执行程序放在PSP的后面,也就是最终确定了可执行程序中所有的代码在内存中的实际地址。此时CS:IP的值指向可执行程序代码段的第一条指令,可执行程序开始运行。,语句类型l 指令语句:格式为:标号:助记符 操作数;注释每条语句一般占一行,支持续行符。l 伪指令语句

7、伪指令语句是为汇编程序和连接程序提供一些必要的控制信息的管理性语句,伪指令不产生目标代码。伪指令语句对应的伪操作是在汇编过程中完成的,而指令语句对应的操作是在可执行程序运行时完成。伪指令语句的格式为:名字 伪操作指令 操作数表;注释其中,名字不能用:作为结尾,名字可以是符号常量名、段名、变量名、过程名、宏名、结构名、记录名等,由不同的伪指令决定。操作数是由,分开的一系列操作数(参数)。,宏指令语句宏指令是具有名称的一段由指令和伪指令语句组成的序列,它实际上是一段汇编语句序列的缩写;在汇编时,汇编程序用对应的代码序列替代宏指令,这个过程又称宏展开,展开后在逐条进行汇编。因此,宏指令只节省源程序篇

8、幅。宏指令语句的格式:宏名 MACRO 形式参数表,名字和标号统称为标识符(Identifier)。标识符的命名必须遵循以下规则:标识符 由字母(az,AZ)、数字(09)或某些特殊符号(如_$?.等)组成;标识符 不能以数字开头,“?”、“$”不能单独作为标识符;标识符是一串连续的符号,中间不能有空格符;标识符中若使用点号“.”,点号必须是第一个字符;标识符 有效长度为31个字符,若超过只保留前31个字符;在一个特定的源程序文件中,用户定义的标识符必须是唯一的;不能使用汇编语言的保留字。汇编语言的保留字为硬指令助记符、伪指令助记符、操作符、运算符、寄存器名和预定义符号等组成。由于汇编程序不区

9、别字母大小写(大小写不敏感),所以标识符ABC、abc、Abc是相同的。这一点和C语言不同。,常量、变量和标识符汇编语言的数据可简单地分为常量和变量。常量可作为指令语句的立即数或伪指令的参数,变量主要作为内存操作数。名字和标号(标识符)具有逻辑地址和类型属性,主要用做地址操作数,也可以作为立即数和存储器操作数的名称。常量是没有任何属性的纯数值。在汇编期间,它的二进制值已能完全确定,且在程序运行中,它也不会发生变化。它可以有如下几种表达形式:,(2)字符串字符串常量是由单引号和双引号括起来的单个字符或多个字符,其数值是每个字符的ASCII码值。例如:d=64h,AB=4142h,Hello,As

10、sembly!等。(3)符号常量符号常量用标识符表达一个数值。常量若用有意义的符号名来表示,可以提高源程序的可读性。MASM提供等价机制,用来为常量定义符号名。(4)数值表达式数值表达式是指由操作符(Operator)连接而构成、具有固定数值(能被计算并产生固定数值)的表达式。汇编程序在汇编过程中计算数值表达式,最终得到一个确定的数值,所以也是常量。由于数值表达式是在汇编阶段计算,所以组成数值表达式的各部分必须在汇编时就能确定。,常 量,变量实质上就是内存数据,这些数据在程序运行期间可以修改。为了便于对变量的访问,它常常以变量名的形式出现在程序中,也可将变量名当作是内存单元的符号地址。变量需事

11、先定义才能使用。名字和标号是汇编语言语句(指令或伪指令语句)的第一部分,是由用户命名的标识符。名字存在于一条伪指令语句中,标号存在于一条指令语句中,后面跟:。名字可以是符号常量名、段名、变量名、过程名、宏名、结构名、记录名等,由不同的伪指令决定。名字和标号一经使用便具有两个属性(符号常量名除外):(1)地址属性-名字和标号对应确定的内存单元的逻辑地址,包括段地址和偏移地址;(2)类型属性-可以是下列类型:,1、符号定义伪指令符号定义伪指令有“等价EQU”和“等号=”伪指令。它们的格式为:符号名 EQU 表达式符号名=表达式其中,表达式可以是一个常数,一个可以求出常数值的数值表达式或一个寄存器名

12、、一个指令助记符等。例如:CN EQU 100CN1 EQU CN+100C EQU CXM EQU MOVB EQU ES:BX+20,注意:A、由EQU定义的符号在整个程序中不能被再次定义。但“=”允许重复定义,“=”后的表达式只能是数值表达式。B、EQU和“=”定义的符号不占用内存单元。C、用符号定义伪指令可以增强程序的可读性,并且便于程序的修改。2、数据定义伪指令数据定义(Define)伪指令可以为数据分配存储单元、为该存储单元赋予一个变量名及初值。数据定义伪指令格式:变量名 DB/DW/DD/DQ/DT 初值表达式1,初值表达式2,;注释,其中,DQ、DT伪指令可用于浮点数。中的内容

13、为可选项,各初值表达式可以是整数、字符、字符串、数值表达式、?、使用重复操作符DUP来定义的数值。“?”表示初值不确定,即未赋初值。变量具有逻辑地址。在程序代码中,通过对变量名的直接引用,指向定义的第一个数据,通过变量名加减 位移量 存取(访问)以第一个数据为基地址的前后数据。,例 变量名的定义和应用。;数据段BVAR1 DB 100,01100100B,144Q,64H,D,-156;字节变量:不同进制表达同一数值,内存中有连续的6个64H。;注意:-156是容易让人糊涂的表达,尽量避免。;注意:若用BCD码表示十进制数,十进制数的每一位是用二进制码代替的。MININT=5;符号常量不占内存

14、BVAR2 DB-1,MININT,MININT+5;内存中的数据依次为FFH,5,0AHDB?,2 DUP(20H);预留一个字节空间,重复定义两个内容为20H的字节空间WVAR1 DW2010H,4*4;字变量:2010H、0010H,占4个字节WVAR2 DW?;没有初值的字变量DVAR DD12347777H,87651111H,?;两个双字数据,预留一个双字空间,ABCDBA,B,C,?MAXINTEQU0AH;符号常量:MAXINT=10STRINGDB ABCDEFGHIJ;定义字符串CRLFSDB13,10,$;字符:回车、换行、$=24HARRAYDW MAXINT DUP(

15、0);10个初值为0的字变量ARRAY1 DB 2 DUP(2,3,2 DUP(4);8个字节的内容依次为02 03 04 04 02 03 04 04HSTR1DB ABCDEF;内存单元的内容依次为41H,42H,43H,44H,45H,46HSTR2 DWAB,CD,EF;内存单元的内容依次为42H,41H,44H,43H,46H,45HSTR3DD AB,CD;内存单元的内容依次为42H,41H,00H,00H,44H,43H,00H,00H,MOVDL,BVAR1;DL100DECBVAR2+1;BVAR2位移量为1的数据减1,MININT仍为5MOVABC3,DL;字符串成为ABC

16、DMOVAX,WORD PTR DVAR0;AX7777HMOVDX,WORD PTR DVAR2;DX1234H;取双字到DX:AXADDAX,WORD PTR DVAR4ADCDX,WORD PTR DVAR6;加双字到DX:AXMOVWORD PTR DVAR8,AXMOVWORD PTR DVAR10,DX;保存双字到DVAR的第3个双字单元,MOVCX,MAXINT;循环次数:10MOVBX,0AGAIN:ADD STRINGBX,3;STRING中的每个值加3INCBXLOOPAGAINLEADX,ABCMOVAH,09HINT21H;显示的结果为:ABCDDEFGHIJKLM,3

17、、EVEN伪指令格式:EVEN功能:将程序计数器置为偶数。汇编程序使用一个程序计数器来指向当前的(内存数据或代码)偏移地址。若该偏移地址为偶数,则EVEN什么也不做;若为奇数,则该伪指令将使程序计数器加1,以便使下一个单元的地址为偶数。若EVEN伪指令在代码段中,若偏移地址需要调整,则汇编程序将一个空操作指令NOP插入该偏移地址指向的字节单元处,以调整程序计数器为偶数。例如:DATA SEGMENTXDB?EVENYDB?DATA ENDS,4、ORG伪指令格式:ORG表达式ORG$+表达式功能:程序定位。使程序计数器的值设置成表达式给出的值,以确定当前的偏移地址。其中,表达式的值必须为常数,

18、$表示程序计数器当前的值(当前的偏移地址)。例如:ORG 100HMOVAX,BX表明MOV指令将从偏移地址100H处开始存放。而对于ORG$+100HXDW?表明数据X从当前的偏移地址再跳过256个字节后开始存放。,THIS 建立一个指定类型(BYTE、WORD或DWORD)的或指定距离(NEAR或FAR)的地址操作数。该操作数的段地址和偏移地址与下一个存储单元地址相同。,6、SEGMENT 和 ENDS 伪指令格式:段名 SEGMENT 定位类型组合类型类别(指令或伪指令序列)段名 ENDS功能:定义程序中的段,SEGMENT伪指令表示段的开始,ENDS伪指令表示段的结束。其中,段名由用户

19、确定。段名具有地址属性。,对于代码段名:MOV BX,SEG CODE_SEG;BXCSMOVDX,OFFSET CODE_SEG;DX0对于数据、附加和堆栈段名:MOVBX,SEG DATA_SEG;BXDS或ES或SSMOV BX,DATA_SEG;等价于上一条指令。MOVDX,OFFSET DATA_SEG;DX下一个可以分配的;数据的偏移地址,DATASEGMENTADB 1,2,3,4BDB22,23,45DATA ENDSMOVAX,DATAMOVDS,AXMOVAL,A4;AL=?,(1)定位类型(或称边界类型,Align)用于指定逻辑段的起始地址(物理地址,20位),它有五种选

20、择:,(2)组合类型(Combine)告诉连接程序,本段和其他段之间的关系,主要用于多模块的程序设计。(3)类别(Class)类别指定了逻辑段的类型,连接程序通过段的类别属性将所有同类别的段相邻分配。段的类别必须位于单括号中,段类别原则上可以为任意名称。但代码段一般要求使用CODE。而堆栈段和数据段通常使用STACK和DATA。,7、ASSUME 伪指令完整的段定义伪指令 声明了逻辑段的名称及其属性,它必须配合ASSUME伪指令指明逻辑段的类型(代码段、数据段、附加段或堆栈段)。格式:ASSUME 段寄存器名:段名,段寄存器名:段名,功能:ASSUME伪指令通知汇编程序用指定的段寄存器来寻址对

21、应的逻辑段,即建立段寄存器和段的缺省关系(访问内存数据时段隐含),规定了段超越的前提。ASSUME伪指令只是告诉汇编程序 逻辑段与段寄存器 之间的关系,它并没有为段寄存器赋初值,因此,各段寄存器的初值需要在程序中设定。,段寄存器的装填(初始化):CS和IP的装填 CS和IP寄存器的初值不能在程序中设置,它是通过伪指令END指定的地址来装填的,实际上是由连接程序自动设置的。DS和ES的装填 可执行程序由操作系统调入内存后,ES=DS=PSP的段地址,若用户程序中没有堆栈段,SS=PSP的段地址,SP=00H。为安全起见,程序应该设置足够大的堆栈空间。由于DOS给DS、ES所赋的初值不等于用户程序

22、数据段、附加段的段基址,因此,DS和ES必须在程序中赋初值。由于不能将一个常量直接赋给段寄存器,因此要使用下面的四条指令来完成。SS和SP的装填 SS和SP也可以由连接程序设置,SS被设置成组合类型为STACK的段的段地址,而SP被设置成该堆栈段的长度。这样,SS:SP就指向了栈尾。SS和SP也可在程序中设置,用户可以使用自己定义的堆栈空间,例 DS、ES和SS寄存器的初始化。DSEG SEGMENT PARA DATA XDW 0ABCDHDSEG ENDSESEG SEGMENT PARA DATA Y DW?ESEG ENDSSSEG SEGMENT PARA STACK STACK D

23、B 100 DUP(?)SSEG ENDSCSEG SEGMENT PARA CODEASSUME CS:CSEG,DS:DSEG,ES:ESEG,SS:SSEG,START:MOVAX,DSEGMOVDS,AX;初始化DS寄存器MOVAX,ESEGMOVES,AX;初始化ES寄存器MOVAX,SSEGMOVSS,AX;初始化SS寄存器MOVSP,100;设置堆栈指针SP的初值MOVAH,4CHINT 21HCSEGENDSEND START,8、过程定义伪指令 汇编语言用定义过程的方法来实现子程序的功能。过程可以用CALL指令来调用,用RET指令返回到调用处。过程定义包含两条伪指令:PROC

24、和ENDP。PROC表示过程的开始,ENDP表示过程的结束。格式:过程名 PROC 属性(NEAR 或FAR)(过程中的语句序列:过程体)标号:RET 常数过程名ENDP功能:定义一个过程(即子程序)。调用参考p97页。,9、END伪指令格式:END 起始地址功能:表明源程序的结束,并指出程序装入后执行的起始地址。其中,方括号中的“起始地址”是可选项,它可以是标号或过程名,表示程序第一条要执行的指令的地址。10、INCLUDE伪指令格式:INCLUDE文件名功能:告诉汇编程序将该伪指令指出的文件(使用汇编语言书写的)完整地插入到当前源程序文件的INCLUDE伪指令处。例如:INCLUDEC:M

25、ASMFILMACRO.MAC,8.2.4 汇编语言操作符及其应用 汇编语言支持许多操作符,这些操作符在指令和伪指令语句的操作数中构成表达式。共有六种类型的操作符,它们是算术、移位、逻辑、关系、回送值和类型操作符。另外还有DUP、记录操作符和宏操作符等。,只有双目的“+”和“-”操作符可以用在内存地址操作数中,运算结果仍为内存地址。,例 算术操作符的使用。算术操作符用于数值表达式:VALUE=15*2;VALUE=30VALUE=VALUE/4;VALUE=30/4=7VALUE=VALUE MOD 4;VALUE=7 MOD 4=3VALUE=-VALUE-2;VALUE=-3-2=-5VA

26、LUE=-VALUE-VALUE;VALUE=-(-5)-(-5)=10 算术操作符用于内存地址操作数表达式:ORG100HXDB100;变量X的偏移地址为100HYDB200;变量Y的偏移地址为101HMEM1EQUX+5;MEM1=100H+5=105HMEM2 EQUX-5;MEM2=100H-5=0FBHCONSTEQUY-X;CONST=101H-100H=1,2、移位操作符移位操作符有两个:SHL(左移)、SHR(右移)格式:表达式 SHL/SHR 常数其中,常数表示移位次数。将表达式的值(自动扩展为16位)按二进制的位进行移位,移出的位丢失,空出的位补零。如果移位的次数大于16,

27、结果为0。其最终的位数由另外一个操作数决定。例如:对于指令 MOVAX,0110111B SHL 30110111B SHL 3这个表达式的结果为0110111000B,即3B8H。如果指令是MOV AH,0110111B SHL 3 指令汇编后会给出出错信息:Value out of range!注意:它们和逻辑移位指令不同。逻辑移位指令是在执行时对寄存器或内存单元中的数据进行移位操作,且影响标志位。汇编程序能从上下文来区分它们。,因为关系操作符只能产生0或-1两个值,所以一般不单独使用它们,而是把它们与其他操作符组合起来使用。例如:定义 COUNT EQU 32假设需要在COUNT小于50

28、时,将5送入AX,而其他情况则将6送入AX寄存器。可以使用如下指令语句:MOVAX,(COUNT LT 50)AND 5)OR(COUNT GE 50)AND 6)比较:C语言中,条件表达式1?表达式2:表达式3意思为:如果条件表达式1为真,则求解表达式2,此时表达式2的值作为整个表达式的值;否则求解表达式3,表达式3的值作为整个表达式的值。,5、重复操作符DUP重复操作符也称复制操作符。DUP的格式:表达式 DUP(表达式1,表达式2,)DUP左面的表达式的数值表示重复的次数,右面的表达式的数值表示要重复的内容(变量的初值)。DUP可以使用嵌套。例如:ARRAY DB 100 DUP(0,1,?)表示分配300个字节的内存单元。AYDB20 DUP(0,1,4 DUP(2),5,?)表示分配20*8=160个字节的存储空间。STRING DB 10H DUP(abcd)表示分配了16*4=64个字节的内存单元。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号