收藏 分享(赏)

ch08-汇编语言程序格式2.ppt

上传人:无敌 文档编号:52753 上传时间:2018-03-07 格式:PPT 页数:55 大小:427.02KB
下载 相关 举报
ch08-汇编语言程序格式2.ppt_第1页
第1页 / 共55页
ch08-汇编语言程序格式2.ppt_第2页
第2页 / 共55页
ch08-汇编语言程序格式2.ppt_第3页
第3页 / 共55页
ch08-汇编语言程序格式2.ppt_第4页
第4页 / 共55页
ch08-汇编语言程序格式2.ppt_第5页
第5页 / 共55页
点击查看更多>>
资源描述

1、汇编语言程序格式,主讲人:黄永平,目录,一、汇编语言概述二、汇编语言格式三、伪指令四、操作数字段五、汇编语言源程序的结构,一、汇编语言概述,机器语言,计算机能够直接识别的数据是由二进制数0和1组成的代码。机器指令就是用二进制代码组成的指令,一条机器指令控制计算机完成一个基本操作。 用机器语言编写的程序是计算机唯一能够直接识别并执行的程序,而用其他语言编写的程序必须经过翻译才能变换成机器语言程序,所以,机器语言程序被称为目标程序。,一、汇编语言概述,汇编语言,为了克服机器语言的缺点,人们采用助记符表示机器指令的操作码,用变量代替操作数的存放地址等,这样就形成了汇编语言。所以汇编语言是一种用符号书

2、写的、基本操作与机器指令相对应的、并遵循一定语法规则的计算机语言。用汇编语言编写的程序称为汇编源程序。 汇编语言是一种符号语言,比机器语言容易理解和掌握,也容易调试和维护。但是,汇编语言源程序要翻译成机器语言程序才可以由计算机执行。这个翻译的过程称为“汇编”,这种把汇编源程序翻译成目标程序的语言加工程序称为汇编程序(汇编器,编译器)。,一、汇编语言概述,高级语言,汇编语言虽然较机器语言直观,但仍然烦琐难懂。于是人们研制出了高级程序设计语言。高级程序设计语言接近于人类自然语言的语法习惯,与计算机硬件无关,易被用户掌握和使用。目前广泛应用的高级语言有多种,如BASIC、FORTRAN、PASCAL

3、、C、C+、Java,C#等等。例出你所知道的计算机语言有哪些?,一、汇编语言概述,汇编语言的特点,(1)汇编语言与处理器密切相关,可移植性差。 (2)汇编语言程序效率高。(3)编写汇编语言源程序比编写高级语言源程序烦琐。 (4)调试汇编语言程序比调试高级语言程序困难。,一、汇编语言概述,汇编语言的主要应用场合,(1)程序执行占用较短的时间,或者占用较小存储容量的场合。 (2)程序与计算机硬件密切相关,程序直接控制硬件的场合,实时控制。 (3)需提高大型软件性能的场合(选一个好的C编译器可解决)。 (4)没有合适的高级语言的场合。(OS中上下文保存等,如linux),一、汇编语言概述,汇编语言

4、程序的建立及处理过程,编辑程序,汇编源程序xxx.ASM,汇编程序,MASM5.0TASMMASM32,NotePadUtraEditNotepad+,浮动目标文件xxx.OBJ,连接程序,可执行文件xxx.EXE,LINK,Emu8086 -IDE仿真环境,系统库lib系统.obj,二、汇编语言格式,汇编语言中有三种基本语句:指令语句汇编时,产生对应的机器目标代码。伪指令汇编时,无目标代码,用于定义符号、分配内存、初始化存储器。宏指令用宏名称来定义的一段指令序列。(如C中#define ),二、汇编语言格式,标号: 机器指令助记符 操作数 ;注释,标号是机器指令语句存放地址的符号表示,代表该

5、指令目标代码的第一个字节地址,后面必须紧跟冒号“:” 。,汇编指令机器指令指令助记符为语句的核心成分,表示了该语句的操作类型。,操作数表示指令助记符的操作对象。,指令语句格式(机器指令),注释均以分号开始,它可占一行或多行,一般放在一条语句的后面。,next: MOV AX, BX ; 把BX内容送到AX,二、汇编语言格式,符号名 伪指令助记符 操作数 ;注释,常量名变量名过程名段名结构名记录名,伪指令符指定汇编程序要完成的具体操作,如数据定义伪指令DB、DW、DD,段定义伪指令SEGMENT,假定伪指令ASSUME等。,伪指令后面的操作数可以是常数、字符串、变量、表达式等,其个数由具体的伪指

6、令决定,各个操作数之间必须以“逗号”分隔。,伪指令语句格式(汇编程序解释),伪指令的注释必须以“;”开始,其作用同指令语句中的注释部分。,var1 DW 100 ; 定义一个字变量var1,其值为100C中 unsigned integer var1=100;,三、伪指令,三、伪指令,段定义伪指令(SEGMENT/ENDS),段名 SEGMENT 定位类型组合类型字长类型类别.段名 ENDS,ASSUME 段寄存器:段名,段寄存器:段名,,指出哪个段用哪个段寄存器,为了汇编程序把不同的段与模块连接,三、伪指令,1段名 该段名字,用来指出汇编程序为该段分配的存储区起始位置。 2定位类型(指定该段

7、起始地址边界值的类型)(1)BYTE:表示本段起始地址可以从任一地址处开始存放。(2)WORD:表示本段要从一个偶数地址处开始存放,即段起始地址的最低一位必须是0。(3)DWORD:表示本段要从4倍地址处开始存放,即段起始地址的最低二位必须是0。(4)PARA:表示本段必须从能被16倍地址处开始存放,即段起始地址最低四位必须是0。 (5) PAGE:表示本段要从能被256倍地址处开始存放,即起始地址的最低八位必须是0。,三、伪指令,3.组合类型(用来告诉连接程序link.exe,本段与其它模块中同名段的组合连接关系)有六种类型可供选择。 (1)“不选择”(2)PUBLIC:连接时,把与该段名相

8、同的段连接在一起。(3)STACK:指定该段为堆栈段的一部分 (4)COMMON:指定该段与其它同名的段有相同的段起始地址。 (5)MEMORY:指定该段将分配在所有其它段的前面(高地址)。(6)PRIVATE: 该段为独立段,不与其它同名段合并。(7)AT 表达式:用于指定由表达式值所确定的段所在的起始地址。不能用于代码段。,三、伪指令,4.字长类型(用于386以上,用来说明使用16位寻址方式或32位寻址方式) (1)USE16:使用16位寻址方式。(2)USE32:使用32位寻址方式。,三、伪指令,5.类别(连接时,连接程序会把类别相同的所有段放在连续的内存区域中)DATA :段类别是数据

9、段。 -DSCODE :段类别是代码段。 -CSSTACK :段类别是堆栈段。 -SSEXTRA :段类别是附加数据段。-ES,三、伪指令,对连接程序进行连接后存储区各段相对位置分布。DATA1SEGMENTDATACODE SEGMENTCODESTACK1SEGMENTSTACKDATA2 SEGMENTDATASTACK2SEGMENTSTACK经连接程序连接后,各段的相对位置如下:DATA1SEGMENTDATADATA2SEGMENTDATASTACK1SEGMENTSTACKSTACK2SEGMENTSTACKCODE SEGMENTCODE,三、伪指令,【例】有两个模块,各模块段

10、定义如下:,模块1: DATA1SEGMENT PARA PUBLIC DATA1M1DB 45H DUP(0)DATA1ENDSDATA2SEGMENT PARA COMMON DATA2N1 DB 102H DUP(0)DATA2ENDSEND,三、伪指令,模块2:DATA1SEGMENT PARA PUBLIC DATA1M2DB 104H DUP(11H)DATA1ENDSDATA2SEGMENT PARA COMMON DATA2N2DB 105H DUP(0)DATA2ENDSDATA3SEGMENTT1DB 50 DUP(20H)DATA3ENDSEND,三、伪指令,模块1、模块

11、2连接后段的定位组合方式示意图,三、伪指令,ASSUME 段寄存器:段名,段寄存器:段名,,假定伪指令 (ASSUME) -段分配伪指令,功能:建立段寄存器与段之间的对应关系。该伪指令一般出现在代码段中。,ASSUME CS:CODE, DS:DATA1, ES:DATA3, SS:DATA2,DATA1SEGMENT DATADATA1ENDSDATA2SEGMENT STACKDATA2ENDSDATA3SEGMENT DATADATA3ENDSCODE SEGMENT CODEASSUME CS:CODE, DS:DATA1, ES:DATA3, SS:DATA2START: MOV A

12、X, DATA1MOV DS, AXMOV AX,DATA2MOV SS,AXMOV AX,DATA3MOV ES,AXCODEENDSEND START,三、伪指令,指定哪个段用哪个段寄存器,给段寄存器装入值,CS由系统自动装入,定义了二个数据段,一个堆栈段,一个代码段,三、伪指令,段组定义伪指令 (GROUP),段组名 GROUP 段名,段名,,功能:将GROUP后段名所指定的段分配在同一个物理存储器段中,分给该段一个段组名。,DATA1SEGMENT DATADATA1ENDSDATA2SEGMENT DATADATA2ENDSAA5GROUP DATA1, DATA2 CODE SEG

13、MENT CODEASSUME CS:CODE, DS:AA5START: MOV AX, AA5MOV DS, AX CODEENDSEND START,三、伪指令,定义了二个数据段,一个代码段,三、伪指令,地址计数器伪指令 (ORG,EVEN,ALIGN),地址计数器(偏移计数器)$ :本指令地址 MASM5.0, emu8086支持ORG 表达式 -设置地址计数器IPEVEN -使下一变量或指令开始于偶数地址。 ALIGN n -使下一变量或指令开始于n的整数倍地址。N=2,4,8,16,三、伪指令,数据定义伪指令 (DB,DW,DD,DF,DQ,DT),变量名 操作符 操作数,操作数,

14、 ;注释,功能:为操作数分配存储单元,并用变量名与存储单元相联系。,常数表达式字符串,DB-1 字节(字节),定义字节变量DW-2 字节(字), 定义字 变量DD-4 字节(双字),定义双字变量DF-6 字节(三字),定义三字变量DQ-8 字节(四字),定义四字变量DT-10字节(五字),定义五字变量,三、伪指令,常数、表达式,ORG 200HDATA1 DB 12H, 2+6,34HEVEN ;下一个从偶数地址开始DATA2 DW 789AHALIGN 4 ;下一个从4倍地址开始DATA3 DD 12345678HDATA4 DW $,6699H,三、伪指令,字符串,ORG 100HDATA

15、1 DB abcd DATA2 DB ABDATA3 DW AB,三、伪指令,?,ORG 400HDATA1 DB 1,2,?,4 DATA2 DW 5,?,6 DATA3 DF ?DATA4 DB 8,三、伪指令,n DUP(),ORG 300HDATA1 DB 2 DUP(12H,34H,56H),如何定义一个数组?,Duplication,三、伪指令,过程定义伪指令(PROC/ENDP),过程名 PROC 属性.过程名 ENDP,NEAR近调用(段内)FAR远调用(段间),用CALL 过程名调用此过程,三、伪指令,模块连接伪指令(PUBLIC,EXTRN),PUBLIC 符号1 ,符号2

16、,,1.PUBLIC全局符说明伪指令,功能:全局符号定义,其它模块可使用。,EXTRN 符号1:类型 ,符号2:类型,,2.EXTRN外部符说明伪指令,功能: 其它模块用PUBLIC定义的,本模块要引用的符号。,符号可以是:常量、变量、标号、过程名。,BYTE WORDDWORD FWORDQWORD TBYTEABS (用EQU定义的常量)NEAR FAR(标号,过程名),四、操作数字段,常数,数值常数 2.字符串常数3.符号常数,12ABH2376Q01011100B4567D , 4567,A AbCd,DATA1 EQU 88NEW-CX EQU CX DATA2 EQU DATA1+

17、2DATA1 = 88DATA1 = DATA1+99,(1)符号常数名 EQU 表达式(2)符号常数名 = 表达式,四、操作数字段,表达式,把常数、寄存器、标号、变量与运算符组合。数字表达式、地址表达式,运算符,(1)算术运算符:+ - * / MOD 2+5 ,17/7 ,17 MOD 7(2)逻辑运算符:AND OR XOR NOT(3)移位运算符:SHL SHR MOV AL, BL SHR 3MOV CL,BL SHL 6,四、操作数字段,(4)关系运算符:(true=0FFFFH,false=0) =GTGELTLEEQNE(5)返回值运算符:1) SEG 变量/标号 2) OFF

18、SET 变量/标号3) TYPE 变量/标号 对变量:返回变量的字节数,DB为1,DW为2,DD为4,DF为6,DQ为8,DT为10. 对标号:返回地址的类型,NEAR为-1 ,FAR为-2.4) LENGTH 变量 变量中无DUP时,返回1;有DUP时返回由类型所定的单元数。5) SIZE 变量 返回变量的字节数(LENGTH*TYPE),X DB 12H, 34H,56HX只代表12H!,四、操作数字段,(6)属性运算符:1)类型 PTR 变量/标号 对变量: 类型为BYTE, WORD,DWORD, FWORD,QWORD,TBYTE. 对标号:类型为 NEAR ,FAR.,DATA1

19、DW 1234H,5678H DATA2 DB 99H,88H,77H,66H DATA3 EQU BYTE PTR DATA1 MOV AX, WORD PTR DATA2 ;8899H MOV BL, BYTE PTR DATA1 ;34H MOV DX, DATA1+2 ;5678H MOV BX, 8 ; X错误 MOV BYTE PTR BX, 8 ; 08H MOV WORD PTR BX, 8 ; 0008H,强制类型转换,四、操作数字段,(6)属性运算符:2) 变量/标号 EQU THIS 类型 对变量: 指定变量类型为BYTE, WORD,DWORD, FWORD,QWORD

20、,TBYTE.对标号:指定标号类型为 NEAR ,FAR. 为声明一个变量/标号,但不分配存储区。,DATA1 EQU THIS BYTE DATA2 DW 1234H,5678H MOV AX, DATA2 ;1234H MOV BL, DATA1 ;34H MOV BH, DATA1+1 ;12HAA1 EQU THIS FAR AA2: MOV AX,100H,DATA1DATA2地址相同,类型不同,AA1AA2地址相同,类型不同,四、操作数字段,(6)属性运算符:3) 变量/标号 LABEL 类型 对变量: 定义变量类型为BYTE, WORD,DWORD, FWORD,QWORD,TB

21、YTE. 对标号:定义标号类型为 NEAR ,FAR。与PTR相同。,AA1 LABEL FAR ;远调用入口AA2: MOV AX, 00H ;近调用入口 AA3 LABEL BYTE AA4 DW 1234H, 5678H MOV AX, AA4 ;1234H MOV BH, AA3+1 ;12H,AA1AA2地址相同,AA3AA4地址相同,四、操作数字段,(7)运算符的优先级p150,四、操作数字段,2. 数字表达式,把常数、标号、变量与运算符组合。运算符可以是算术运算符、逻辑运算符、移位运算符、关系运算符、返回值运算符,但结果必须是常数。,AAA1 EQU XDATA1 DB 12H,

22、 34H, 56H, 78H AAA2: MOV AX, LENGTH DATA1 MOV BX, TYPE AAA2 MOV DX, (AAA1 LT 3 AND 10H OR AAA1 GE 3 AND 0AFH )SHL 2 ;40H,0BCH,mov ax,1 无DUP返回1,-1, near,四、操作数字段,3. 标号指令存放单元的符号地址。在代码段中定义,标号后一定要有:。标号属性:段、偏移、类型。,四、操作数字段,4.变量数据存放单元的符号地址。数据段或附加段中定义。变量属性:段、偏移、类型、单元数、字节数。,四、操作数字段,5. 地址表达式(1)变量/标号 +/- 数据表达式

23、,只改变地址偏移量(2)变量-变量 标号-标号 结果为相对位移(3)寄存器 +/- 数据表达式可以 寄存器 +/- 变量/标号 不可以MOV AX, BX+SI+8 MOV AX, BX+SI8 MOV AX, 8BX+SI MOV AX, BXSI8,五、汇编语言源程序的结构,Windows中可执行文件有:.COM,.EXE,.DLL,.bat, .ocx,1)COM -可执行二进制代码文件:程序只占一个段,64KB。PSP+代码占一个段中。磁盘文件开始直接就是执行代码。无独立的堆栈段。加载后PSP头长度256字节, CS=DS=SS,IP=100h,SP=0FFFEh,范围00000FFF

24、FH。 PSP最开始有一个INT 20H指令。2)EXE -可执行的浮动代码文件 :程序占有多个段,DS数据段、CS代码段、ES数据段、SS堆栈段占独立段,程序加载时再定位各段。磁盘中EXE文件有512字节头信息(控制信息块)。加载后PSP头长度256字节, DS=ES指向PSP头; CS、SS指向程序中的段,需要重置DS、ES指向自己的数据段 。 PSP最开始有一个INT 20H指令。3)DLL-动态链接库: 一个EXE可以运行中加载、卸载其它的DLL。(360与TX大战,程序升级)4)Bat -批处理文件: 成批运行DOS命令脚本。,五、汇编语言源程序的结构,1.COM源程序结构,;-0主

25、程序开始- org 100h ;!主程序代码 RET ;返回DOS;-1 子过程开始-P_NamePROCNEAR ;!子过程代码RETP_NameENDP;-2 定义变量-X DB Y DW ,Emu8086环境,CODESEGMENT;-0主程序开始-ORG 100HASSUME CS:CODE,DS:CODESTART : ;!主程序代码RET ;返回DOS;-1 子过程开始-P_NamePROCNEAR ;!子过程代码RETP_NameENDP;- 2定义变量-X DB Y DW CODEENDSEND START,MASM.exeLink.exeEXE2BIN.EXE-把EXE变成C

26、OM文件,MASM 5.0、 Emu8086环境,五、汇编语言源程序的结构,COM程序例子:,;-0主程序开始- org 100h LEA BX, BUF MOV CX, 7 CALL display RET ;返回DOS;-1 子过程开始-displayPROCNEAR next1: MOV DL,BX MOV AH, 2 INT 21H INC BX LOOP next1RETdisplay ENDP;-2 定义变量-BUF DB 0AH, 0DH, ABCDE,在CRT上显示ABCDE的程序,Emu8086环境,CODESEGMENT;-0主程序开始-ORG 100HASSUME CS:

27、CODE,DS:CODESTART : MOV AX,CSMOV DS, AXLEA BX, BUFMOV CX, 7CALL displayRET ;返回DOS;-1 子过程开始-display PROCNEAR next1 :MOV DL,BXMOV AH, 2INT 21HINC BXLOOP next1RETdisplay ENDP;- 2定义变量-BUF DB 0AH, 0DH, ABCDECODEENDSEND START,MASM 5.0、 Emu8086环境,五、汇编语言源程序的结构,2.EXE源程序结构1,;*1.开始定义数据段*DSEG SEGMENT DATA X DB

28、Y DW DSEG ENDS ;*2.开始定义堆栈段* SSEG SEGMENT STACK STACK DW 100h DUP(?) ;自己的堆栈,够用就行.SSEG ENDS ;*3.开始定义代码段* ASSUME CS:CSEG,DS:DSEG,SS:SSEG CSEG SEGMENT CODE;-3.0 主过程开始-Main PROC FAR PUSH DS ;返回地址入栈,与RET对应 MOV AX, 0 PUSH AX MOV AX, DSEG ;指向自己的数据段DSEG MOV DS, AX ;!主过程代码 RETF ;执行PSP头首位置的int 20H,返回DOS.Main E

29、NDP;-3.1 子过程开始-P_NamePROCNEAR ;!子程序代码RETP_NameENDPCSEG ENDS END Main ;开始进程是Main,MASM 5.0、 Emu8086环境,或者MOV AH, 4ChINT 21h,指向自己的数据段DSEG。,DS原指向PSP,PSP第1字节位置压栈,若用上边的代码结束,主过程开始个指令可以不用。,五、汇编语言源程序的结构,2.EXE源程序结构2,;*1.开始定义数据段*DSEG SEGMENT DATA X DB Y DW DSEG ENDS ;*2.开始定义堆栈段* SSEG SEGMENT STACK STACK DW 100h

30、 DUP(?) ;自己的堆栈,够用就行.SSEG ENDS ;*3.开始定义代码段* ASSUME CS:CSEG,DS:DSEG,SS:SSEG CSEG SEGMENT CODE;-3.0 主程序开始-Main: PUSH DS ;返回地址入栈,与RET对应 MOV AX, 0 PUSH AX MOV AX, DSEG ;指向自己的数据段DSEG MOV DS, AX ;!主程序代码 RETF ;执行PSP头首位置的int 20H,返回DOS.;-3.1 子过程开始-P_NamePROCNEAR ;!子程序代码RETP_NameENDPCSEG ENDS END Main ;开始进程是Ma

31、in,MASM 5.0、 Emu8086环境,或者MOV AH, 4ChINT 21h,五、汇编语言源程序的结构,EXE程序例子:,;*1.定义数据段*DSEG SEGMENT DATA BUF DB 0AH,0DH,ABCDEDSEG ENDS ;*2.定义堆栈段* SSEG SEGMENT STACK STACK DW 100h DUP(?) ;自己的堆栈,够用就行.SSEG ENDS ;*3.定义代码段* ASSUME CS:CSEG,DS:DSEG,SS:SSEG CSEG SEGMENT CODE;-3.0 主过程开始-Main PROC FAR ; 与RET对应 PUSH DS ;

32、返回地址入栈, MOV AX, 0 PUSH AX MOV AX, DSEG ;设置当前使用的数据段DSEG MOV DS, AX LEA BX, BUF MOV CX, 7 CALL display RETF ;执行int 20H,返回DOS.Main ENDP;-3.1 子过程开始-display PROCNEAR ;!在此加入你自己的代码!RETdisplay ENDPCSEG ENDS END Main ;开始进程是Main,next1:MOV DL,BXMOV AH, 2INT 21HINC BXLOOP next1,MASM 5.0、 Emu8086环境,几点注意(变量名,地址标号

33、名,过程名,段名),1.变量名,地址标号名,过程名 都是地址(相对所在段和偏移)如用X_Name表示时:,!取X_Name段地址MOV BX,seg X_Name取X_Name所在段的段值,!取X_Name偏移地址MOV BX,offset X_NameLEA BX, X_NameLEA BX,X_Name三者等效,!取X_Name变量值(DB类型时)MOV AL, X_NameMOV AL,X_Name二者等效,变量直接寻址,几点注意(变量名,地址标号名,过程名,段名),2.段名,其值为段值(加载时重定位)如用XSEG表示DSEG、CSEG、SSEG时:,!取XSEG段地址MOV BX,XS

34、EG,参见MASM5.0生成的.LST文件,;*1.开始定义数据段*DSEG SEGMENT DATA DSEG ENDS ;*2.开始定义堆栈段* SSEG SEGMENT STACK STACK SSEG ENDS ;*3.开始定义代码段* CSEG SEGMENT CODE CSEG ENDS END Main ;开始进程是Main,MOV AL, X ;直接寻址MOV AL,X ;直接寻址二者等效MOV AL, X+1 ;直接寻址MOV AL,X+1 ;直接寻址二者等效,几点注意(常量、变量名),3. 常量名 与 变量名,!常量NN EQU 200hMOV AL,N ;立即寻址MOV

35、AL,N ;直接寻址二者不同,!取X变量值(DB类型时)X DB 20h, 30h, 40h, 50h,X DB 20h, 30h, 40h, 50hX只代表20h,MOV AL, X ;正确MOV AL,X ;正确二者等效MOV AX, X ;!错误MOV AX,X ;!错误MOV AX, WORD PTR X ;正确MOV AX, WORD PTR X ;正确,几点注意(数据传送等宽原则),4. 数据传送等宽原则,!取X变量值(DB类型时)X DB 20h, 30h, 40h, 50h,数据传送等宽原则,也就是类型要正确,段 :偏移 机器指令 汇编指令1671: 0215 BB MOV BX,$ ; $本指令开始位置地址偏移1671: 0216 151671: 0217 02 等价于 MOV BX,0215h,几点注意($符),5. $,指令中的$,数据中的$,X DW 1234h, $, 5678h1671: 0215 341671: 0216 121671: 0217 17 ;$所在位置的地址偏移1671: 0218 021671: 0219 781671: 021A 56,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报