微型计算机技术与汇编语言程序设计:ch08-汇编语言程序格式_第1页
微型计算机技术与汇编语言程序设计:ch08-汇编语言程序格式_第2页
微型计算机技术与汇编语言程序设计:ch08-汇编语言程序格式_第3页
微型计算机技术与汇编语言程序设计:ch08-汇编语言程序格式_第4页
微型计算机技术与汇编语言程序设计:ch08-汇编语言程序格式_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

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

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

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

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

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

6、等,其个数由具体的伪指令决定,各个操作数之间必须以“逗号”分隔。伪指令语句格式(汇编程序解释)伪指令的注释必须以“;”开始,其作用同指令语句中的注释部分。var1 DW 100 ; 定义一个字变量var1,其值为100C中 unsigned integer var1=100; HYPer三、伪指令伪指令分类伪指令助记符符号定义EQU , = , LABEL数据定义(变量定义)DB, DW, DD, DT, RECORD, STRUC段定义SEGMENT, ENDS, GROUP, ASSUME ORG模块定义EXTRN, PUBLIC, NAME, END过程定义PROC , ENDP宏处理M

7、ACRO, ENDM, LOCAL, REPT, IRPC,IRP,PURGE条件汇编IF,ENDIF,IF1,IF2,IFB,IFNB,IFE,IFDIF,IFDEF,IFNDEF,IFIDN,ELSE列表PAGE,TITLE,SUBTTL,LIST XLIST,%OUT其它COMMENT,RADIX,INCLUDE,EVENHYPer三、伪指令段定义伪指令(SEGMENT/ENDS) 段名 SEGMENT 定位类型组合类型字长类型类别.段名 ENDSASSUME 段寄存器:段名,段寄存器:段名, 指出哪个段用哪个段寄存器为了汇编程序把不同的段与模块连接HYPer三、伪指令1段名 该段名字,

8、用来指出汇编程序为该段分配的存储区起始位置。 2定位类型(指定该段起始地址边界值的类型)(1)BYTE:表示本段起始地址可以从任一地址处开始存放。(2)WORD:表示本段要从一个偶数地址处开始存放,即段起始地址的最低一位必须是0。(3)DWORD:表示本段要从4倍地址处开始存放,即段起始地址的最低二位必须是0。(4)PARA:表示本段必须从能被16倍地址处开始存放,即段起始地址最低四位必须是0。 (5) PAGE:表示本段要从能被256倍地址处开始存放,即起始地址的最低八位必须是0。HYPer三、伪指令3.组合类型(用来告诉连接程序link.exe,本段与其它模块中同名段的组合连接关系)有六种

9、类型可供选择。 (1)“不选择”(2)PUBLIC:连接时,把与该段名相同的段连接在一起。(3)STACK:指定该段为堆栈段的一部分 (4)COMMON:指定该段与其它同名的段有相同的段起始地址。 (5)MEMORY:指定该段将分配在所有其它段的前面(高地址)。(6)PRIVATE: 该段为独立段,不与其它同名段合并。(7)AT 表达式:用于指定由表达式值所确定的段所在的起始地址。不能用于代码段。 HYPer三、伪指令4.字长类型(用于386以上,用来说明使用16位寻址方式或32位寻址方式) (1)USE16:使用16位寻址方式。(2)USE32:使用32位寻址方式。 HYPer三、伪指令5.

10、类别(连接时,连接程序会把类别相同的所有段放在连续的内存区域中)DATA :段类别是数据段。 DSCODE :段类别是代码段。 CSSTACK :段类别是堆栈段。 SSEXTRA :段类别是附加数据段。ESHYPer三、伪指令对连接程序进行连接后存储区各段相对位置分布。DATA1SEGMENTDATACODE SEGMENTCODESTACK1SEGMENTSTACKDATA2 SEGMENTDATASTACK2SEGMENTSTACK经连接程序连接后,各段的相对位置如下:DATA1SEGMENTDATADATA2SEGMENTDATASTACK1SEGMENTSTACKSTACK2SEGME

11、NTSTACKCODE SEGMENTCODEHYPer三、伪指令【例】有两个模块,各模块段定义如下: 模块1: DATA1SEGMENT PARA PUBLIC DATA1M1DB 45H DUP(0)DATA1ENDSDATA2SEGMENT PARA COMMON DATA2N1 DB 102H DUP(0)DATA2ENDSEND HYPer三、伪指令模块2:DATA1SEGMENT PARA PUBLIC DATA1M2DB 104H DUP(11H)DATA1ENDSDATA2SEGMENT PARA COMMON DATA2N2DB 105H DUP(0)DATA2ENDSDAT

12、A3SEGMENTT1DB 50 DUP(20H)DATA3ENDSENDHYPer三、伪指令模块1、模块2连接后段的定位组合方式示意图HYPer三、伪指令ASSUME 段寄存器:段名,段寄存器:段名, 假定伪指令 (ASSUME) -段分配伪指令功能:建立段寄存器与段之间的对应关系。该伪指令一般出现在代码段中。ASSUME CS:CODE, DS:DATA1, ES:DATA3, SS:DATA2DATA1SEGMENT DATADATA1ENDSDATA2SEGMENT STACKDATA2ENDSDATA3SEGMENT DATADATA3ENDSCODE SEGMENT CODEASS

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

14、DATA2SEGMENT DATADATA2ENDSAA5GROUP DATA1, DATA2 CODE SEGMENT CODEASSUME CS:CODE, DS:AA5START: MOV AX, AA5MOV DS, AX CODEENDSEND STARTHYPer三、伪指令定义了二个数据段,一个代码段HYPer三、伪指令地址计数器伪指令 (ORG,EVEN,ALIGN) 地址计数器(偏移计数器)$ :本指令地址 MASM5.0, emu8086支持ORG 表达式 -设置地址计数器IPEVEN -使下一变量或指令开始于偶数地址。 ALIGN n -使下一变量或指令开始于n的整数倍地址

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

16、下一个从4倍地址开始DATA3 DD 12345678HDATA4 DW $,6699HDATA1200H12H201H08H202H34H203HDATA2204H9AH205H78H206H207HDATA3208H78H209H56H20AH34H20BH12HDATA420CH0CH20DH02H20EH9920FH66HYPer三、伪指令字符串ORG 100HDATA1 DB abcd DATA2 DB ABDATA3 DW ABDATA1100H61H a101H62H b102H63H c103H64H dDATA2104H41H A105H42H BDATA3106H42H B

17、107H41H AHYPer三、伪指令?ORG 400HDATA1 DB 1,2,?,4 DATA2 DW 5,?,6 DATA3 DF ?DATA4 DB 8DATA1400H01H401H02H402H原值403H04HDATA2404H05H405H00H406H原值 407H原值408H06H409H00HDATA340AH原值40BH原值40CH原值40DH原值40EH原值40FH原值DATA4410H08HHYPer三、伪指令n DUP()ORG 300HDATA1 DB 2 DUP(12H,34H,56H)DATA1300H12H301H34H302H56H303H12H304H

18、34H305H56H如何定义一个数组?DuplicationHYPer三、伪指令过程定义伪指令(PROC/ENDP) 过程名 PROC 属性.过程名 ENDPNEAR近调用(段内)FAR远调用(段间)用CALL 过程名调用此过程HYPer三、伪指令模块连接伪指令(PUBLIC,EXTRN) PUBLIC 符号1 ,符号2,1.PUBLIC全局符说明伪指令功能:全局符号定义,其它模块可使用。EXTRN 符号1:类型 ,符号2:类型,2.EXTRN外部符说明伪指令功能: 其它模块用PUBLIC定义的,本模块要引用的符号。符号可以是:常量、变量、标号、过程名。BYTE WORDDWORD FWORD

19、QWORD TBYTEABS (用EQU定义的常量)NEAR FAR(标号,过程名)HYPer四、操作数字段常数数值常数 2.字符串常数3.符号常数12ABH2376Q01011100B4567D , 4567A AbCdDATA1 EQU 88NEW-CX EQU CX DATA2 EQU DATA1+2DATA1 = 88DATA1 = DATA1+99(1)符号常数名 EQU 表达式(2)符号常数名 = 表达式HYPer四、操作数字段表达式把常数、寄存器、标号、变量与运算符组合。数字表达式、地址表达式运算符 (1)算术运算符:+ - * / MOD 2+5 ,17/7 ,17 MOD 7

20、(2)逻辑运算符:AND OR XOR NOT(3)移位运算符:SHL SHR MOV AL, BL SHR 3MOV CL,BL SHL 6HYPer四、操作数字段(4)关系运算符:(true=0FFFFH,false=0) =GTGELTLEEQNE(5)返回值运算符:1) SEG 变量/标号 2) OFFSET 变量/标号3) TYPE 变量/标号 对变量:返回变量的字节数,DB为1,DW为2,DD为4,DF为6,DQ为8,DT为10. 对标号:返回地址的类型,NEAR为-1 ,FAR为-2.4) LENGTH 变量 变量中无DUP时,返回1;有DUP时返回由类型所定的单元数。5) SI

21、ZE 变量 返回变量的字节数(LENGTH*TYPE)HYPer四、操作数字段(6)属性运算符:1)类型 PTR 变量/标号 对变量: 类型为BYTE, WORD,DWORD, FWORD,QWORD,TBYTE. 对标号:类型为 NEAR ,FAR. DATA1 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 MOV BYTE PT

22、R BX, 8 MOV WORD PTR BX, 8HYPer四、操作数字段(6)属性运算符:2) 变量/标号 EQU THIS 类型 对变量: 指定变量类型为BYTE, WORD,DWORD, FWORD,QWORD,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,100HDATA1DA

23、TA2地址相同AA1AA2地址相同HYPer四、操作数字段(6)属性运算符:3) 变量/标号 LABEL 类型 对变量: 定义变量类型为BYTE, WORD,DWORD, FWORD,QWORD,TBYTE. 对标号:定义标号类型为 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 ;12HAA1AA2地址相同AA3AA4地址相同HYPer四、操作数字段(7)运算符的优先级p150 HY

24、Per四、操作数字段2. 数字表达式 把常数、标号、变量与运算符组合。运算符可以是算术运算符、逻辑运算符、移位运算符、关系运算符、返回值运算符,但结果必须是常数。AAA1 EQU XDATA1 DB 12H, 34H, 56H, 78H AAA2: MOV AX, LENGTH DATA1 ; mov ax,1 无DUP返回1 MOV BX, TYPE AAA2 ;-1 near MOV DX, (AAA1 LT 3 AND 10H OR AAA1 GE 3 AND 0AFH )SHL 2 ;40H,0BCHHYPer四、操作数字段 3. 标号指令存放单元的符号地址。在代码段中定义,标号后一定

25、要有:。标号属性:段、偏移、类型。 HYPer四、操作数字段 4.变量数据存放单元的符号地址。数据段或附加段中定义。变量属性:段、偏移、类型、单元数、字节数。HYPer四、操作数字段 5. 地址表达式(1)变量/标号 +/- 数据表达式 ,只改变地址偏移量(2)变量-变量 标号-标号 结果为相对位移(3)寄存器 +/- 数据表达式可以 寄存器 +/- 变量/标号 不可以MOV AX, BX+SI+8 MOV AX, BX+SI8 MOV AX, 8BX+SI MOV AX, BXSI8 HYPer五、汇编语言源程序的结构 Windows中可执行文件有:.COM,.EXE,.DLL,.bat,

26、.ocx1)COM -可执行二进制代码文件:程序只占一个段,64KB。PSP+代码占一个段中。磁盘文件开始直接就是执行代码。无独立的堆栈段。加载后PSP头长度256字节, CS=DS=SS,IP=100h,SP=0FFFEh,范围00000FFFFH。 2)EXE -可执行的浮动代码文件 :程序占有多个段,DS数据段、CS代码段、ES数据段、SS堆栈段占独立段,程序加载时再定位各段。磁盘中EXE文件有512字节头信息(控制信息块)。加载后PSP头长度256字节, DS=ES指向PSP头; CS、SS指向程序中的段,需要重置DS、ES指向自己的数据段 。3)DLL-动态链接库: 一个EXE可以运

27、行中加载、卸载其它的DLL。(360与TX大战,程序升级)4)Bat -批处理文件: 成批运行DOS命令脚本。HYPer五、汇编语言源程序的结构 1.COM源程序结构;0主程序开始 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_Name

28、ENDP; 2定义变量X DB Y DW CODEENDSEND STARTMASM.exeLink.exeEXE2BIN.EXE把EXE变成COM文件 MASM 5.0、 Emu8086环境 HYPer五、汇编语言源程序的结构 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,

29、ABCDE在CRT上显示ABCDE的程序 Emu8086环境 CODESEGMENT;0主程序开始ORG 100HASSUME CS: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 STARTMASM 5.0、 Emu8086环

30、境 HYPer五、汇编语言源程序的结构 2.EXE源程序结构1;*1.开始定义数据段*DSEG SEGMENT DATA X DB 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 ;指向自己

31、的数据段DSEG MOV DS, AX ;!主过程代码 RETF ;执行PSP头首位置的int 20H,返回DOS.Main ENDP;3.1 子过程开始P_NamePROCNEAR ;!子程序代码RETP_NameENDPCSEG ENDS END Main ;开始进程是MainMASM 5.0、 Emu8086环境 或者MOV AH, 4ChINT 21h指向自己的数据段DSEG。DS原指向PSP,PSP第1字节位置压栈若用上边的代码结束,主过程开始个指令可以不用。HYPer五、汇编语言源程序的结构 2.EXE源程序结构2;*1.开始定义数据段*DSEG SEGMENT DATA X DB

32、 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: PUSH DS ;返回地址入栈,与RET对应 MOV AX, 0 PUSH AX MOV AX, DSEG ;指向自己的数据段DSEG MOV DS, AX ;!主程序代码 RETF ;执行PSP头首位置的int 20H,返回DOS.;3.1 子过程开始P_Nam

33、ePROCNEAR ;!子程序代码RETP_NameENDPCSEG ENDS END Main ;开始进程是MainMASM 5.0、 Emu8086环境 或者MOV AH, 4ChINT 21hHYPer五、汇编语言源程序的结构 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 ;返回地址入栈, MOV AX, 0 PUSH AX MOV AX,

温馨提示

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

评论

0/150

提交评论