汇编语言-南京航空航天大学课程课件_第1页
汇编语言-南京航空航天大学课程课件_第2页
汇编语言-南京航空航天大学课程课件_第3页
汇编语言-南京航空航天大学课程课件_第4页
汇编语言-南京航空航天大学课程课件_第5页
已阅读5页,还剩303页未读 继续免费阅读

下载本文档

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

文档简介

第4章汇编语言程序设计

4.1程序设计语言概述

4.2汇编语言的程序结构与语句格式

4.3汇编语言的伪指令

4.4汇编语言程序设计方法4.5模块化程序设计技术

4.6综合应用程序设计举例

4.7汇编语言与C/C++语言的混合编程第4章汇编语言程序设计4.1程序设计语言概述1第4章汇编语言程序设计本章重点:源程序基本结构汇编语言的语法规则(基本语法及常用伪指令)汇编语言程序设计方法 16位实模式程序设计。程序:是一组为完成某种功能而按一定顺序(由算法确定)编排的指令序列。汇编语言:具有执行速度快、易于实现对硬件控制等优点,是实时控制等应用软件经常使用的程序设计语言。

第4章汇编语言程序设计本章重点:源程序基本结构程序:是一组2第4章汇编语言程序设计

南京航空航天大学电子信息工程学院

4.1程序设计语言概述机器语言:当指令和数据都用二进制代码表示时,计算机能够直接识别与执行,因而称之为机器语言。高级语言:是完全独立于机器的通用语言,效率低。面向过程、面向对象,必须译成机器语言。汇编语言:是将机器指令符号化了的编程语言。

是一种采用助记符表示的、面向CPU指令系统的程序设计语言。1.3种语言机器语言程序(目标代码)高级语言源程序编译或解释(可由编译程序完成)汇编语言源程序汇编(可由汇编程序完成)第4章汇编语言程序设计3第4章汇编语言程序设计

南京航空航天大学电子信息工程学院①能够利用硬件系统的特性(寄存器、标志、中断系统等)直接对位/字节/字/寄存器/存储单元/I/O端口进行处理。

②采用CPU指令系统提供的各种寻址方式编制程序目标代码占用内存少,执行速度快,效率高,具有实时性。用汇编语言编写程序的优点:常用于编写系统软件、实时通信与控制程序、I/O接口驱动等。缺点:依赖于机器硬件,通用性和移植性较差。2.汇编程序(Assembler)(1)汇编程序的作用

将源程序翻译成机器语言程序;②按用户要求自动分配存储区域(如程序区、数据区、堆栈区等);③自动将各种进制→2#数;将字符→ASCII码;计算表达式的值;

④自动对源程序进行检查,指出语法错误(如,非法格式、未定义的助记符和标号、漏掉操作数等)第4章汇编语言程序设计4

南京航空航天大学电子信息工程学院第4章汇编语言程序设计汇编程序提供汇编语言源程序的所有语法规则,常用的有

:①ASM

基本汇编,占内存少;②MASM

宏汇编,除ASM功能外,还支持:宏操作、条件汇编、结构、记录等高级宏汇编语言功能。有各种版本,并不断在升级中;TASM(TurboAssembler)Borland公司的汇编编译器,性能同MASM。④OPTASM(OptimizingAssembler)一种优化的MASM(2)汇编程序分类3.汇编语言程序的上机与处理过程Microsoft公司

5

南京航空航天大学电子信息工程学院第4章汇编语言程序设计上机环境硬件系统软件

应用软件操作系统:DOS系统编辑器:EDIT.exe编译程序:MASM.exe连接程序:LINK.exe调试程序:DEBUG.exe用户开发的程序:ABC.exe等CPU、存储器(ROM、RAM)、I/O接口、输入、输出设备

6第4章汇编语言程序设计编辑源程序

EDITABC.ASM汇编源程序

MASM

ABC.ASM形成目标程序ABC.OBJ连接目标程序

LINKABC.OBJ有连接错误信息?形成可执行程序

ABC.EXE装入可执行程序到内存,并执行D:\>sub>ABC下一程序用DEBUG调试可执行程序D:\>sub>DEBUG

ABC.EXE找到原因YNYNNYN有汇编错误信息?Y运行结果正确?用DEBUG调试程序查错?汇编语言上机过程D:>EDITABC.ASMD:>MASMABC有语法错,回EDIT下修改程序D:>LINKABC有错,回EDIT下修改程序D:>ABC运行结果错,回EDIT下改程序或在DEBUG下调试,找原因。D:>DEBUGABC.exe第4章汇编语言程序设计编辑源程序EDITABC.7第4章汇编语言程序设计语法:语句和程序结构必须遵循的规则4.2汇编语言的程序结构与语句格式

4.2.1汇编语言源程序的框架结构源程序应按编译器(如,MASM汇编程序)能够理解的语法编写每段由伪指令SEGMENT开始,至ENDS结束(完整段定义)。代码段:程序的主体(必不可少的段)。堆栈段:在内存建立堆栈区,以存放中断或子程序调用时的断点地址、各模块间传递的参数等。数据段和附加数据段:在内存中建立适当容量的工作区,以存放程序需要的常数或变量等。(1)源程序由若干个逻辑段组成程序中段的顺序:数据段、堆栈段定义在前,代码段在后。(①变量应先定义;②汇编过程遇到变量时需要知道变量的属性)

源程序的结构特点:

按逻辑段组织源程序。包括代码段、堆栈段、数据段等。

第4章汇编语言程序设计语法:语句和程序结构必须遵循的规8第4章汇编语言程序设计程序结构(P133);

段名1 SEGMENT ;一个段的开始 语句1 语句2 …… 段名1 ENDS ;一个段的结束; 段名2 SEGMENT ;另一个段的开始 …… 段名2 ENDS ;另一个段的结束; …… ;其它段; END START ;源代码结束源程序以END结束,它通知汇编程序停止汇编。START标号为程序运行时的起始地址。第4章汇编语言程序设计程序结构(P133);--9第4章汇编语言程序设计程序中段的使用:

8086/8088/80286允许同时使用4种类型的段:

代码段CS、堆栈段SS、数据段DS和附加数据段ES

80386/80486和Pentium系列允许同时使用6种段:

以上4个段+FS和GS两个附加数据段

一个源程序中每种类型的段可不止使用一个,如:n个数据段。(2)ASSUME伪指令

在代码段起始处用ASSUME伪指令说明各个段Reg与逻辑段的关系,并在程序起始处设置段Reg的初值(代码段CS除外)。(3)每段由若干语句行组成

每行只有一条语句且不能超过128个字符,允许有后续行。

在8086/8088和实地址模式下,每段的最大长度均为64KB;

在保护模式下,80286允许每个段的最大长度为16MB,80386~Pentium系列CPU允许4GB。END通知汇编程序停止汇编,START标号为程序运行时的起始地址。第4章汇编语言程序设计程序中段的使用:8086/8010第4章汇编语言程序设计终止当前程序使其正确返回到DOS状态的常用方法有:

将源程序中的主程序定义为FAR,其最后一条指令为RET;

在主程序的开始处使用3条指令:

PUSH DS

;保存程序段前缀PSP的段地址

MOV AX,0

;保存PSP的0偏移地址

PUSH AX ;注:

所保存地址中内容是INT20H(4)每条语句由4个字段构成。各字段间用空格分开。(5)源程序中应设有返回DOS的指令语句,使程序执行完后能够返回DOS系统的命令接受状态。①

标准序法②使用DOS的4CH号功能调用

不定义主程序为FAR过程并去掉上面3条指令;在代码段结束(CODEENDS)之前增加两条语句:

MOV AH,4CH ;功能号4CH→AH

INT 21H

;软中断调用MASM从5.0版开始支持简化段定义,它通过伪指令EXIT返回DOS。

当程序执行到RET,这两个地址会弹出送IP、CS第4章汇编语言程序设计终止当前程序使其正确返回到DOS11第4章汇编语言程序设计

源程序与PCDOS的接口

汇编语言源程序(.ASM)经过汇编转变为目标程序(.OBJ),当用链接程序对其进行链接和定位时,操作系统为用户程序:

①建立1个256字节的程序段前缀区(PSP)INT20HPSP起始0000H定位用户程序PSP用于存放用户程序信息,包括:

在PSP的开始处(偏移地址0000H)安排了一条INT20H软中断指令

INT20H功能:系统返回到DOS管理状态据此特征,用户编写程序时必须:在程序执行完毕后,能够转到PSP起始处执行INT20H指令。②定位用户程序③设置DS和ES的值,使之指向PSP的起始(DS/ES←PSP的段地址)

④以用户程序第1条指令的地址设置CS、IP;以堆栈段地址设置SS、SP。⑤运行用户程序③表明:DS/ES在用户程序中应重新设置第4章汇编语言程序设计源程序与PCDOS的接口①建12第4章汇编语言程序设计4.2.2汇编语言的语句1.语句的种类与格式(1)语句的种类语句:汇编语言源程序的基本组成单位,规定一个基本操作。源程序:语句序列,完成某个特定的操作任务。①指令语句——可执行语句,对应CPU指令系统规定的一条指令。三种基本语句:指令语句、伪指令语句和宏指令语句

汇编时,汇编程序为之产生一一对应的机器目标代码。例:MOVDS,AX ;双字节指令,机器码为8EH、D8H②伪指令语句

——由伪指令构成的说明语句(不可执行),可在任何段内。汇编时,指示汇编程序如何汇编源程序,如分配存储单元、将程序分段等,本身不产生目标代码,CPU不执行。第4章汇编语言程序设计4.2.2汇编语言的语句1.13第4章汇编语言程序设计例:SEGMENT/ENDS;将程序分段信息提供给汇编程序,以不同;的名字来说明是数据段、代码段、堆栈段例:MESSAGEDB‘THISISASAMPLEPROGRAM.’

;定义变量MESSAGE在数据段DATA中的存放形式;汇编时,汇编程序将MESSAGE定义为一个字节类;型数据区的首地址,并按字节存储字符串。③宏指令语句

——是以某个宏名字定义的一段指令序列汇编时,程序中有宏指令语句的地方被展开成相应的指令序列。宏指令语句是一般性指令语句的扩展。例:SHIFT MACRO ;定义宏指令语句SHIFT

MOV CL,4 SAL AL,CL ENDM

南京航空航天大学电子信息工程学院第4章汇编语言程序设计例:SEGMENT/ENDS14第4章汇编语言程序设计①标号和名字

——为指令单元和伪指令所起的符号名称,是自定义的标识符。

命名必须符合汇编语言对标识符的规定:

以字母开头,由字母(不区分大小写)、数字(0~9)及部分特殊字符(?@$和下划线_等)组成的字符串,长度不超过31。不能是有特定意义的保留字,如寄存器名AL和助记符等。标号

后必须有冒号,代表指令所在存储单元的符号地址。在程序中作为JMP、LOOP等指令的转移目标。名字

用于定义常量、变量、过程、段名等,指示所定义变量、过程以及段的起始地址。(2)语句的格式指令语句的一般格式:

[标号:] [前缀]指令助记符 [操作数] [;注释]

伪指令语句的格式:

[名字] 伪指令定义符[操作数] [;注释][]表示可选第4章汇编语言程序设计①标号和名字命名必须符合汇编15

南京航空航天大学电子信息工程学院第4章汇编语言程序设计②助记符、定义符

——规定指令或伪指令的操作功能,语句中唯一不可缺少的部分

指令助记符,汇编程序将其翻译成机器代码。

MOV

AX,100H

;B8

0001

伪指令定义符,汇编程序根据其要求的功能进行处理。data

SEGMENT

;data与某个段地址对应stringDB‘Tsinghua’;定义string为字节存储区的起始地址前缀仅可出现在指令助记符前(如,REP及段超越前缀等)

指令语句中的操作数提供操作对象、存放位置、访问形式。

操作数可以是1个、2个或0个,2个时用逗号‘,’分开。

(INCBX;MOVAX,DATA;RET)

伪指令语句中操作数的格式和含义随伪操作指令各有不同。③操作数

16

南京航空航天大学电子信息工程学院第4章汇编语言程序设计④注释汇编程序对“;”之后的内容不做处理。

注释对汇编不起任何作用,不对应于任何机器码,仅增强源程序的可读性。操作数的表现形式有4种——常量操作数:如,34等。寄存器操作数:如,AX等。存储器操作数:如,[0100H]等。表达式操作数:如,[BX+2]、OFFSETNUM1等。

——以“;”开始,对程序的功能加以说明。

17第4章汇编语言程序设计2.语句中的操作数(4种)(1)常量操作数

——汇编时值已确定且程序运行期间不变化(立即数/端口地址)①整型数值常量

用相应的后缀来定义:2#(B)、10#(D)、8#(Q)、16#(H)

16#:必须以数字开头来区别H结尾的字符串(AH,abcdH)即,最高位为字母‘A~F’时,必须加前缀0。②字符串常量

用单引号括起来的一个或多个字符,值为每个字符的ASCII码值。

例:‘2’=32H,‘12’=3132H,‘A’=41H,‘AB’=4142H MOVAL,‘G’;AL←G的ASCII码值③符号常量

在程序中用标识符形式表示的常量,以提高程序的通用性。(2)寄存器操作数

——操作数是寄存器名。如:AX、SI等,MOVAL,05。(程序中,字符串常量与整型数值常量可交替使用)第4章汇编语言程序设计2.语句中的操作数(4种)(118第4章汇编语言程序设计(3)存贮器操作数

——地址型操作数,有标号与变量两种。③标号和变量都与存储器地址相关联,应具有三种属性:

段属性(SEG):标号和变量对应存储单元的段地址,是段基地址的高16位。

偏移量属性(OFFSET):标号和变量对应存储单元的偏移地址。

类型属性(TYPE):

对标号指标号与使用它的指令之间的距离远近,有NEAR

(近,段内转移或调用标号)和FAR(远,段间)。

对变量指变量占用存取单元的字节数,有BYTE(字节)、

WORD(字)、DWORD(双字)、4字、10字节5种。②变量:在数据段或堆栈段内是以存储器寻址方式访问的操作数。在程序中通过变量名(变量存储单元的符号地址)来引用。①标号:在代码段内

是指令所存放单元的符号地址。第4章汇编语言程序设计(3)存贮器操作数③标号和变量都19

南京航空航天大学电子信息工程学院第4章汇编语言程序设计(4)表达式操作数

——由各种操作数、运算符和操作符组成,在汇编时计算。

(不是在程序执行过程中)。汇编程序先对表达式进行计算,再将得到的值汇编到指令中。①数值表达式和地址表达式数值表达式(汇编时产生一个数值):

由常量及算术逻辑运算符或关系运算符等连接而成。地址表达式(值表示存储器地址,有上述三种属性):由常量、变量、标号、寄存器及一些运算符组成。

例:MOVAX,12–4

;MOVAX,8

;数值表达式

LEABX,[

string+4

]

;地址表达式MOVBXES:[SI+4*3]

;地址表达式

20

南京航空航天大学电子信息工程学院第4章汇编语言程序设计

②运算符和操作符MASM宏汇编中有三类运算符:算术、逻辑、关系运算符

两类操作符:分析、合成操作符

运算符:实现对操作数的相关运算。

操作符:完成对操作数属性的定义、调用和修改。主要有:算术运算符(+、-、×、/、MOD)逻辑运算符(AND、OR、NOT、XOR)关系运算符(EQ、NE、GT、GE、LT、LE)真:FFFFH或假:0分析操作符(SEG、OFFSET、TYPE、SIZE、LENGTH、HIGH、LOW)合成操作符(PTR、DS:、THIS、SHORT)

21

南京航空航天大学电子信息工程学院第4章汇编语言程序设计

算术运算符

(+、-、×、/、MOD(取余数))MOVAX,6×8

;MOVAX,48﹡数值表达式中可使用所有算术运算符﹡算术运算符不影响标志位

例:完成80H+90H

可以MOVAL,80H+90H

;使用数值表达式

;AL=10H、CF不变

MOVAL,80H

;使用加法指令

ADDAL,90H

;AL=10H、CF=1运算结果仍为标号或变量,其三个属性中只有偏移量属性改变例:设PLACE是变量名,是个符号地址。则,

PLACE+2×3仍是变量名,与PLACE的偏移地址之差为6﹡地址表达式仅可使用‘+、-’两种算术运算符常用形式:标号或变量±常量

22

南京航空航天大学电子信息工程学院第4章汇编语言程序设计逻辑运算符(AND、OR、XOR和NOT)——实现操作数按位逻辑操作,只适用于数值表达式。

MOVAX,80hOR70h

;MOVAX,0F0h注意:逻辑运算符与逻辑指令助记符形同意不同﹡作为助记符时,在程序运行时被执行,操作对象是reg/mem﹡作为运算符时,在程序汇编时由汇编程序计算,计算结果构成指令操作数的一部分。例:ANDDX,PORTAND0FEH汇编时产生一立即数,并得到“ANDDX,imm”

的目标码CPU执行时完成运算符

23

南京航空航天大学电子信息工程学院第4章汇编语言程序设计——在两个无符号操作数之间进行大小关系比较:关系不成立(为假),则结果为“0”(假:0);关系成立(为真),则结果为全“1”(真:FFFFH)。分析操作符(数值返回运算符)

——运算对象是存储器操作数,它返回标号或变量的属性值。合成操作符(修改属性运算符)

——作用于存储器操作数(标号或变量)时可以改变它们的属性。例:MOVBX,PORTLT5汇编为:MOVBX,0FFFFH(条件成立)或:MOVBX,0000H(条件不成立)关系运算符(EQ、NE、LT、GT、LE和GE)

结果值在汇编时获得两个操作数必须同是数值或同一个段内的两个存储单元地址

24

南京航空航天大学电子信息工程学院第4章汇编语言程序设计③运算符和操作符的优先权等级SHORT11OR,XOR10AND9NOT8EQ,NE,LT,LE,GT,GE7+,-(双目)6*,/,MOD,SHL,SHR5+,-(单目)4HIGH,LOW(操作数高、低字节)3PTR,OFFSET,SEG,TYPE,THIS,段寄存名:(加段前缀)2LENGTH,SIZE,WIDTH,MASH,(),[],〈〉1高低运算符和操作符优先级

25

南京航空航天大学电子信息工程学院第4章汇编语言程序设计DATA SEGMENT ;定义数据段D1 DB5DUP(?) ;连续的字节单元CC EQU$-D1 ;对单元计数SUM DW0 ;为结果保留一个字DATA ENDS ;数据段定义结束STACKSEGMENTPARASTACK‘STACK’ ;定义堆栈段 DB100DUP(?) ;100字节的栈空间STACK ENDS ;堆栈段定义结束CODE SEGMENT ;定义代码段

ASSUME

DS:DATA,SS:STACK,CS:CODE ;对各段进行说明BEGIN:MOVAX,DATA ;DS初始化为DATA MOVDS,AX LEASI,D1 ;预置源数据的指针例:多个连续字节单元的累加定义存储单元的数据指令段定义语句伪指令作堆栈用的存储单元定义堆栈

26

南京航空航天大学电子信息工程学院第4章汇编语言程序设计段定义汇编程序结束

MOVCX,CC ;预置次数 LODSBYTEPTR[SI] ;取一个数并修改指针 MOVAH,0 ;清AX的高字节 CLC ;清CF位AGAN:ADCSUM,AX ;累加 LODSBYTEPTR[SI] ;再取数并修改指针 LOOPAGAN ;控制循环 MOVAH,4CH ;完成,返回DOS INT21HCODE ENDS ;代码段结束 END BEGIN ;整个程序结束

27第4章汇编语言程序设计

4.3汇编语言的伪指令语句——指示汇编、链接程序如何进行汇编与链接。影响目标代码生成,本身不产生目标代码。1.符号定义伪指令(1)等值语句EQU符号名EQU表达式

例:PORT1 EQU 312 ;给常量赋予符号名

PORT2 EQU PORT1+1;给数值表达式赋予符号名PORT2

ADDR EQU ES:[SI+4];给地址表达式定义一个名字

CHAR EQU ‘NAME’;为字符串定义新的名字

COUNT EQU CX;为CX定义新的符号名COUNT

LD EQU MOV ;为MOV定义新的符号名LD

注:用EQU定义过的符号不能重新定义符号定义、数据定义、程序分段、过程和宏定义、模块定义等。4.3.1

基本伪指令语句有选择处理器方式、数据定义、程序分段、条件汇编、结构定义等。

——给常量或表达式赋予一个符号名,方便在程序中的使用。第4章汇编语言程序设计4.3汇编语言的伪指令语句28

南京航空航天大学电子信息工程学院第4章汇编语言程序设计例:BEQU[BP+8]BEQU20H

不行!(2)等号语句=符号名=表达式

(功能与EQU类似)

EQU与=的区别:

在同一源程序中,用EQU定义过的符号不能重新定义,=可以。例:EMP=60 ;定义EMP等于60EMP=EMP+1 ;重新定义EMP等于61EMP=123*4 ;重新定义EMP等于492符号定义是定义在程序中要使用的常量。用EQU、=定义的符号不占用存储器单元。即,汇编程序不为这样的符号分配存储空间。特别注意:

29

南京航空航天大学电子信息工程学院第4章汇编语言程序设计2.数据定义伪指令(1)格式——用于定义变量(程序中所用的存储器操作数),指定变量的类型和名称,为变量分配存储单元并赋初值。[变量名]数据定义符操作数[,操作数]…[,操作数][]表示可选存放时低对低高对高

变量名指示变量存储单元的符号地址

数据定义符指示变量的类型(字节、字、双字等)

操作数指示变量的内容(是赋给变量的初值)多个相同类型的变量可在一条语句中定义常用的数据定义符有:

DB定义字节变量,每个变量分配1字节的存储单元。

DW定义字变量,每个变量分配2字节存储单元。

DD定义双字变量,每个变量分配4字节存储单元。

30第4章汇编语言程序设计经过定义的变量有三种属性:

SEGMENT,OFFSET,TYPExxyyzz01FFFC0100FFFFFC0001000000FFFFFFFFFC0000001-1FC1-1FC1-1FC例:定义赋初值的变量

dataSEGMENT

xx

DB1,-1,0fcH

yy

DW1,-1,0fcH

zz

DD1,-1,0fcH

dataENDS段地址可用操作符SEG获得偏移量可用操作符OFFSET获得数据类型可用操作符TYPE获得其它的数据定义符有:

DQ变量为4字数据类型(64位)

DT变量为10字节数据类型(80位)第4章汇编语言程序设计经过定义的变量有三种属性:xx31

南京航空航天大学电子信息工程学院第4章汇编语言程序设计①为数据项分配存储单元,用变量名作为该存储单元的名称。X12H34H56H78H41H42H25HYZ(2)具体形式和功能例:X DB25H YDW 4142HZDD12345678H

初始值也可以是表达式:

IN_PORT DBPORT_VALOUT_PORTDBPORT_VAL+1PORT_VAL是符号常量,已由EQU语句赋了值。PORT_VAL+1的值在汇编时计算②预留内存单元,但不赋初值,以存放运算结果。例:ADB? ;操作数用‘?’表示BDW?

32

南京航空航天大学电子信息工程学院第4章汇编语言程序设计例:ALL_ZERODB0,0,0,0,0,0ALL_ZERODB6DUP(0)④定义字符串(只能用DB定义)例:str1

DB'TsingHua‘

str2

DB'INPUT:',0dH,0aH,'$'

③定义一个表(数组)例:W_TABLEDW1122H,3344HB_TABLEDB1,2,4,9,16每个字符的值为它的ASCII码,所以只能用DB。DUP还可以嵌套使用,P141DUP是重复操作符str1str25473696e67487561494e5055543a0d0a24‘T’‘s’‘i’‘n’‘g’‘H’‘u’‘a’‘I’‘N’‘P’‘U’‘T’‘:’0dH0aH‘$’当表中的操作数相同时,可用DUP来缩写。格式:重复次数DUP(操作数)

33

南京航空航天大学电子信息工程学院第4章汇编语言程序设计例:STRING1DB ‘AB’STRING2DW ‘AB’STRING3DW ‘AB’,‘CD’例:

str1

DW‘abcd’str2

DD‘abcd’当字符串长度不超过两个字符时,也可以用DW来定义。注意:3个及以上的字符,只能用DB定义。STRING1STRING2STRING343H44H41H42H41H42H42H41H

34第4章汇编语言程序设计dataSEGMENTxxDB1,-1,0FCHyyDW1,-1,0FCHzzDD1,-1,0FCHstrDB'TsingHua'bufDB4,?,4DUP(?)DB‘dataend’dataENDScodeSEGMENTASSUMECS:codeASSUMEDS:datastart:MOVAX,dataMOVDS,AXLEABX,xxLEASI,yyLEADI,zzMOVAH,4CHINT21HcodeENDSENDstart例:在DEBUG下查看变量存放情况。第4章汇编语言程序设计dataSEGMENT例:35

南京航空航天大学电子信息工程学院第4章汇编语言程序设计⑤当操作数是标号或变量时,可用DW或DD将标号或变量操作数的偏移地址或全地址来初始化存储器。例:XXDWCYCLEYYDDCYCLE …CYCLE:MOVBX,AX

;CYCLE是程序中一条指令语句的标号例:TABLEDB12H,34H

TAL_PSDDTABLE例:VAR3DWVAR+1

;将VAR+1的偏移地址存入VAR3开始的两个字节或VAR3DDVAR+1

;将VAR+1的全地址存入

VAR3开始的两个字TABLESEGTABLEOFFSET34H12HTAL_PSTABLE

36第4章汇编语言程序设计⑥数据定义语句使汇编程序对访问存储器的指令,产生正确的目标代码。例1:OPER1DB?,?OPER2DW?,?

MOVOPER1,0

;字节0→OPER1

MOVOPER2,0

;字0→OPER2

例2:SUMDB?

…INCSUM

;变量SUM的字节内容+1例3:OPER1DB1,2

OPER2DW1234H,5678H

MOVAX,OPER1+1

MOVAL,OPER2

;这里类型不匹配第4章汇编语言程序设计⑥数据定义语句使汇编程序对访问37第4章汇编语言程序设计(3)分析操作符与合成操作符

分析操作符(数值返回运算符)

——运算对象是存储器操作数,它返回变量或标号的属性值。

合成操作符(修改属性运算符)——作用于存储器操作数时可以改变它们的属性。①分析操作符(SEG、OFFSET、TYPE、SIZE、LENGTH)

使用格式:操作符标号或变量例:ARRAYDB100DUP(0)

MOVAX,SEGARRAY

MOVDS,AX

;对DS初始化

MOVBX,OFFSETARRAY

MOVAL,[BX]用分析或合成操作符,可以返回或修改存储器操作数的三种属性。

南京航空航天大学电子信息工程学院SEG、OFFSET—返回标号或变量的段地址和偏移地址第4章汇编语言程序设计(3)分析操作符与合成操作符①38TYPELENGTHSIZE

TYPE

返回存储器操作数(标号或变量)的类型值

LENGTH

—返回变量用DUP重复定义的的数据项总数,其他情况返回1。

SIZE

—返回TYPE和LENGTH的乘积(为变量所分配的字节单元总数)对变量:1/2/4对标号:-1/-2数据定义LENGTH操作符SIZE操作符

BUFFER1DB01H,02HLENGTHBUFFER1=1SIZEBUFFER1=1×1=1BUFFER2DW1234HLENGTHBUFFER2=1SIZEBUFFER2=2×1=2BUFFER3DD100DUP(20H)LENGTHBUFFER3=100SIZEBUFFER3=4×100=400BUFFER4DB‘ABCD…Z’LENGTHBUFFER4=1SIZEBUFFER4=1×1=1例1:MOVAX,TYPEARRAY ;ARRAY是字节变量,该语句汇编结果为MOVAX,1例2:第4章汇编语言程序设计TYPELENGTHSIZE对变量:1/2/4数39

南京航空航天大学电子信息工程学院第4章汇编语言程序设计PTR—临时指定或修改存储器操作数的类型属性,保持原有的段、偏移地址属性,且原定义的类型属性不变。使用格式:类型PTR标号或变量例:INC[BX](有不确定性)INCBYTEPTR[BX]INCWORDPTR[BX]对变量:例:ARRAY1DB0,1,2,3,4ARRAY2DW0,1,2,3,4MOVBX,WORDPTRARRAY1[3]MOVCL,BYTEPTRARRAY2[6]MOVWORDPTR[SI],4②合成操作符

(PTR、LABLE、THIS)仅在当前所在的指令中有效类型有:BYTE、WORD、DWORD、NEAR、FAR等

40第4章汇编语言程序设计配合EQU伪指令,可以为原变量定义新的变量名。对标号:ARRAY1DB0,1,2,3,4ARRAY2DW0,1,2,3,4WBYTEEQUWORDPTRARRAY1BWORDEQUBYTEPTRARRAT2 MOVBX,WBYTE[3] ;按字使用 MOVCL,BWORD[6] ;按字节使用例:W_VAR DDINCHES …INCHES:CMPSUM,100 … JMPWORDPTRW_VAR;段内转移或 JMPDWORDPTRW_VAR;段间转移或 JMPNEARPTRINCHES;段内转移或 JMPFARPTRINCHES;段间转移NEARPTR可以略去用PTR指明标号的类型时,可确定是段内转移或段间转移。第4章汇编语言程序设计配合EQU伪指令,可以为原变量定41第4章汇编语言程序设计例:ABCDW?

A1EQUBYTEPTRABC

;A1是ABC的第一个字节

A2EQUBYTEPTRABC+1或A2EQUA1+1

MOVAL,A1

MOVAH,A2前例3:

OPER1DB1,2

OPER2DW1234H,5678H

MOVAX,OPER1+1MOVAL,OPER2

;这里类型不匹配对例3可如下处置:

MOVAX,WORDPTROPER1+1;AX=3402H

MOVAL,BYTEPTROPER2

;AL=34H

MOVAL,BYTEPTROPER2+1

;AL=12H第4章汇编语言程序设计例:ABCDW42

南京航空航天大学电子信息工程学院第4章汇编语言程序设计LABLE—为当前存储单元定义一个指定类型的标号或变量。常用于定义1个数据块或标号,使之具有多重名字和属性.

例:WBYTELABLEWORD

;定义一个字类型的数据区

ARRAYDB1,2,3,4;定义一个字节型的数据区MOVAL,ARRAY

;01H→ALMOVAX,WBYTE;0201H→AXTHIS—与EQU配合使用,具有LABLE的同样作用。

使用格式:标号或变量名EQUTHIS类型

例:BWORDEQUTHISBYTE;定义字节ARRAYDW100DUP(?);定义字WBYTE、ARRAY指向同一个数据区,但有不同的类型属性将原定义的字缓冲区ARRAY按字节区BWORD来使用使用格式:标号或变量名LABLE类型

43

南京航空航天大学电子信息工程学院第4章汇编语言程序设计3.程序分段伪指令(将程序分成若干逻辑段)具体来说规定

段的起始和结束指定属性开始地址边界段类型同名段的组合方式有两种段定义简化段定义:对MASM5.0以上版本完整段定义:对所有版本只介绍完整段定义——用于告诉汇编程序和链接程序,

如何按逻辑段来组织程序和利用存储器。

44

南京航空航天大学电子信息工程学院第4章汇编语言程序设计(1)段定义伪指令SEGMENT/ENDS

——定义DS/ES/SS/CS段,指出段名和段的各种属性。

段定义由伪操作SEGMENT开始、ENDS结束。SEGMENT/ENDS必须成对出现,且段名(合法标识符)必须相同。SEGMENT和ENDS语句之间可以有指令和其他伪指令,表示存放在该段内存中的变量、指令或其他伪指令对该段内存的处理。程序中可以定义多个段。程序经汇编、链接及装入内存后,段名为一具体的段地址。格式:段名SEGMENT[定位类型][组合属性][‘类别名’]…(段体)…段名ENDS段起始地址的高16位段的三个属性,顺序不可交换

45第4章汇编语言程序设计段的三个属性,为源程序的汇编与链接提供了必要的信息。①定位类型—告诉链接程序链接时段的起始边界。有4种选择。②组合类型—在多模块(每个模块有自己的代码段、数据段、堆栈段)组合时,告诉链接程序本段与其他模块中同名段的链接关系。有6种选择。定位类型含义PARA(节)段的起始地址必须为16的倍数(xxxx0H),缺省类型PAGE(页)段的起始地址必须为256的倍数(xxx00H),也就是页的起点上WORD(字)段的起始地址必须为偶数,它最适合于安排类型为字的数据段BYTE(字节)段可以从任意地址开始③类别名—给各段的名字信息,用单引号括起来(‘STACK’、‘CODE’、‘DATA’等)。若缺省,表明该段类别为空。

同名同类别的段在内存中依序连续存放。第4章汇编语言程序设计段的三个属性,为源程序的汇编与链46第4章汇编语言程序设计组合类型含义NONE(默认状态)本段与其他模块中的同名段无逻辑关系,各自有自己的段起始地址PUBLIC在满足定位类型的前提下,LINK程序将本段与其他模块中说明为PUBLIC的同名段邻接在一起,共用一个段地址,即合成一个物理段STACK是默认堆栈段需要指定的组合类型。LINK程序将所有堆栈段链接成一个连续段(长度是各堆栈段的长度之和),链接后自动初始化SS、SP。如果在定义堆栈段时没有将其说明为STACK组合类型,需要在程序中用指令设置SS和SP的值,此时LINK程序会给出一个警告信息COMMON各模块中由COMMON方式说明的同名段重叠覆盖,有着相同的起始地址。段的长度取决于最长COMMON段的长度,段的内容为所链接的最后一个模块中COMMON段的内容以及没有覆盖到的前面COMMON段的内容MEMORY定位在所有链接在一起的其他段的最后(存储器高地址区域)。若有多个MEMORY段,汇编程序认为所遇到的第一个为MEMORY,其余为COMMONAT表达式定位在表达式的值所指定的段地址上。如,AT1930H,表示本段的起始地址为19300H第4章汇编语言程序设计组合类型含义NONE(默认状47

南京航空航天大学电子信息工程学院第4章汇编语言程序设计例:两个模块,汇编连接后有——模块1:STACKSEGMENTSTACKDW20DUP(?)STACKENDSDATASEGMENTCOMMON……DATAENDSCODESEGMENTPUBLIC……CODEENDS …… END模块2:STACKSEGMENTSTACK

DW30DUP(?)STACKENDSDATASEGMENTCOMMON……DATAENDSCODESEGMENTPUBLIC……CODEENDS……END

48

南京航空航天大学电子信息工程学院第4章汇编语言程序设计汇编连接后,有:

...

.....

.模块1DATA模块2代码模块1代码模块2DATA设模块2DATA>模1DATASTACK50个字

49第4章汇编语言程序设计(2)段寄存器说明伪指令ASSUME例:P145说明如下:

①段定义时用了STACK,系统会自动初始化SS、SP,这时可去掉SS:STACK以及代码段中初始化SS、SP的4条语句。

CS、IP的初始值由伪指令ENDMAIN装入,标号MAIN标示程序开始执行的第1条指令地址,只有主程序的END允许带标号。

——建立段与段寄存器之间的联系,说明源程序中定义的段应由哪一个Sreg去寻址。格式:ASSUME段寄存器:段名[,段寄存器:段名,…]注意:

ASSUME并未真正的将段地址装入相应的SregSreg(CS除外)的初值必须由用户在程序的开始处用指令来设置基于①、②,通常在程序中仅需对DS、ES段寄存器作初始化。第4章汇编语言程序设计(2)段寄存器说明伪指令ASS50

南京航空航天大学电子信息工程学院第4章汇编语言程序设计

END伪指令(END启动地址)

——指示源程序到此结束(汇编程序不处理END之后的语句)注意:源程序中必须有END结束语句。启动地址可是一个标号或过程名,指示程序的入口。程序装入内存后,系统跳转到程序的入口处,开始执行。③

程序中

MOVBL,XMOVALPHA,BL因为ASSUME的作用被汇编成:

MOVBL,DS:XMOVES:ALPHA,BL④取消先前建立的段与段寄存器的联系

ASSUME段寄存器:NOTHING

需要时可再重新建立段寄存器与新的段之间的关联。

51

南京航空航天大学电子信息工程学院第4章汇编语言程序设计(3)组定义伪指令GROUP

组内各段装在一个64KB的物理段中,各段间的跳转是段内跳转。格式:组名GROUP段名[,段名……]——将程序中若干不同名的段集合成一个组,并指定组名。(4)指定地址伪指令ORGORG语句之后段内所有的代码或数据均以表达式(常量)的值为起始偏移量连续存放,除非遇到另一个ORG语句。

此语句本身并不占内存。格式1:ORG表达式

;将表达式的值(0~65535)→LC

格式2:ORG$+表达式;将LC的当前值$+表达式的值→LC——强行指定地址计数器LC的当前值,以改变段内在它之后的代码或数据块存放的偏移地址。记载正在汇编的指令代码或数据存放在当前段内偏移量的部件

52

南京航空航天大学电子信息工程学院第4章汇编语言程序设计DATA

SEGMENT

ORG

0004H

AVR1DW2030H

AVR2DB40H

DWVRDWAVR1

DDVRDDAVR2DATAENDS00H20H00H06H00H04H40H20H30HAVR1AVR2DWVRDDVR0004H0006H0007H0009H例1:设DATA的段地址为2000H

53

南京航空航天大学电子信息工程学院第4章汇编语言程序设计例2:VECTSEGMENTORG10VECT1DW47A5HORG20VECT2DW0C956HORG$+8(跳过8个字节的存储区)VECT3DW0123H23H01H…C9H56H…47HA5H102016H+8=1EH14H1EH15H16H

54第4章汇编语言程序设计0074H0075H76H 77H78H79H7AH7BH7CH7DH7EH008200040003007C00020001ARRAY

78H+4($+4)7EH+4($+4)例3:ARRAYDW1,2,$+4,3,4,$+4

南京航空航天大学电子信息工程学院第4章汇编语言程序设计0074H0082055

南京航空航天大学电子信息工程学院第4章汇编语言程序设计例4:

DATASEGMENTOR

温馨提示

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

评论

0/150

提交评论