代汇编语言程序设计

上传人:人*** 文档编号:577483000 上传时间:2024-08-22 格式:PPT 页数:55 大小:665.10KB
返回 下载 相关 举报
代汇编语言程序设计_第1页
第1页 / 共55页
代汇编语言程序设计_第2页
第2页 / 共55页
代汇编语言程序设计_第3页
第3页 / 共55页
代汇编语言程序设计_第4页
第4页 / 共55页
代汇编语言程序设计_第5页
第5页 / 共55页
点击查看更多>>
资源描述

《代汇编语言程序设计》由会员分享,可在线阅读,更多相关《代汇编语言程序设计(55页珍藏版)》请在金锄头文库上搜索。

1、新一代汇编语言程序设计第四章内 容v4.1 汇编语句的表达式v4.2 汇编伪指令语句v4.3 宏功能语句4.1.1 汇编语言语句格式v1. 机器指令语句的形式v标号: 指令前缀 助记符 操作数 ;注释v存储器操作数(M),一般由变量名、基址器、变址器、带比例因子的变址器、常量及有关运算符组成的表达式,表示要存取单元的偏移地址EA。v例如v2.伪指令语句的形式v名字 伪操作指令 参数,参数 ;注释v参数是伪指令的操作对象,参数之间用逗号分隔v参数根据指令不同可以没有,可以有1个、2个或多个v汇编语言程序中,指令参数有数值型,它的主要形式是常数和数值表达式;v机器指令的操作数有立即数;立即数就要用

2、数值型参数表达1. 常数v常数(常量)表示一个固定的数值v它又分成多种形式:(1)十进制常数(2)十六进制常数(3)二进制常数(4)八进制常数(5)字符串常数(6)符号常数字符串常数v用单引号或双引号括起来的单个字符或多个字符,其数值是每个字符对应的ASCII码的值v例如:d = 64HAB= 4142HHello, Everybody !符号常数利用一个标识符表达的一个数值MASM提供等价机制,用于常量定义符号定义伪指令:v等价EQU伪指令符号名 EQU 数值表达式符号名 EQU v等号=伪指令符号名 = 数值表达式常数若使用有意义的符号名来表示,可以提高程序的可读性,同时更具有通用性符号定

3、义DosWriteChar equ 2CarriageReturn = 13CallDOS equ 符号应用(左边程序段等价右侧的符号形式)mov ah,2;mov ah,DosWriteCharmov dl,13;mov dl,CarriageReturnint 21h;CallDOS符号常数实例符号常数实例2. 数值表达式v数值表达式一般是指由运算符连接的各种常数所构成的表达式v汇编程序在汇编过程中计算表达式,最终得到一个数值v程序运行之前,就已经计算出了表达式;所以,程序运行速度没有变慢,但增强程序的可读性运算符v算术运算符+ - * / MODv逻辑运算符AND OR XOR NOTv

4、移位运算符SHL SHRv关系运算符EQ NE GT LT GE LE二符号定义伪指令 用于给程序中多次出现的同一个常量或表达式赋一个符号名,也可以为其它符号名取一个新名字,并赋给新的类型属性。(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的名字和属性

5、START: MOV EAX,EBX GOON EQU FAR PTR START ;重新定义标号START的名字和属性 COUNT EQU ECX ;为ECX重新取名注意:该等值语句只作为符号定义用,不产生任何目标代码,也不占用存储单元,并且不能是程序中曾经定义过的符号名。 22 八月 2024二变量定义伪指令就是为数据分配存储单元,且对这个存储单元取一个名字,即变量名。语句的格式如下:变量名 DB/DW/DD/DF/DQ/DT 表达式1,表达式2,变量名是可选的,DB/DW/DD/DF/DQ/DT是伪操作命令必须选用一种,表达式是赋给变量的初值,常见的有如下几种:(1)数值变量定义语句例:

6、 D_BYTE DB 30H,40H DB 50HD_WORD DW 1234H,5678HD_DWORD DD D_DWORDD_TBYTE DT ?D_FWORD DF 1234567890ABHD_QWORD DQ 1122334455667788HEQU 与 DB等 的区别? test122 八月 2024(2)字符串变量定义语句可以用DB来实现,即为串中的每一个字符分配一个字节存储单元。字符串必须用引号括起来,并且不超过256个字符,它们在内存中自左至右把字符的ASCII码按地址递增顺序依次存放。 例: STRING1 DB ABCDEFG用DW也可以定义字符串变量,即给两个字符组成

7、的字符串分配两个字节存储单元,它们在内存中的顺序是前一个字符为高字节,存放在高地址,后一个字符为低字节,存放在低地址。 例: STRING2 DW AB,CD,EF22 八月 2024(3)?语句存储单元中不预置确定的值,常用来预留存储单元,存放程序的中间结果或最终结果。 例:FIRST DB ? ;分配一个字节单元 SECOND DD ?,?,? ;分配三个双字单元(4)带DUP的变量定义语句DUP 是重复数据定义操作符,可以为若干重复数据分配存储单元,并赋给相应的变量名。例:D1 DB 5 DUP (0) D2 DW 10H DUP (5678H) D3 DD 20H DUP (?)v第一

8、条语句为变量D1分配5个字节单元,每个单元初始值都为0;v第二条语句为变量D2重复分配10H个字单元,每个单元初始值都为5678H,共占有20H个字节;v第三条语句为变量D3保留20H个双字单元,没有定义初始值。 D4 DB 3 DUP (4 DUP (6),8)v表示为变量D4重复分配3个数据序列6,6,6,6,8,共占有15个字节单元。vtest 4 datasegment;数据段Xdb a,-5db 2 dup(100),?Ydb ABCdataends字节单元定义实例字节单元定义实例22 八月 2024标号标号之后必须有一个冒号(:),标号也可以单占一行。一标号的属性 段属性(SEG)

9、,指标号所在段的段基址。 偏移地址属性(OFFSET),指标号所在段中的偏移地址,即标号所在地址与段基址之间的字节距离。 距离属性或类型属性(TYPE),标号可作为转移和调用指令的目标地址,也可作为过程定义伪指令的过程名。当标号只允许作为段内转移或调用指令的目标地址时,距离属性为NEAR;当标号作为段间转移或调用指令的目标地址时,距离属性为FAR。例如:JMP LABEL1 ;程序跳转到标号LABEL1的位置CALL FAR PTR SUBPROGRAM ;调用SUBPROGRAM过程(FAR)LABEL1: ;LABEL1为段内转移标号(距离属性缺省为NEAR) LABEL2: ;LABEL

10、2为段内转移标号,单独占一行 SUBPROGRAM PROC FAR ;SUBPROGRAM是属性为FAR的过程 RET 标号的距离属性可用LABEL伪指令加以改变。v定义名字语句指令 格式: 名字 LABEL 类型将左边名字定义为右边的类型属性。v例如:LABEL1 LABEL FAR ; 改变LABEL1标号的距离属性。BARRAY LABEL BYTEWARRAY DW 1234H,5678H MOV AX,WARRAY1 MOV BL,BARRAY1 运行后,AX=? BL=? text3v 22 八月 2024数值返回运算符运算对象必须是存储器操作数,即变量或标号。 test5(1)

11、SEG运算符:返回该变量或标号所在段的段基址。 例如: MOV AX, SEG VAR 如果变量VAR所在段的段基址为1000H,则该指令执行的结果 等效于 MOV AX,1000H(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,TYP

12、E V1 ;等效于MOV AH,1 MOV AL,TYPE V2 ;等效于MOV AL,2 MOV DL,TYPE V3 ;等效于MOV BL,4 MOV DH,TYPE PF ;等效于MOV BH,-222 八月 2024属性与返回数值的关系 变量变量/ /标号属性标号属性返回数值返回数值 字节变量字节变量 BYTEBYTE字变量字变量 WORDWORD双字变量双字变量 DWORDDWORD三字变量三字变量 FWORDFWORD四字变量四字变量 QWORDQWORD十字节变量十字节变量 TBYTETBYTE1 12 24 46 68 81010标号标号NEARNEAR标号标号FARFAR 1

13、FFH1FFH 2FEH2FEH22 八月 2024五、修改属性运算符(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运算符把它后面指定的类型或

14、距离属性赋给当前的变量、标号或地址表达式,但不分配新的存储单元,往往与伪指令EQU或连用,为当前存储单元定义一个指定类型的变量或标号,类型属性也可以是BYTE、WORD、DWORD、FWORD、QWORD、TBTYE、NEAR、FAR等。例: DAT EQU THIS WORD POINT EQU THIS FAR第一条语句将变量DAT的类型属性定义为字,不管DAT原来的类型是什么,从本语句开始,DAT成为字节变量;第二条语句将标号POINT的距离属性定义为FAR,不管POINT原来的距离属性是什么,从本语句开始,POINT成为远标号。vLABC EQU THIS BYTELABD DW 43

15、21H, 2255H这样就给同一片存储单元LABD,取了二个具有不同数据类型的变量名。于是,在指令中,引用不同的变量名,就使用其不同的数据属性:* 如果引用变量名LABD,是按“字”属性来访问;* 如果引用变量名LABC,是按“字节”属性来访问。如此一来,指令“MOV AL,LABC”和v“MOV AL, byte ptr LABD”是等效的v所不同的是:当以“字节”属性访问LABD存储区时,不必使用强制属性符PTR,而改用“字节”属性变量LABC即可。22 八月 2024六、其它运算符(1)高低分离运算符vHIGH运算符和LOW运算符分别用于从16位运算对象中分离出高字节和低字节。从MASM

16、6.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,O

17、FFSET 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=222 八月 2024LENGTH运算符 返回变量中所定义的元素个数,如果变量是用重复数据操作符DUP说明的,则返回DUP前面的数值;如果没有DUP说明,则返回的值总是1。例: D1 DW 10H DUP (0) D2 DB 20H DUP (0)

18、D3 DW 1234H,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,SI

19、ZE D4 ;(AL)=1H22 八月 2024运算符的优先级vWIDTH(记录字段宽度)vMASK(记录字段的屏蔽位)22 八月 20245.3 宏汇编语言的伪指令v符号定义、变量定义、程序分段定义、过程定义、模块定义、宏定义、条件汇编、以及格式和列表控制等。5.3.1 段定义和程序说明伪指令具体来说规定段的起始和结束指定属性开始地址边界段类型 同名段如何结合在一起有两种段定义简化段定义:对MASM5.0以上版本完整段定义:对所有版本22 八月 2024一、完整分段定义伪指令一、完整分段定义伪指令 1. 段定义伪指令 SEGMENT/ENDS 将程序分成段:代码段,数据段,堆栈段,附加段。

20、格式: 段名 SEGMENT 定位类型组合属性类别名 (段体) 段名 ENDS 功能:指出段名和段的各种属性, 并表示段的开始和结束位置。段定义由伪操作SEGMENT开始、ENDS结束。其中: SEGMENT 和ENDS 必须成对出现, 且语句前必须有段名,段名必须相同。 SEGMENT和ENDS语句之间可以有指令和其他伪指令, 表示存放在该段内存的变量、指令或其他伪指令对该段内存的处理 程序中可以定义多个段。 程序经汇编、连接及装入内存后,段名为一具体的段值。合法标识符,有段基地址和段内偏移量两个属性,与某个存储单元相联系。22 八月 2024 (1)定位类型用于告诉链接程序,链接时(各模块

21、.obj) 本段首地址的边界定位方式,常有四种: PARA:段的起始地址必须是16的倍数(XXXX0H), 这是一种默认方式。 PAGE:段的起始地址必须是256的倍数(XXX00H), 256字节为一页,在页的起点上。 WORD:段的起始地址必须是偶数(XX0B)。 BYTE:段的起始地址可以是任何地址。(2) 组合类型 在多模块(每个模块有自己的代码段、数 据段、堆栈段)组合时,告诉Link程序本 段与其他模块中同名段的组合链接关系。22 八月 2024 NONE: 本段与其他同名段无组合关系,并有自己的段起始 地址,这是一种默认方式。 PUBLIC:在满足定位类型的前提下,LINK程序将

22、其与其他 模块中的同名段邻接在一起,共用一个段地址。 STACK: 同PUBLIC 。链接以后作为堆栈段,并自动初始化 SS、SP。若程序中不说明STACK,则必须由用户 在程序的开始处,自己通过语句设置SS、SP。 COMMON:各模块中同名段重叠覆盖,有着相同的起始地 址。段的长度取决于最长的COMMON段。段的 内容为所链接的最后一个模块中COMMON段的 内容。 MEMERY:链接在其他所有段的后面(高端存储区 )。若有 多个MEMERY段,则只认第一个,其余按 COMMON处理。22 八月 2024(3)段字属性v在32位80X86微处理器中,新增加了USE属性说明。对于16位CPU

23、默认的是16位段,即USE 16。而对于汇编32位80X86CPU指令时,它默认采用32位段,即USE 32。但可以使用USE 16指定标准的16位段。若在程序开头使用了.386伪指令(见简化段定义伪指令),缺省类型为32位段字长。注意,在禁止用80386的情况下,使用USE选择项将导致出错。(4)段类别名属性v类别名可以是任何合法的名字,必须用单引号括起来。在连接处理时,链接程序把类别名相同的所有段存放在连续的存储区内。典型的类别名如:DATA,STACK,CODE。以上是定位类型、组合类型、段字和类别名四个参数的说明,各参数之间用空格分隔。在选用时,可以只选其中一个或两个参数项,但不能交换

24、它们之间的顺序。22 八月 2024ORG伪指令和当前位置计数器汇编时将段名填入段表,同时为该段配备一个初值为0的位置计数器$。计数器依次累计段内语句被汇编后生成的目标代码字节个数。可用ORG伪指令把位置计数器的值设置成需要的值。v在数据段中,ORG后面的数据定义伪指令就从指定位置进行分配单元;v在代码段中,ORG后面的一条指令语句就从指定位置生成目标代码;v表达式的值应该是非负的整数。例: ORG 0F0H ;从0F0H开始安排数据 ORG $+10H ;跳过10H个字节后安排数据 DW 1,$+4,$+4 ;100H单元的字值为1,102H单元的字值 ;为106H,104H单元的字值为10

25、8H ARRAY DB 12,34,56,5 DUP (?) ;定义字节数组LEN EQU $-ARRAY ;LEN的值为ARRAY变量所占的字节数822 八月 20242 . 2 . 段寄存器说明伪指令段寄存器说明伪指令 格式:ASSUME 段寄存器:段名,段寄存器:段名, 设定特定的Sr指向特定的段,说明源程序中定义的段应由 哪一个Sr去寻址。不如此,汇编程序无法生成目标代码程序。 ASSUME 并未真正的将段地址装入相应的Sr。 Sr的初值还必须由用户在程序的开始处用MOV指令来设置(CS除外)。(1 1)DSDS和和ESES的装入的装入DSDS和和ESES的装入可以通过给寄存器赋初值的

26、指令来完成。但是应注意到,由于段的装入可以通过给寄存器赋初值的指令来完成。但是应注意到,由于段寄存器不能用立即数寻址方式直接传送,因此寄存器不能用立即数寻址方式直接传送,因此装入段基址必须借助于通用寄存装入段基址必须借助于通用寄存器进行间接传送器进行间接传送。例:例:CODES SEGMENTCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS,ES:EXTRS ASSUME CS:CODES,DS:DATAS,SS:STACKS,ES:EXTRS START:MOV AX,DATAS START:MOV AX,DATAS MOV MOV DS,AX

27、DS,AX MOV MOV AX,EXTRSAX,EXTRS MOV ES,AXMOV ES,AX CODES CODES ENDSENDS22 八月 2024(2)SS的装入v一种方法是在SEGMENT语句中,组合类型选用STACK,并在ASSUME语句中,把堆栈用的段指派给段寄存器SS。 STACKS SEGMENT PARA STACK DB 100H DUP (?) STACKS ENDS CODES SEGMENT ASSUME CS:CODES,SS:STACKS v另一种方法是在SEGMENT语句中,组合类型未选用STACK参数,或者在程序中使用另一个堆栈段时,可采用类似于DS和

28、ES的装入方法,用传送指令实现对SS的装入操作。(3)CS和IP的装入vCS和IP的装入通常是按照结束伪指令指定的地址来自动完成的。结束伪指令的格式是: END v起始地址是一个标号或地址表达式,这个地址是程序装入内存后的起始点,它的段基址和偏移量就是CS和IP的内容。源程序SAMPLE.ASM: STACKS SEGMENT STACK DW 128 DUP(?) STACKS ENDS DATAS SEGMENT STRING DB Welcome!,13h,10h,$ DATAS ENDS CODES SEGMENT ASSUME CS:CODE,DS:DATAS START: MOV

29、AX , DATAS MOV DS, AX LEA DX , STRING MOV AH , 09H INT 21H MOV AX , 4C00H INT 21H CODES ENDS END START堆栈段数据段代码段源程序模块结束22 八月 20243. 组定义伪指令GROUPv格式:组名 GROUP 段名,段名v将程序中若干不同名的段集合成一个组,并赋予一个组名,使它们都装在一个64KB的物理段中, 这时组内不同类型的段运行时共用一个 Sreg,组内各段间的跳转都可以看作段内跳转。例:STACKSEG SEGMENT STACK ;定义堆栈段 DB 256 DUP (?) STACKS

30、EG ENDSDATA1 SEGMENT WORD PUBLIC CONST CONS1 DW 100 ;定义数据段1DATA1 ENDSDATA2 SEGMENT WORD PUBLIC VARS VAR1 DW ? ;定义数据段2DATA2 ENDS22 八月 2024DATAGROUP GROUP DATA1,DATA2 ;组合两个数据段,以DATAGROUP为段组名CODESEG SEGMENT PARA PUBLIC CODE ;定义代码段 ASSUME CS:CODESEG,DS:DATAGROUP,SS:STACKSEGSTART: MOV AX,DATAGROUP MOV DS

31、,AX ;DS赋初值对该组寻址 MOV AX,CONS1 ;AX=100 MOV VAR1,AX ;VAR=100 MOV AX,OFFSET VAR1 ;AX=2 MOV AX,OFFSET DATA1 ;AX=2 (已分配2个字节内存单元) MOV AX,OFFSET DATA2 ;AX=4 (已分配4个字节内存单元) MOV AX,4C00H INT 21H ;DOS功能调用,可正常返回到操作系统CODESEG ENDS END START ;程序结束22 八月 2024二、简化分段定义伪指令在MASM 5.0版本以上的宏汇编语言中段的定义可以非常简单。.MODEL ;定义程序的存储模式

32、.STACK ;定义堆栈段, 长度缺省为1K字节.CODE ;定义代码段.DATA ;定义数据段.DATA? ;定义数据段,但初值不确定.FARDARA ;定义远调用数据段.FARDARA? ;定义远调用数据段,但初值不确定.CONST ;定义只读常数数据段.STARTUP ;程序起始点,并初始化DS、SS.EXIT 0 ;程序结束点,返回到操作系统22 八月 2024例: .MODEL SMALL ;定义小型内存模式.386 ;可以汇编386指令.STACK 100 ;定义堆栈段,长度为100字节.DATA ;数据段开始X DD 12345678HY DD 87654321HZ DD ?,?

33、.CODE ;代码段开始.STARTUP ;程序开始MOV EAX,XMUL YMOV Z,EAXMOV Z+4,EDX.EXIT 0 ;程序结束,返回, ;相当于MOV AX,4C00H和INT 21H两条指令END ;汇编结束22 八月 20241定义内存模式伪指令 .MODEL 存储模式 ,语言类型 ,操作系统类型 ,堆栈类型(1)存储模式: TINYTINY:微型模式,程序中的数据和代码放在同一微型模式,程序中的数据和代码放在同一64K64K段内段内, ,这也就是后缀为这也就是后缀为.COM.COM的程序。这种模式是的程序。这种模式是MASM6MASM6才引入的。才引入的。SMALLS

34、MALL:小型模式,程序中的代码放在小型模式,程序中的代码放在64KB64KB的数据段内的数据段内, ,数据放在数据放在64KB64KB代码的段内代码的段内( (包括数据段、堆栈段和附加段公用一个段包括数据段、堆栈段和附加段公用一个段),),因而对代码和数因而对代码和数据的访问可通过近程据的访问可通过近程(NEAR)(NEAR)调用来实现。一般程序默认的都是该模式。调用来实现。一般程序默认的都是该模式。MEDIUMMEDIUM:中型模式,程序中的数据放在中型模式,程序中的数据放在64KB64KB的数据段内的数据段内, ,代码量大于代码量大于64KB,64KB,因而可安排在不同段内。这样因而可安

35、排在不同段内。这样, ,数据是近程的数据是近程的, ,而代码是远程的。而代码是远程的。COMPACTCOMPACT:压缩模式,程序中的所有代码放在一个压缩模式,程序中的所有代码放在一个64KB64KB的代码段内的代码段内, ,而数而数据区可以大于据区可以大于64KB64KB。这样。这样, ,对代码的访问是近程的对代码的访问是近程的, ,而数据是远程的。而数据是远程的。LARGELARGE:大型模式,程序中的数据和代码均大于大型模式,程序中的数据和代码均大于64KB,64KB,但静态(常数)数但静态(常数)数据限制在据限制在64KB64KB之内。对程序和数据的访问默认都是远程的。之内。对程序和数

36、据的访问默认都是远程的。HUGEHUGE:巨型模式,程序中的数据和代码均大于巨型模式,程序中的数据和代码均大于64KB,64KB,静态数据也可以大于静态数据也可以大于64KB64KB。这样。这样, ,对代码、数据和数组的访问都是远程的。对代码、数据和数组的访问都是远程的。FLATFLAT:平展模式,用于创建一个平展模式,用于创建一个3232位的程序,它只能运行在位的程序,它只能运行在3232位位80X86CPU80X86CPU上。上。DOSDOS下不能使用下不能使用FLATFLAT模式,而编写模式,而编写3232位位WindowsWindows程序程序时,必须采用时,必须采用FLATFLAT模

37、式。模式。22 八月 2024(2)语言类型:v由它来告诉汇编程序将使用什么样的标识符的命名风格、子程序的调用和返回约定等。可使汇编语言程序与其它语言程序达到共享的目的。有效的语言类型为:C(C语言)、SYSCALL(系统调用)、STDCALL(标准调用)、 Basic(Basic语言)、 Fortran(Fortran语言) 、Pascal(Pascal语言)等。(3)操作系统类型:vOS_DOS是当前唯一支持的选项值,也是该选项的缺省值。(4)堆栈类型:v堆栈类型的值主要影响伪指令.STARTUP所生成的指令序列。该选项有二个可选值:NEARSTACK和FARSTACK。其中:NEARST

38、ACK是该选项的缺省堆栈类型。NEARSTACK堆栈段和数据段是同一段;FARSTACK堆栈段和数据段是不同的段,且堆栈不在段组DGROUP中。例:.MODEL SMALL, C, OS_DOS, FARSTACK 22 八月 20242处理器选择伪指令.8086和.8087 可用来汇编8086/8088处理器和8087协处理器的指令,这是缺省模式。.286、.286C、.286P、.287可用来汇编286系列微处理器的指令。.386、.386C、.386P、.387可用来汇编386系列微处理器的指令。.NO87取消使用协处理器指令。.486、.486C、.486P可用来汇编486系列微处理器

39、的指令。.586、.586C、.586P可用来汇编Pentium系列微处理器的指令。. 686、.686P可用来汇编Pentium Pro系列微处理器的指令。.MMX可用来汇编MMX指令。 .MMX和.686、.686P是MASM6.12引入的。.K3D可用来汇编AMD处理器的3D指令,是MASM6.13引入的。.XMM可用来汇编SSE指令和SSE2指令,是MASM6.15引入的。注意:80386以上处理器中,如果处理器选择伪指令放在.MODEL伪指令前面,那么段将定义成32位的段。如果希望处理器使用16位的段,则应在.MODEL伪指令后面使用处理器选择伪指令。22 八月 20243段名的缺省

40、名使用简化的段定义伪指令时,每个段都有一个缺省名。在中内存模式和大内存模式时,.CODE伪指令表示的缺省段名为name_TEXT,即name是这个段名的可变部分,当程序模块有一个具体名字时,name就表示这个名字。.DATA、.CONST、.DATA?、.STACK定义的段内数据存放在一个叫DGROUP的段组中,各个段内的偏移地址均以这个起始地址为起点,而不依本段内的段地址为起点。.FARDATA或.FARDATA?伪指令使用的缺省名在各种模式下可以替换,它们定义的段内数据不放在任何段中,属于远程数据。内存内存内存内存模式模式模式模式段定义段定义段定义段定义伪指令伪指令伪指令伪指令段名段名段名

41、段名定位定位定位定位组合组合组合组合类别类别类别类别组名组名组名组名SmallSmallSmallSmall.CODE.CODE.CODE.CODE.DATA.DATA.DATA.DATA.CONST.CONST.CONST.CONST.DATA?.DATA?.DATA?.DATA?.STACK.STACK.STACK.STACK_TEXT_TEXT_TEXT_TEXT_DATA_DATA_DATA_DATACONSTCONSTCONSTCONST_BSS_BSS_BSS_BSSSTACKSTACKSTACKSTACKWORDWORDWORDWORDWORDWORDWORDWORDWORDWO

42、RDWORDWORDWORDWORDWORDWORDPARAPARAPARAPARAPUBLICPUBLICPUBLICPUBLICPUBLICPUBLICPUBLICPUBLICPUBLICPUBLICPUBLICPUBLICPUBLICPUBLICPUBLICPUBLICSTACKSTACKSTACKSTACKCODECODECODECODEDATADATADATADATACONSTCONSTCONSTCONSTBSSBSSBSSBSSSTACKSTACKSTACKSTACKDGROUPDGROUPDGROUPDGROUPDGROUPDGROUPDGROUPDGROUPDGROUPDGRO

43、UPDGROUPDGROUPDGROUPDGROUPDGROUPDGROUP22 八月 20244.等价名的使用vMASM 5.0中规定了几个等价名代替真实名。可以用代替简化段定义伪指令前面的小数点。CODE代表.CODE定义的段名;FARDATA代表.FARDATA定义的段名;DATA代表.DATA、.DATA?、.CONST和.STACK共享的组段名。例: ASSUME ES:FARDATA ;ES为远程数据段地址 MOV AX,DATA MOV DS,AX ;DS为DGROUP段组段地址 MOV AX,FARDATA MOV ES,AX5.段序定义伪指令vMASM可以按照源程序中各个段出

44、现的次序来排列目标文件中各段的先后次序,也可以按照段名的字母顺序来排列次序。缺省情况是按照段出现的次序来排列,可以定义段序: .ALHPA:按照字母顺序对段排序。 .SEG:按照段出现的顺序对段排序。完整段定义格式中,默认按此顺序。 .DOSSEG:按照DOS定义的标准段序对段排序,顺序为:代码段、数据段、堆栈段。采用.MODEL伪指令的简化段定义格式默认按此顺序。22 八月 2024三、使用简化段定义的程序框架(1)EXE标准程序框架v汇编语言源程序经过汇编和连接后生成可执行文件(.exe)。操作系统为程序建立了一个程序段前缀区PSP,其长度为256个字节,主要用于存放用户程序的有关信息,如

45、文件名、文件长度等。而在偏移100H处才装入程序本身。EXE程序加载要重新定位:1)DS和ES指向PSP段地址,而不是程序的数据段和附加段,所以需在程序中根据实际数据段改变DS和ES;2)CS:IP和SS:SP是由连接程序确定的值,指向程序的代码段和堆栈段。如果不指定堆栈段,则SS=PSP段地址,SP=100H,堆栈段占用PSP中的部分区域。22 八月 2024例 .MODEL SMALL ;小内存模式 .586 ;可汇编并运行586指令 .STACK 100H ;256字节堆栈 .DATA MSG DB Welcome$ ;要写的信息 .CODE .STARTUP MOV DX,OFFSET

46、 MSG ;信息存储区首地址送DX MOV AH,9H INT 21H ;DOS写功能调用,在屏幕显示变量MSG内容 Welcome .EXIT 0 ;返回 END22 八月 2024(2).COM格式的程序框架v.COM程序是一种将代码、数据和堆栈段合一的结构紧凑的程序,所有的段都在一个逻辑段内,不超过64KB。在程序中采用.MODEL TINY模式定义语句即可生成COM结构的程序。COM文件存储在磁盘上是主存的完全影像,不包含重新定位的加载信息,加载速度更快,占用的磁盘空间更少。COM程序加载后:1)所有段地址都指向PSP的段地址;2)程序执行起点是PSP后的第一条指令,既IP=100H;

47、也就是说,COM程序的第一条指令必须是可执行指令,即程序的起始执行处是程序头。3)堆栈区设在段尾(通常为FFFEH),栈底的内容置为0000字。22 八月 2024例子 .MODEL TINY ;采用微型模式.CODE ;只有一个段,没有数据段和附加段.STARTUP ;等效于ORG 100H,汇编程序自动产生MOV DX,OFFSET STRING1 ;显示提示信息MOV AH,9INT 21HMOV AH,01H ;等待按键INT 21HMOV DX,OFFSET STRING2 ;显示结束信息MOV AH,9INT 21H.EXIT 0STRING1 DB PRESS ANY KEY T

48、O CONTINUE!$ STRING2 DB 10,13,PROGRAM RUN COMPLETE!$END22 八月 2024一、重复汇编伪指令(1)按参数值重复伪指令REPEAT:按设定的重复次数连续重复汇编重复体的语句,其格式为: REPEAT 重复次数 ;重复开始 重复体 ENDM ;重复结束 例:定义26个大写字母 CHARA A_ZTABLE EQU THIS BYTE ;A_ZTABLE用于为字符串指明首地址 REPEAT 26 DB CHAR CHAR=CHAR十l ENDM(2)按参数个数重复伪指令FOR:每一次的重复把重复体中的形参用一个实参取代 FOR 形参, 重复体

49、ENDM例: 要保护常用寄存器,可用如下伪指令: FOR REGAD, PUSH REGAD ENDM5.3.2 重复汇编和条件汇编伪指令22 八月 2024(3)按参数字符个数重复伪指令FORC:每一次的重复把重复体中的形参用一个字符取代。 FORC 形参,字符串 ;或FORC 形参,字符串 重复体 ENDM例: 要恢复常用寄存器可用如下伪指令: FORC REGAD, POP REGAD&X ; &表示依次用字符串中的DCBA代替REGAD再与X连接 ENDM重复汇编伪指令续22 八月 2024条件汇编伪指令的一般格式是: IFxx 表达式 ;条件满足,汇编分文语句体1 分支语句体1 EL

50、SE ;条件不满足,汇编分支语句体2 分支语句体2 ENDIF ;条件汇编结束例:定义一个元素个数不超过100的数组 PDATA MACRO NUM IF NUM LT L00 ;如果NUM100,则汇编如下语句 DB NUM DUP (?) ELSE ;否则,汇编如下语句 DB 100 DUP (?) ENDIF ENDM如果实参小于等于100,则汇编DB NUM DUP (?)语句;否则汇编DB 100 DUP(?)。例如: PDATA 12 ;第一次宏调用 DB 12 DUP (?) ;宏第一次汇编结果(不是列表文件的宏展开形式) PDATA 102 ;第二次宏调用 DB 100 DUP

51、 (?) ;第二次宏汇编结果二. 条件汇编伪指令22 八月 2024一、重复汇编伪指令(1)按参数值重复伪指令REPEAT:按设定的重复次数连续重复汇编重复体的语句,其格式为: REPEAT 重复次数 ;重复开始 重复体 ENDM ;重复结束 例:定义26个大写字母 CHARA A_ZTABLE EQU THIS BYTE ;A_ZTABLE用于为字符串指明首地址 REPEAT 26 DB CHAR CHAR=CHAR十l ENDM(2)按参数个数重复伪指令FOR:每一次的重复把重复体中的形参用一个实参取代 FOR 形参, 重复体 ENDM例: 要保护常用寄存器,可用如下伪指令: FOR RE

52、GAD, PUSH REGAD ENDM5.3.2 重复汇编和条件汇编伪指令22 八月 2024(3)按参数字符个数重复伪指令FORC:每一次的重复把重复体中的形参用一个字符取代。 FORC 形参,字符串 ;或FORC 形参,字符串 重复体 ENDM例: 要恢复常用寄存器可用如下伪指令: FORC REGAD, POP REGAD&X ; &表示依次用字符串中的DCBA代替REGAD再与X连接 ENDM重复汇编伪指令续22 八月 2024条件汇编伪指令的一般格式是: IFxx 表达式 ;条件满足,汇编分文语句体1 分支语句体1 ELSE ;条件不满足,汇编分支语句体2 分支语句体2 ENDIF ;条件汇编结束例:定义一个元素个数不超过100的数组 PDATA MACRO NUM IF NUM LT L00 ;如果NUM100,则汇编如下语句 DB NUM DUP (?) ELSE ;否则,汇编如下语句 DB 100 DUP (?) ENDIF ENDM如果实参小于等于100,则汇编DB NUM DUP (?)语句;否则汇编DB 100 DUP(?)。例如: PDATA 12 ;第一次宏调用 DB 12 DUP (?) ;宏第一次汇编结果(不是列表文件的宏展开形式) PDATA 102 ;第二次宏调用 DB 100 DUP (?) ;第二次宏汇编结果二. 条件汇编伪指令

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号