代汇编语言程序设计.ppt
《代汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《代汇编语言程序设计.ppt(55页珍藏版)》请在三一办公上搜索。
1、新一代汇编语言程序设计第四章,内 容,4.1 汇编语句的表达式4.2 汇编伪指令语句4.3 宏功能语句,4.1.1 汇编语言语句格式,1.机器指令语句的形式标号:指令前缀 助记符 操作数;注释存储器操作数(M),一般由变量名、基址器、变址器、带比例因子的变址器、常量及有关运算符组成的表达式,表示要存取单元的偏移地址EA。例如,2.伪指令语句的形式名字 伪操作指令 参数,参数;注释参数是伪指令的操作对象,参数之间用逗号分隔参数根据指令不同可以没有,可以有1个、2个或多个汇编语言程序中,指令参数有数值型,它的主要形式是常数和数值表达式;机器指令的操作数有立即数;立即数就要用数值型参数表达,1.常数
2、,常数(常量)表示一个固定的数值它又分成多种形式:(1)十进制常数(2)十六进制常数(3)二进制常数(4)八进制常数(5)字符串常数(6)符号常数,字符串常数,用单引号或双引号括起来的单个字符或多个字符,其数值是每个字符对应的ASCII码的值例如:d=64HAB=4142HHello,Everybody!,符号常数,利用一个标识符表达的一个数值MASM提供等价机制,用于常量定义符号定义伪指令:等价EQU伪指令符号名 EQU 数值表达式符号名 EQU 等号=伪指令符号名=数值表达式常数若使用有意义的符号名来表示,可以提高程序的可读性,同时更具有通用性,符号定义DosWriteChar equ 2
3、CarriageReturn=13CallDOS equ 符号应用(左边程序段等价右侧的符号形式)mov ah,2;mov ah,DosWriteCharmov dl,13;mov dl,CarriageReturnint 21h;CallDOS,符号常数实例,2.数值表达式,数值表达式一般是指由运算符连接的各种常数所构成的表达式汇编程序在汇编过程中计算表达式,最终得到一个数值程序运行之前,就已经计算出了表达式;所以,程序运行速度没有变慢,但增强程序的可读性,运算符,算术运算符+-*/MOD逻辑运算符AND OR XOR NOT移位运算符SHL SHR关系运算符EQ NE GT LT GE L
4、E,二符号定义伪指令 用于给程序中多次出现的同一个常量或表达式赋一个符号名,也可以为其它符号名取一个新名字,并赋给新的类型属性。(1)EQU伪指令 例:FIRST EQU 1;定义常数 SECOND EQU FIRST*3+8;定义数值表达式 ADDR1 EQU DS:EBP+4;定义地址表达式 DWORDS EQU THIS DWORD;定义下面的字节变量为双字类型 BYTES DB 10 DUP(0)ADDR2 EQU WORD PTR BYTES;test2 返回;重新定义变量BYTES的名字和属性 START:MOV EAX,EBX GOON EQU FAR PTR START;重新定
5、义标号START的名字和属性 COUNT EQU ECX;为ECX重新取名注意:该等值语句只作为符号定义用,不产生任何目标代码,也不占用存储单元,并且不能是程序中曾经定义过的符号名。,2023年5月22日星期一,二变量定义伪指令就是为数据分配存储单元,且对这个存储单元取一个名字,即变量名。语句的格式如下:变量名 DB/DW/DD/DF/DQ/DT 表达式1,表达式2,变量名是可选的,DB/DW/DD/DF/DQ/DT是伪操作命令必须选用一种,表达式是赋给变量的初值,常见的有如下几种:(1)数值变量定义语句例:D_BYTE DB 30H,40H DB 50HD_WORD DW 1234H,567
6、8HD_DWORD DD D_DWORDD_TBYTE DT?D_FWORD DF 1234567890ABHD_QWORD DQEQU 与 DB等 的区别?test1,2023年5月22日星期一,(2)字符串变量定义语句可以用DB来实现,即为串中的每一个字符分配一个字节存储单元。字符串必须用引号括起来,并且不超过256个字符,它们在内存中自左至右把字符的ASCII码按地址递增顺序依次存放。例:STRING1 DB ABCDEFG用DW也可以定义字符串变量,即给两个字符组成的字符串分配两个字节存储单元,它们在内存中的顺序是前一个字符为高字节,存放在高地址,后一个字符为低字节,存放在低地址。例:
7、STRING2 DW AB,CD,EF,2023年5月22日星期一,(3)?语句存储单元中不预置确定的值,常用来预留存储单元,存放程序的中间结果或最终结果。例:FIRST DB?;分配一个字节单元 SECOND DD?,?,?;分配三个双字单元(4)带DUP的变量定义语句DUP 是重复数据定义操作符,可以为若干重复数据分配存储单元,并赋给相应的变量名。例:D1 DB 5 DUP(0)D2 DW 10H DUP(5678H)D3 DD 20H DUP(?)第一条语句为变量D1分配5个字节单元,每个单元初始值都为0;第二条语句为变量D2重复分配10H个字单元,每个单元初始值都为5678H,共占有2
8、0H个字节;第三条语句为变量D3保留20H个双字单元,没有定义初始值。D4 DB 3 DUP(4 DUP(6),8)表示为变量D4重复分配3个数据序列6,6,6,6,8,共占有15个字节单元。test 4,datasegment;数据段Xdb a,-5db 2 dup(100),?Ydb ABCdataends,字节单元定义实例,2023年5月22日星期一,标号标号之后必须有一个冒号(:),标号也可以单占一行。一标号的属性 段属性(SEG),指标号所在段的段基址。偏移地址属性(OFFSET),指标号所在段中的偏移地址,即标号所在地址与段基址之间的字节距离。距离属性或类型属性(TYPE),标号可
9、作为转移和调用指令的目标地址,也可作为过程定义伪指令的过程名。当标号只允许作为段内转移或调用指令的目标地址时,距离属性为NEAR;当标号作为段间转移或调用指令的目标地址时,距离属性为FAR。,例如:JMP LABEL1;程序跳转到标号LABEL1的位置CALL FAR PTR SUBPROGRAM;调用SUBPROGRAM过程(FAR)LABEL1:;LABEL1为段内转移标号(距离属性缺省为NEAR)LABEL2:;LABEL2为段内转移标号,单独占一行 SUBPROGRAM PROC FAR;SUBPROGRAM是属性为FAR的过程 RET 标号的距离属性可用LABEL伪指令加以改变。,定
10、义名字语句指令 格式:名字 LABEL 类型将左边名字定义为右边的类型属性。例如:LABEL1 LABEL FAR;改变LABEL1标号的距离属性。BARRAY LABEL BYTEWARRAY DW 1234H,5678H MOV AX,WARRAY1 MOV BL,BARRAY1 运行后,AX=?BL=?text3,2023年5月22日星期一,数值返回运算符运算对象必须是存储器操作数,即变量或标号。test5(1)SEG运算符:返回该变量或标号所在段的段基址。例如:MOV AX,SEG VAR 如果变量VAR所在段的段基址为1000H,则该指令执行的结果 等效于 MOV AX,1000H(
11、2)OFFSET运算符:返回该变量或标号所在段内的偏移地址。例如:MOV DI,OFFSET VAR 如果变量VAR在1000H段内的偏移地址是100H,则该指令执行 的结果等效于:MOV DI,100H(3)TYPE运算符:返回该变量的类型属性或者标号的距离属性。例:V1 DB 1,2,3V2 DW 1020H,3040HV3 DD 12345678HPF LABEL FARPN:MOV AH,TYPE V1;等效于MOV AH,1 MOV AL,TYPE V2;等效于MOV AL,2 MOV DL,TYPE V3;等效于MOV BL,4 MOV DH,TYPE PF;等效于MOV BH,-
12、2,2023年5月22日星期一,属性与返回数值的关系,2023年5月22日星期一,五、修改属性运算符(1)PTR运算符格式:PTR 根据地址表达式的不同,所赋给的新类型可以是BYTE、WORD、DWORD、FWORD、QWORD、TBTYE、NEAR、FAR等,它们只在所在的指令内有效。例:TABLE DB 1,2,3,4,5,6,7,8 ADD WORD PTR DI,100;指明目的操作数为字类型 JMP DWORD PTR BX;指明为段间转移 MOV EAX,DWORD PTR TABLE;临时修改TABLE为双字类;型,(EAX)=04030201H 见12页(2)THIS运算符把它
13、后面指定的类型或距离属性赋给当前的变量、标号或地址表达式,但不分配新的存储单元,往往与伪指令EQU或连用,为当前存储单元定义一个指定类型的变量或标号,类型属性也可以是BYTE、WORD、DWORD、FWORD、QWORD、TBTYE、NEAR、FAR等。例:DAT EQU THIS WORD POINT EQU THIS FAR第一条语句将变量DAT的类型属性定义为字,不管DAT原来的类型是什么,从本语句开始,DAT成为字节变量;第二条语句将标号POINT的距离属性定义为FAR,不管POINT原来的距离属性是什么,从本语句开始,POINT成为远标号。,LABC EQU THIS BYTELAB
14、D DW 4321H,2255H这样就给同一片存储单元LABD,取了二个具有不同数据类型的变量名。于是,在指令中,引用不同的变量名,就使用其不同的数据属性:*如果引用变量名LABD,是按“字”属性来访问;*如果引用变量名LABC,是按“字节”属性来访问。如此一来,指令“MOV AL,LABC”和“MOV AL,byte ptr LABD”是等效的所不同的是:当以“字节”属性访问LABD存储区时,不必使用强制属性符PTR,而改用“字节”属性变量LABC即可。,2023年5月22日星期一,六、其它运算符(1)高低分离运算符HIGH运算符和LOW运算符分别用于从16位运算对象中分离出高字节和低字节。
15、从MASM6.0开始引入了HIGHWORD运算符和LOWWORD运算符分别用于从32位符号常量中分离出高字和低字部分。例:MOV AH,HIGH 5678H;(AH)=56H DATA16 EQU 1234H MOV AL,LOW DATA16;(AL)=34H DATA32 EQU 1234FFFFH MOV AX,LOWWROD DATA32;(AX)=0FFFFH(2)方括号运算符:运算符中可以是数组变量的下标或地址表达式,以区别操作数和操作数地址。例:ARRAY DB 1,2,3,4,5;ARRAY为数组变量 MOV AL,ARRAY4;”4”为下标,(AL)=5 MOV BX,OFF
16、SET ARRAY;(BX)=ARRAY的偏移地址 MOV AH,BX;(AH)=1 MOV DX,WORD PTR ARRAY1;(DX)=302H(3)运算符的优先级:一般可以用括号来改变运算符的优先级别。例:MOV AL,18 OR 5 AND 10;AL=18(12H)MOV AL,(18 OR 5)AND 10;AL=2,2023年5月22日星期一,LENGTH运算符 返回变量中所定义的元素个数,如果变量是用重复数据操作符DUP说明的,则返回DUP前面的数值;如果没有DUP说明,则返回的值总是1。例:D1 DW 10H DUP(0)D2 DB 20H DUP(0)D3 DW 1234
17、H,5678H D4 DB ABCDEFGH MOV AL,LENGTH D1;(AL)=10H MOV AL,LENGTH D2;(AL)=20H MOV AL,LENGTH D3;(AL)=1H MOV AL,LENGTH D4;(AL)=1HSIZE运算符 返回变量所占的总字节数,且等于LENGTH和TYPE两个运算符返回值的乘积。例如,对于上例中的变量D1、D2、D3、D4,SIZE的返回值如下所示:MOV AL,SIZE D1;(AL)=20HMOV AL,SIZE D2;(AL)=20HMOV AL,SIZE D3;(AL)=2HMOV AL,SIZE D4;(AL)=1H,202
18、3年5月22日星期一,运算符的优先级,WIDTH(记录字段宽度)MASK(记录字段的屏蔽位),2023年5月22日星期一,5.3 宏汇编语言的伪指令,符号定义、变量定义、程序分段定义、过程定义、模块定义、宏定义、条件汇编、以及格式和列表控制等。5.3.1 段定义和程序说明伪指令,2023年5月22日星期一,一、完整分段定义伪指令 1.段定义伪指令 SEGMENT/ENDS 将程序分成段:代码段,数据段,堆栈段,附加段。格式:段名 SEGMENT 定位类型组合属性类别名(段体)段名 ENDS,功能:指出段名和段的各种属性,并表示段的开始和结束位置。,段定义由伪操作SEGMENT开始、ENDS结束
19、。其中:SEGMENT 和ENDS 必须成对出现,且语句前必须有段名,段名必须相同。SEGMENT和ENDS语句之间可以有指令和其他伪指令,表示存放在该段内存的变量、指令或其他伪指令对该段内存的处理 程序中可以定义多个段。程序经汇编、连接及装入内存后,段名为一具体的段值。,合法标识符,有段基地址和段内偏移量两个属性,与某个存储单元相联系。,2023年5月22日星期一,(1)定位类型用于告诉链接程序,链接时(各模块.obj)本段首地址的边界定位方式,常有四种:,PARA:段的起始地址必须是16的倍数(XXXX0H),这是一种默认方式。PAGE:段的起始地址必须是256的倍数(XXX00H),25
20、6字节为一页,在页的起点上。WORD:段的起始地址必须是偶数(XX0B)。BYTE:段的起始地址可以是任何地址。,(2)组合类型 在多模块(每个模块有自己的代码段、数 据段、堆栈段)组合时,告诉Link程序本 段与其他模块中同名段的组合链接关系。,2023年5月22日星期一,NONE:本段与其他同名段无组合关系,并有自己的段起始 地址,这是一种默认方式。PUBLIC:在满足定位类型的前提下,LINK程序将其与其他 模块中的同名段邻接在一起,共用一个段地址。STACK:同PUBLIC。链接以后作为堆栈段,并自动初始化 SS、SP。若程序中不说明STACK,则必须由用户 在程序的开始处,自己通过语
21、句设置SS、SP。COMMON:各模块中同名段重叠覆盖,有着相同的起始地 址。段的长度取决于最长的COMMON段。段的 内容为所链接的最后一个模块中COMMON段的 内容。MEMERY:链接在其他所有段的后面(高端存储区)。若有 多个MEMERY段,则只认第一个,其余按 COMMON处理。,2023年5月22日星期一,(3)段字属性在32位80X86微处理器中,新增加了USE属性说明。对于16位CPU默认的是16位段,即USE 16。而对于汇编32位80X86CPU指令时,它默认采用32位段,即USE 32。但可以使用USE 16指定标准的16位段。若在程序开头使用了.386伪指令(见简化段定
22、义伪指令),缺省类型为32位段字长。注意,在禁止用80386的情况下,使用USE选择项将导致出错。(4)段类别名属性类别名可以是任何合法的名字,必须用单引号括起来。在连接处理时,链接程序把类别名相同的所有段存放在连续的存储区内。典型的类别名如:DATA,STACK,CODE。以上是定位类型、组合类型、段字和类别名四个参数的说明,各参数之间用空格分隔。在选用时,可以只选其中一个或两个参数项,但不能交换它们之间的顺序。,2023年5月22日星期一,ORG伪指令和当前位置计数器汇编时将段名填入段表,同时为该段配备一个初值为0的位置计数器$。计数器依次累计段内语句被汇编后生成的目标代码字节个数。可用O
23、RG伪指令把位置计数器的值设置成需要的值。在数据段中,ORG后面的数据定义伪指令就从指定位置进行分配单元;在代码段中,ORG后面的一条指令语句就从指定位置生成目标代码;表达式的值应该是非负的整数。例:ORG 0F0H;从0F0H开始安排数据 ORG$+10H;跳过10H个字节后安排数据 DW 1,$+4,$+4;100H单元的字值为1,102H单元的字值;为106H,104H单元的字值为108H ARRAY DB 12,34,56,5 DUP(?);定义字节数组LEN EQU$-ARRAY;LEN的值为ARRAY变量所占的字节数8,2023年5月22日星期一,2.段寄存器说明伪指令 格式:AS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计
链接地址:https://www.31ppt.com/p-4893393.html