版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章汇编语言程序设计
4.1
程序设计语言概述
4.2
汇编语言的程序结构与语句格式
4.3
汇编语言的伪指令
4.4
汇编语言程序设计方法
4.5
模块化程序设计技术
4.6
综合应用程序设计举例
4.7
汇编语言与C/C++语言的混合编程第4章汇编语言程序设计本章重点:源程序基本结构汇编语言的语法规则(基本语法及常用伪指令)汇编语言程序设计方法。程序:是一组为完成某种功能而按一定顺序(由算法确定)编排的指令序列。汇编语言:具有执行速度快、易于实现对硬件控制等优点,是实时控制等应用软件经常使用的程序设计语言。
第4章汇编语言程序设计
南京航空航天大学电子信息工程学院
4.1程序设计语言概述机器语言:当指令和数据都用二进制代码表示时,计算机能够直接识别与执行,因而称之为机器语言。高级语言:是完全独立于机器的通用语言,效率低。面向过程、面向对象,必须译成机器语言。汇编语言:是将机器指令符号化了的编程语言。
是一种采用助记符表示的、面向CPU指令系统的程序设计语言。1.3种语言机器语言程序(目标代码)高级语言源程序编译或解释(可由编译程序完成)汇编语言源程序汇编(可由汇编程序完成)第4章汇编语言程序设计
南京航空航天大学电子信息工程学院①能够利用硬件系统的特性(寄存器、标志、中断系统等)直接对位/字节/字/寄存器/存储单元/I/O端口进行处理。
②采用CPU指令系统提供的各种寻址方式编制程序目标代码占用内存少,执行速度快,效率高,具有实时性。用汇编语言编写程序的优点:常用于编写系统软件、实时通信与控制程序、I/O接口驱动等。缺点:依赖于机器硬件,通用性和移植性较差。2.汇编程序(Assembler)(1)汇编程序的作用
①
将源程序翻译成机器语言程序;②按用户要求自动分配存储区域(如程序区、数据区、堆栈区等);③自动将各种进制→2#数;将字符→ASCII码;计算表达式的值;
④自动对源程序进行检查,指出语法错误(如,非法格式、未定义的助记符和标号、漏掉操作数等)
南京航空航天大学电子信息工程学院第4章汇编语言程序设计汇编程序提供汇编语言源程序的所有语法规则,常用的有
:①ASM
基本汇编,占内存少;②MASM
宏汇编,除ASM功能外,还支持:
宏操作、条件汇编、结构、记录等高级宏汇编语言功能。有各种版本,并不断在升级中;
TASM(TurboAssembler)
Borland公司的汇编编译器,性能同MASM。④OPTASM(OptimizingAssembler)一种优化的MASM(2)汇编程序分类Microsoft公司3.汇编语言程序的上机与处理过程
南京航空航天大学电子信息工程学院第4章汇编语言程序设计上机环境硬件系统软件
应用软件操作系统:DOS系统编辑器:
EDIT.exe编译程序:MASM.exe连接程序:LINK.exe调试程序:DEBUG.exe用户开发的程序:ABC.exe等CPU、存储器(ROM、RAM)、I/O接口、输入、输出设备第4章汇编语言程序设计编辑源程序
EDIT
ABC.ASM汇编源程序
MASM
ABC.ASM形成目标程序
ABC.OBJ连接目标程序
LINK
ABC.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章汇编语言程序设计语法:语句和程序结构必须遵循的规则4.2汇编语言的程序结构与语句格式
4.2.1汇编语言源程序的框架结构源程序应按编译器(如,MASM汇编程序)能够理解的语法编写每段由伪指令SEGMENT开始,至ENDS结束(完整段定义)。代码段:程序的主体(必不可少的段)。堆栈段:在内存建立堆栈区,以存放中断或子程序调用时的断点地址、各模块间传递的参数等。数据段和附加数据段:在内存中建立适当容量的工作区,以存放程序需要的常数或变量等。(1)源程序由若干个逻辑段组成程序中段的顺序:数据段、堆栈段定义在前,代码段在后。(①变量应先定义;②汇编过程遇到变量时需要知道变量的属性)
源程序的结构特点:
按逻辑段组织源程序。包括代码段、堆栈段、数据段等。
第4章汇编语言程序设计程序结构
(P133);
段名1 SEGMENT ;一个段的开始 语句1
语句2 ……
段名1 ENDS ;一个段的结束; 段名2 SEGMENT ;另一个段的开始
……
段名2 ENDS ;另一个段的结束; …… ;其它段; END START ;源代码结束源程序以END结束,它通知汇编程序停止汇编。START标号为程序运行时的起始地址。第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章汇编语言程序设计终止当前程序使其正确返回到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章汇编语言程序设计源程序与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已由DOS设置,在用户程序开始处应重新设置。第4章汇编语言程序设计4.2.2汇编语言的语句1.语句的种类与格式(1)语句的种类语句:汇编语言源程序的基本组成单位,规定一个基本操作。源程序:语句序列,完成某个特定的操作任务。①指令语句
——可执行语句,对应CPU指令系统规定的一条指令。三种基本语句:指令语句、伪指令语句和宏指令语句
汇编时,汇编程序为之产生一一对应的机器目标代码。例:MOVDS,AX ;双字节指令,机器码为8EH、D8H②伪指令语句
——由伪指令构成的说明语句(不可执行),可在任何段内汇编时,指示汇编程序如何汇编源程序,如分配存储单元、将程序分段等,本身不产生目标代码,CPU不执行。第4章汇编语言程序设计例:SEGMENT/ENDS;将程序分段信息提供给汇编程序,以不同
;的名字来说明是数据段、代码段、堆栈段例:MESSAGEDB‘THISISASAMPLEPROGRAM.’
;定义变量MESSAGE在数据段DATA中的存放形式
;汇编时,汇编程序将MESSAGE定义为一个字节类
;型数据区的首地址,并按字节存储字符串。③宏指令语句
——是以某个宏名字定义的一段指令序列汇编时,程序中有宏指令语句的地方被展开成相应的指令序列。宏指令语句是一般性指令语句的扩展。例:SHIFT MACRO ;定义宏指令语句SHIFT
MOV CL,4 SAL AL,CL ENDM
南京航空航天大学电子信息工程学院第4章汇编语言程序设计①标号和名字
分别是为指令单元和伪指令所起的符号名称,是自定义的标识符。
命名必须符合汇编语言对标识符的规定:
以字母开头,由字母(不区分大小写)、数字(0~9)及部分特殊
字符(?@$和下划线_等)组成的字符串,长度不超过31。
不能是有特定意义的保留字,如寄存器名AL和助记符等。标号
后必须有冒号,代表指令所在存储单元的符号地址。在程序中作为JMP、LOOP等指令的转移目标。名字
用于定义常量、变量、过程、段名等,指示所定义变量、过程以及段的起始地址。(2)语句的格式指令语句的一般格式:
[标号:] [前缀]指令助记符 [操作数] [;注释]
伪指令语句的格式:
[名字] 伪指令定义符[操作数] [;注释][]表示可选
南京航空航天大学电子信息工程学院第4章汇编语言程序设计②助记符、定义符
规定指令或伪指令的操作功能,是语句中唯一不可缺少的部分。
指令助记符,汇编程序将其翻译成机器代码。
MOV
AX,100
;B8
0001
伪指令定义符,汇编程序根据其要求的功能进行处理。
data
SEGMENT
;data与某个段地址对应
stringDB‘Tsinghua’;定义string为字节存储区的起始地址前缀仅可出现在指令助记符前(如,REP及段超越前缀等)
指令语句中的操作数提供操作对象、存放位置、访问形式。
操作数可以是1个、2个或0个,2个时用逗号‘,’分开。
(INCBX;MOVAX,DATA;RET)伪指令语句中操作数的格式和含义随伪操作指令各有不同。③操作数
南京航空航天大学电子信息工程学院第4章汇编语言程序设计④注释操作数的表现形式有4种——
常量操作数:如,34等。寄存器操作数:如,AX等。存储器操作数:如,[0100H]等。表达式操作数:如,[BX+2]、SEGNUM1等。以“;”开始,对程序的功能加以说明。汇编程序对“;”之后的内容不做处理。
注释对汇编不起任何作用,不对应于任何机器码,仅增强源程序的可读性。
语句中的操作数1.常量操作数
在运行期间不变化的量:立即数、端口地址。
常用:
(1)
数值常量
2#(B)、10#(D)、8#(Q)、16#(H)的整型常量。
对16#:必须以数字打头,若最高位为字母A~F,必须加
前缀0,以与H结尾的标识符区别(如:AH,abcdH)。
(2)
字符串常量‘1234’
是用单引号括起来的一个或多个字符,值为字符的ASCII码值。
例:‘A’=41H‘AB’=4142H ‘1234’→31H,32H,33H,34H→31323334H MOVAL,‘G’
(3)符号常量
指在程序中用标识符形式表示的常量,它的使用可
提高程序的通用性等。
南京航空航天大学电子信息工程学院2.Reg操作数
操作数部分是寄存器名,如:AX、SI和DS等。3.存贮器操作数
有标号与变量两种(1)标号:在代码段内
与指令地址相关联。(或某个过程起点位置相关联)(3)标号和变量都与存储器地址相关联,都具有以下三种属性:
段属性(SEGMENT):段基址,标号或变量所在段的段地址。
偏移量属性(OFFSET):段内偏移地址,标号或变量所在地
址与所在段的段起始地址之差。(2)变量:在数据段或堆栈段内
是存放数据的存贮单元的符号地址,与各种存储器操
作数寻址方式有关。常以变量名的形式出现在程序中。
南京航空航天大学电子信息工程学院
类型属性(TYPE):对变量,指变量存取单位的字节数大小。有字节(BYTE)、字(WORD)、双字(DWORD)、4字、10字节5种。对标号,指标号与使用它的指令之间的距离远近。(如:对转移指令来说,有NEAR标号或FAR标号)
4.
表达式操作数
——表达式由各种操作数、运算符和操作符组成,可出现于
源程序的任何地方,在汇编时计算(而不是在程序执行
过程中)。(1)有两类表达式(根据表达式所表示的内容而分)。
数值表达式:由常量及算术逻辑运算符、或关系运算符连接而
成。在汇编时产生一个数值。
地址表达式:由常量、变量、标号、寄存器的内容及一些运算
符组成。其值表示存储器地址,有以上三种属性。
汇编程序对表达式进行运算后,得到一个确定的数值,再把这个数值汇编到指令中。
例:
MOVAX,
12–4
;MOVAX,
8
;数字表达式
LEABX,[
string+4
]
;地址表达式
ES:[SI+4]
;地址表达式
(2)运算符和操作符
MASM宏汇编中有三种运算符:算术、逻辑和关系运算符两种操作符:分析和合成操作符运算符:实现对操作数的相关运算。
操作符:完成对操作数属性的定义、调用和修改。主要有:
1.算术运算符(+、-、×、/、MOD) 2.逻辑运算符(AND、OR、NOT、XOR) 3.关系运算符(EQ、NE、GT、GE、LT、LE)
真:FFFFH;假:0 4.分析操作符(SEG、OFFSET、TYPE、SIZE、
LENGTH、HIGH、LOW) 5.合成操作符(PTR、DS:、THIS、SHORT)
南京航空航天大学电子信息工程学院①算术运算符
(+、-、×、/、MOD(取余数))MOVAX,6×8←MOVAX,48
数值表达式中可使用所有算术运算符
地址表达式仅使用‘+、-’两种算术运算符
常用:标号或变量±常量
算术运算符不影响标志位
例:完成80H+90H
解:MOVAL,80H+90H
;使用数值表达式
;(AL)=10H、CF=不变
MOVAL,80H
;使用加法指令
ADDAL,90H
;(AL)=10H、CF=1
南京航空航天大学电子信息工程学院运算后仍为标号或变量,其3个属性中的类型及段基址属性不变,仅修改了偏移量属性。例:PLACE+2×3
;若PLACE与某存贮单元地址关,则PLACE+2×3仍与某存贮单元相关。②逻辑运算符(AND、OR、XOR和NOT)
——实现操作数按位逻辑操作,只适用于数值表达式。
MOVAX,80hOR70h←MOVAX,0F0h注:逻辑运算符与逻辑指令助记符形同意不同
作为指令助记符时,是在程序运行时被执行,操作对象可以
是寄存器或存储器操作数。
作为运算符时,是在程序汇编时由汇编程序计算的,计算结
果充当指令的某一个操作数或构成操作数的部分例:ANDDX,PORTAND0FEH运算符汇编时产生一立即数,并得到“ANDDX,imm”
的目标码CPU执行时完成
南京航空航天大学电子信息工程学院③关系运算符(EQ、NE、LT、GT、LE和GE)
——在两个无符号操作数之间进行大小关系比较
两个操作数必须同是数值或同是一个段内的两个存储器地址。
关系不成立(为假)则结果为“0”(假:0);若关系成立(为真)则结果为全“1”(真:FFFFH)。
结果值在汇编时获得。
例:MOVBX,PORTLT5
汇编为:MOVBX,0FFFFH(条件成立)或MOVBX,0000H(条件不成立)④分析操作符(数值返回运算符)
——运算对象是存储器操作数,它返回变量或标号的属性值。⑤合成操作符(修改属性运算符)
——作用于存储器操作数时可以改变它们的属性。
南京航空航天大学电子信息工程学院(3)运算符和操作符的优先权等级SHORT11OR,XOR10AND9NOT8EQ,NE,LT,LE,GT,GE7+,-(双目)6*,/,MOD,SHL,SHR5+,-(单目)4HIGH,LOW(操作数高、低字节)3PTR,OFFSET,SEG,TYPE,THIS,段寄存名:(加段前缀)2LENGTH,SIZE,WIDTH,MASH,(),[],〈〉1高低运算符和操作符优先级
南京航空航天大学电子信息工程学院例多个连续字节单元的累加DATA SEGMENT ;定义数据段D1 DB5DUP(?)
;连续的字节单元CC EQU$-D1 ;对单元计数SUM DW0 ;为结果保留一个字DATA ENDS ;数据段定义结束STACKSEGMENTPARASTACK‘STACK’ ;定义堆栈段
DB100DUP(?);100字节的栈空间STACKENDS ;堆栈段定义结束CODE SEGMENT ;定义代码段ASSUMEDS:DATA,SS:STACK,CS:CODE ;对各段进行说明BEGIN:MOVAX,DATA ;DS初始化为DATA MOVDS,AX
LEASI,D1 ;预置源数据的指针段定义语句伪指令作堆栈用的存储单元指令
南京航空航天大学电子信息工程学院定义存储单元的数据定义堆栈
MOVCX,CC
;预置次数
LODSBYTEPTR[SI]
;取一个数并修改指针
MOVAH,0
;清AX的高字节
CLC
;清CF位AGAN:ADCSUM,AX
;累加
LODSBYTEPTR[SI]
;再取数并修改指针
LOOPAGAN
;控制循环
MOVAH,4CH
;完成,返回DOS
INT21HCODE ENDS
;代码段结束
END BEGIN
;整个程序结束段定义汇编程序结束
南京航空航天大学电子信息工程学院
4.3汇编语言的伪指令语句
——指示汇编、链接程序如何进行汇编和链接,影响目标代码生成,本身不产生目标代码。
——有符号定义语句、数据定义语句、程序结构语句、模块链接语句、有关宏的语句、条件汇编语句等。4.3.1
基本伪指令语句
符号定义伪指令语句
给表达式赋予一种符号名,以便在程序中用它替代表达式。
1.等值语句EQU
格式:符号名EQU表达式
例:PORTEQU40H
;用PORT代替40H号端口
COUNTEQUCX ;用COUNT代替CX寄存器
M EQUMOV ;用M代替MOV指令助记符
注:EQU语句不能重新定义,即在同一源程序中,用EQU定义过的符号不能赋予不同的值。
南京航空航天大学电子信息工程学院例:BEQU[bp+8]BEQU20H
不行!
2.等号语句=
格式:符号名=表达式
功能与EQU类似。
例:PP=89FAH
;赋值
PP=PP+1
;PP=89FBH
注:
等号语句与EQU语句的相同点:
符号不是变量,
所以用EQU、=
定义的符号不占用存储器单元。区别:
等号语句可以在同一源程序中重复定义符号。
南京航空航天大学电子信息工程学院
数据定义伪指令
用于定义变量(程序中所用的存储器操作数),指定变量的类型和名称,并为其分配存储单元和预置初值。1.格式
[变量名]数据定义符操作数[,操作数]…[,操作数]
变量名指示存储器操作数的地址(符号地址)
数据定义符指示存储器操作数的类型(字节、字、双字等)
操作数指示存储器操作数的内容,是赋给变量的初值。
多个相同类型的变量可在一条语句中定义
[]——表示可选
南京航空航天大学电子信息工程学院
汇编程序将定义的操作数,按其类型分配内存单元数,并顺序存入变量名指向的内存单元中。
常用的数据定义符有:DB
变量为字节数据类型DW
变量为字数据类型,存放时低对低高对高。DD
变量为双字数据类型,存放时低对低高对高。
其它的数据定义符有:
DQ
变量为4字数据类型(64位)
DT
变量为10字节数据类型(80位)
南京航空航天大学电子信息工程学院
经过定义的变量有3种属性:SEGMENT,OFFSET,TYPE
若某个变量表示的是一个数组,则其类型属性为变量的单个元素所占用的字节数。xxyyzz01FFFC0100FFFFFC0001000000FFFFFFFFFC000000
1-1FC
1-1FC
1-1FC例:定义赋初值的变量
dataSEGMENT
xxDB1,-1,0fcH
yyDW1,-1,0fcH
zzDD1,-1,0fcHdataENDS
南京航空航天大学电子信息工程学院
2.具体形式和功能(1)为数据项分配存储单元,用变量名作为该存储单元的名称。
例:X DB 25H YDW 4142H ZDD 12345678H
初始值也可以是表达式如:
IN_PORT DB PORT_VALOUT_PORTDB PORT_VAL+1
其中,PORT_VAL已由EQU语句赋了值。(2)预留内存单元,但不赋值,以存放运算结果。
例:ADB?
BDB?X12H34H56H78H41H42H25HYZ
南京航空航天大学电子信息工程学院存储形式如图(3)定义一个表(数组)
例:W_TABLEDW1122H,3344HB_TABLEDB1,2,4,9,16
当表中的操作数相同时,可用重复操作符DUP来缩写:
格式:重复次数DUP(操作数)
例:ALL_ZERODB0,0,0,0,0,0ALL_ZERODB6DUP(0)(4)定义字符串(只能用DB定义)
例:MESSAGEDB ‘HELLO’
每个字符的值为它的ASCII码值,所以用DB来定义。str1str25473696e67487561494e5055543a0d0a24‘T’‘s’‘i’‘n’‘g’‘H’‘u’‘a’‘I’‘N’‘P’‘U’‘T’‘:’0dH0aH‘$’例:
str1
DB'TsingHua‘
str2
DB'INPUT:',0dH,0aH,'$'
南京航空航天大学电子信息工程学院存放形式如右图
当字符串长度不超过两个字符时,也可以用DW来定义。
例:STRING1 DB ‘AB’STRING2 DW ‘AB’STRING3 DW ‘AB’,‘CD’注意:3个及其以上的字符,只能用DB定义。
例:
str1
DW‘abcd’str2
DD‘abcd’43H44H41H42H41H42H42H41HSTRING1STRING2STRING3
南京航空航天大学电子信息工程学院dataSEGMENTxxDB1,-1,0FCHyyDW1,-1,0FCHzzDD1,-1,0FCHstrDB'TsingHua'bufDB4,?,4DUP(?)DB‘dataend’dataENDScodeSEGMENTASSUMECS:codeASSUMEDS:datastart:MOVAX,dataMOVDS,AXLEABX,xxLEASI,yyLEADI,zzMOVAH,4CHINT21HcodeENDSENDstart例:
在DEBUG下查看变量存放情况。(5)当操作数是标号或变量时,可用DW或DD将标号或变量操作数的偏移地址或全地址来初始化存储器。例:XXDWCYCLEYYDDCYCLE…CYCLE:MOVBX,AX
;CYCLE是程序的一个NEAR标号例:TABLEDB12H,34H
TAL_PSDDTABLETABLESEGTABLEOFFSET34H12HTAL_PSTABLE例:VAR3DWVAR+1
;将VAR+1的偏移
地址存入VAR3开始的两个字节或VAR3DDVAR+1
;将VAR+1的全地
址存入VAR3开始的两个字
南京航空航天大学电子信息工程学院(6)数据定义语句使汇编程序对访问存储器的指令,产生正确的目标代码。例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
;这里类型不匹配
南京航空航天大学电子信息工程学院3.分析操作符与合成操作符
分析操作符(数值返回运算符)
——运算对象是存储器操作数,它返回变量或标号的属性值。
合成操作符(修改属性运算符)
——作用于存储器操作数时可以改变它们的属性。(1)分析操作符(SEG、OFFSET、TYPE、SIZE、LENGTH)
使用格式:操作符标号或变量
①SEG、OFFSET——返回标号或变量的段地址和偏移地址例:
ARRAYDB100DUP(0)
…
MOVAX,SEGARRAY
MOVDS,AX
;对DS初始化
MOVBX,OFFSETARRAY
MOVAL,[BX]用分析或合成操作符,可以返回或修改存储器操作数的3种属性。
②TYPELENGTHSIZE
TYPE
——返回存储器操作数(标号或变量)的类型值。
LENGTH——返回变量用DUP定义的重复次数。
SIZE
——返回TYPE和LENGTH的乘积,表示为变量所分配的字节存储单元总数。存储器操作数类型属性类型值说明字节变量字变量双字变量BYTEWORDDWORD124变量类型的每个数据占用的字节数标号标号NEARFAR-1-2距离属性值(没有实际物理意义)
南京航空航天大学电子信息工程学院例1:MOVAX,TYPEARRAY ARRAY是字节变量,该语句汇编结果为MOVAX,1例2:注:用LENGTH返回的存储区必须用DUP来定义,否则返回1。数据定义LENGTH操作符SIZE操作符
BUFFER1…DB…01H,02HLENGTHBUFFER1=2SIZEBUFFER1=1×2=2BUFFER2…DW…1234HLENGTHBUFFER2=1SIZEBUFFER2=2×1=2BUFFER3..DD…100DUP(20H)LENGTHBUFFER3=100SIZEBUFFER3=4×100=400BUFFER4..DB…‘ABCD……Z’LENGTHBUFFER4=26SIZEBUFFER4=1×26=26
南京航空航天大学电子信息工程学院
(2)合成操作符
(PTR、LABLE、THIS)
①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
南京航空航天大学电子信息工程学院配合EQU伪指令,还可以为原变量定义新的变量名,如:
ARRAY1DB0,1,2,3,4ARRAY2DW0,1,2,3,4WBYTEEQU
WORDPTRARRAY1
BWORD
EQU
BYTEPTRARRAT2
MOVBX,WBYTE[3]
MOVCL,BWORD[6]
PTR用来指明标号的类型属性时,可确定是段内转移或段间转移。
例:INCHES:CMPSUM,100
…
JMPNEARPTRINCHES;段内转移
… ;NEARPTR可省略
JMPFARPTRINCHES对标号:
南京航空航天大学电子信息工程学院例: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②LABLE——
为当前存储单元定义一个指定类型的标号或变量。常用于定义一个数据块或标号,使它们具有多重名字和属性。
使用格式:标号或变量名LABLE类型例:WBYTELABLEWORD
;为变量WBYTE定义
;一个字类型的数据区
ARRAYDB1,2,3,4MOVAL,ARRAY
;01H→ALMOVAX,WBYTE
;0201H→AX③THIS——与EQU配合使用,具有LABLE的同样作用。
使用格式:标号或变量名EQUTHIS类型
例:BWORDEQUTHISBYTE
;定义字节
ARRAYDW100DUP(?);定义字WBYTE、ARRAY指向同一个数据区,但有不同的类型属性。将原定义的字缓冲区ARRAY按字节区BWORD使用。
程序分段伪指令
用于告诉汇编程序和链接程序如何按逻辑段来组织程序和利用存储器。具体来说规定
段的起始和结束指定属性开始地址边界段类型同名段如何结合在一起有两种段定义简化段定义:对MASM5.0以上版本完整段定义:对所有版本只介绍完整段定义
南京航空航天大学电子信息工程学院1.段定义语句SEGMENT/ENDS
——用于对DS、ES、SS、CS段的定义
格式:
段名
SEGMENT[定位类型][组合属性][‘类别名’]
…
(段体)
…
段名
ENDS
段定义由伪操作SEGMENT开始、ENDS结束。SEGMENT和ENDS必须成对出现,且段名必须相同。
SEGMENT和ENDS语句之间可以有指令和其他伪指令,表示存放在该段内存中的变量、指令或其他伪指令对该段内存的处理
程序中可以定义多个段。
程序经汇编、连接及装入内存后,段名为一具体的段值(常量值)。
南京航空航天大学电子信息工程学院合法标识符,与某个存储单元相联系。功能:指出段名和段的各种属性,并表示段的开始和结束位置。段定义的相关约定(1)定位类型——告诉链接程序链接时段的起始边界,有4种选择:(2)组合类型——
在多模块(每个模块有自己的代码段、数据段、堆栈段)组合时,告诉链接程序本段与其他模块中同名段的链接关系,有6种选择:定位类型含义PARA(节)段的起始地址必须为16的倍数(xxxx0H)PAGE(页)段的起始地址必须为256的倍数(xxx00H),也就是页的起点上WORD(字)段的起始地址必须为偶数,它最适合于安排类型为字的数据段BYTE(字节)段可以从任意地址开始缺省类型为PARA。组合类型含义NONE(默认状态)本段与其他模块中的同名段无逻辑关系,不组合,各自有自己的段起始地址PUBLIC在满足定位类型的前提下,LINK程序将本段与其他模块中说明为PUBLIC的同名段邻接在一起,共用一个段地址,即合成一个物理段STACK是默认堆栈段需要指定的组合类型。LINK程序将所有堆栈段链接成一个连续段(其长度符号各堆栈段的长度之和),链接后自动初始化SS、SP。如果在定义堆栈段时没有将其说明为STACK组合类型,则需要在程序中用指令设置SS和SP的值,此时LINK程序会给出一个警告信息COMMON各模块中由COMMON方式说明的同名段重叠覆盖,有着相同的起始地址。段的长度取决于最长COMMON段的长度,段的内容为所链接的最后一个模块中COMMON段的内容以及没有覆盖到的前面COMMON段的内容MEMORY本段定位在所有链接在一起的其他段的最后(存储器高地址区域)。若有多个MEMORY段,汇编程序认为所遇到的第一个为MEMORY,其余为COMMONAT表达式本段定位在表达式的值所指定的段地址上。如AT1930H,表示本段的起始地址为19300H(3)类别名——给各段的名字信息,表示段的类别。类别必须用单引号括起来,典型类别名如:‘STACK’、‘CODE’和‘DATA’等。
若缺省‘类别名’,则表明该段类别为空。同名同类别的段在内存中依序连续存放。
例:AT0903H
;本段从09030H开始存放。
南京航空航天大学电子信息工程学院例:两个模块模块1:
STACKSEGMENTSTACKDW20DUP(?)STACKENDSDATASEGMENTCOMMON……DATAENDSCODESEGMENTPUBLIC……CODEENDS …… END模块2:
STACKSEGMENTSTACKDW30DUP(?)STACKENDSDATASEGMENTCOMMON
……DATAENDSCODESEGMENTPUBLIC
……CODEENDS……END堆栈段名STACK,组合类型STACK。数据段名DATA,组合类型COMMON。代码段名CODE,组合类型PUBLIC。
南京航空航天大学电子信息工程学院汇编连接后,有:
...
...
..
.模块1DATA模块2代码模块1代码模块2DATA设模块2DATA>模1DATASTACK50个字
南京航空航天大学电子信息工程学院2.段寄存器说明伪指令
格式:ASSUME段寄存器:段名[,段寄存器:段名,…](1)
设定特定的Sreg指向特点的段,说明源程序中定义的段应由哪一个Sreg去寻址。否则,汇编程序无法生成机器代码程序。(2)ASSUME并未真正的将段地址装入相应的Sreg。Sreg的初值还必须由用户在程序的开始处用MOV指令来设置(CS除外)。例:P154说明如下:
①段定义时用了STACK,系统会自动初始化SS、SP,这时可去掉SS:STACK以及代码段中初始化SS、SP的四条语句。
②
CS、IP的初始值由伪指令ENDMAIN装入,标号MAIN标志程序开始执行的第一条指令地址,只有主程序的结束语句允许带标号(MAIN)。
南京航空航天大学电子信息工程学院END伪指令:
格式END启动地址
作用:
指示源程序到此结束。(汇编程序对END之后的语句不进行处理)。
源程序中必须有END结束语句。启动地址可是一个标号或过程名,指示程序的入口。程序装入内存后,系统跳转到入口处,开始执行程序。③
程序中
MOVBL,XMOVALPHA,BL
两条语句
因为ASSUME伪指令的作用被汇编成:
MOVBL,DS:X MOVES:ALPHA,BL
基于①、②,通常我们在程序中仅需对DS、ES段寄存器作初始化赋值。
南京航空航天大学电子信息工程学院
3.组定义伪指令GROUP
格式:组名GROUP
段名[,段名……]
GROUP将程序中若干不同名的段集合成一个组,并赋予一个组名,使它们都装在一个64KB的物理段中。这时组内不同类型的段运行时共用一个Sreg,组内各段间的跳转都可以看作段内跳转。④可以用ASSUME段寄存器:NOTHING语句取消先前建立的段与段寄存器的联系,需要时可再重新建立段寄存器与新的段之间的关联。
南京航空航天大学电子信息工程学院
4.指定地址伪指令ORG
在汇编程序中,有一个软件计数器(LC)——地址计数器。在每个段定义开始处,它被复位为0。当汇编程序逐行扫描语句时,用LC保存当前指令的地址。
格式1:ORG
表达式
;将表达式的值(0~65535)→LC
格式2:ORG$+表达式;将LC的当前值$+表达式的值→LC
功能:强行指定地址计数器LC的当前值,在段内改变它以后的代码或数据存放的偏移地址。
ORG语句之后段内所有的代码或数据均以表达式(常量)的值为起始偏移量连续存放,除非遇到另一个ORG语句。
此语句本身并不占内存。
南京航空航天大学电子信息工程学院例1:设DATA的段地址为2000HDATA
SEGMENT
ORG
0004H
AVR1DW2030H
AVR2DB40H
DWVRDWAVR1
DDVRDDAVR2DATAENDS20H30H00H00H06H00H04H40H20HAVR1AVR2DWVRDDVR0004H0006H0007H0009H
南京航空航天大学电子信息工程学院
例2:VECTSEGMENTORG10VECT1DW47A5HORG20VECT2DW0C956HORG$+8(跳过8个字节的存储区)VECT3DW0123H
01
23
...
C9
56
...
47
A514H15H16H1EH
南京航空航天大学电子信息工程学院16H+8=1EH1020例3:ARRAYDW1,2,$+4,3,4,$+40074H0075H76H 77H78H79H7AH7BH7CH7DH7EH
00
01
82
00
04
00
03
00
7C
00
02
00ARRAY
78H+4
($+4)7EH+4
($+4)
南京航空航天大学电子信息工程学院例4:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB4115T 088-2023 在用场(厂)内专用机动车辆风险评估规范
- 2024年抹灰班组承包合同新范本
- 2024年度技术开发合同:某互联网公司技术开发及服务协议
- 押题03水循环与水量平衡-备战2023年高考地理之考前押大题(原卷版)
- 2024年携手乐斯泉软水体验尊享优惠
- 2024年房屋交易简易合同
- 2024年教育培训机构服务合同
- 制定大学个人暑假计划(4篇)
- 2024年携手共创:多媒体内容独家授权协议
- DB4106T 8-2019 猪肉生产环节兽药残留控制技术规范
- 国企纪检监察嵌入式监督的探索与实践
- 浅议小升初数学教学衔接
- 设备安装应急救援预案
- 深基坑工程降水技术及现阶段发展
- 暂堵压裂技术服务方案
- 《孔乙己》公开课一等奖PPT优秀课件
- 美的中央空调故障代码H系列家庭中央空调(第一部分多联机)
- 业主委员会成立流程图
- (完整版)全usedtodo,beusedtodoing,beusedtodo辨析练习(带答案)
- 广联达办公大厦工程施工组织设计
- 疑难病例HELLP综合征
评论
0/150
提交评论