第4章 80X86汇编语言程序设计.ppt

上传人:s****8 文档编号:68704099 上传时间:2022-12-29 格式:PPT 页数:166 大小:1.69MB
返回 下载 相关 举报
第4章 80X86汇编语言程序设计.ppt_第1页
第1页 / 共166页
第4章 80X86汇编语言程序设计.ppt_第2页
第2页 / 共166页
点击查看更多>>
资源描述

《第4章 80X86汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《第4章 80X86汇编语言程序设计.ppt(166页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计第4章 80X86汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计本章的内容有:MASM宏汇编语句结构以及开发过程MASM汇编语言表达式、运算符程序段的定义和属性复杂数据结构宏汇编基本汇编语言程序设计子程序设计高级汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计4.1 MASM宏汇编语句结构以及开发过程 4.1.1 汇编语

2、言程序的语句类型和格式1语句的类型硬指令语句硬指令语句(指令性语句指令性语句)是指能产生目标代码,CPU可以执行的,能完成特定功能的语句,它主要由CPU指令组成。伪指令语句(指示性语句)伪指令语句(指示性语句)是一种不产生目标代码的语句,它仅仅在汇编过程中告诉汇编程序应如何汇编。定义变量,定义过程,给变量分配存储单元,给数字或表达式命名等。所以伪指令语句是汇编程序在汇编时用的,不产生机器码。宏指令语句宏指令语句它是一个指令序列,汇编时凡有宏指令语句的地方都将用相应的指令序列的目标代码插入。第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计 指令性语句指令性语句是计算机可执行的

3、,而伪指令伪指令不能执行,用来定义变量,分配存储单元,指示程序开始和结束等。这两种语句的差别:在形式上:带不带冒号冒号,是否可转向它是否可转向它.在本质上:汇编时能否形成对应的机器码对应的机器码.第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计2语句的格式汇编语言源程序由语句序列构成。汇编语言源程序中的每条语句一般占一行,每行不超过132个字符(MASM 6.0开始可以是512个字符),执行性语句(硬指令、代码段)执行性语句(硬指令、代码段)标号:硬指令助记符 操作数,操作数;注释说明性语句说明性语句名字 伪指令助记符 参数,参数 ;注释第第4 4章章 80X8680X86

4、汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计4.1.2 汇编语言的程序格式在实地址模式和虚拟8086模式下,按照逻辑段组织程序,具有代码段、数据段、附加段和堆栈段。一个汇编语言源程序可以包含若干个代码段、数据段、堆栈段或附加段,段与段之间的顺序可随意排列。需独立运行的程序必须包含一个代码段,并指示程序执行的起始位置,一个程序只有一个起始位

5、置。所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计两种格式书写第一种格式是从MASM 5.0开始支持的简化段定义格式(但其中的两个指令.STARTUP和.EXIT是6.0版本才引入的)。第二种格式是MASM 5.0以前版本就具有的完整段定义格式。第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计例例4.14.1 简化段定义的源程序格式MODELSMALL;定义程序的存储模式,小型程序一般采用小模式SMALL STACK;定义堆栈段 DATA;定义数据段 STRING DB Hell

6、o,Everybody!,0DH,0AH,$;在数据段定义要显示的字符串 CODE;定义代码段 STARTUP;说明程序起始位置,并建立DS、SS内容(注1)MOVDX,OFFSET STRING;指定字符串在数据段的偏移地址 MOVAH,9 INT21H;利用DOS功能调用显示信息 EXIT 0;程序结束点,返回DOS(注2)END;汇编结束(注3)第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计例例4.24.2 完整段定义的源程序格式 STACKSEGMENT STACK;定义堆栈段STACK DW51

7、2 DUP(?);堆栈段的大小是1024字节(512字)空间 STACKENDS;堆栈段结束 DATASEGMENT;定义数据段DATASTRINGDB Hello,Everybody!,0DH,0AH,$;在数据段定义要显示的字符串 DATAENDS;数据段结束 CODESEGMENT CODE;定义代码段CODE ASSUME CS:CODE,DS:DATA,SS:STACK;确定CS、DS、SS指向的逻辑段 START:MOV AX,DATA ;设置数据段的段地址DS MOV DS,AX第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计MOV DX,OFFSET STR

8、ING ;利用功能调用显示信息MOV AH,9INT 21HMOV AX,4C00H;利用系统功能调用返回DOSINT 21HCODEENDS ;代码段结束ENDSTART;汇编结束,同时表明程序起始位置为标号START处第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计4.1.3 4.1.3 汇编语言程序的开发过程汇编语言程序的开发过程 源程序编辑源程序编辑源程序汇编源程序汇编目标文件链接目标文件链接可执行文件调试可执行文件调试.ASM.OBJ.EXE可执行文件可执行文件MASMLT401A.ASM/ML LT401A.ASM LINKLT401A.OBJ DEBUG LT

9、401A.EXE修改源代码正确第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计ML.EXE 汇编程序ML.ERR 汇编错误信息文件DOSXNT.EXE MS-DOS扩展文件LINK.EXE 连接程序LIB.EXE 子程序库管理文件MASM5.1以下:MASM.EXE第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计4.2 MASM4.2 MASM汇编语言表达式、运算符汇编语言表达式、运算符4.2.14.2.1常量、运算符及表达式常量、运算符及表达式1.常量(1)数字常量 二进制常量,以B结尾 十进制常量,以D结尾或省略(汇编语言中默认无标记数为十进制数)十

10、六进制常量,以H结尾,如0A8C6H.第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计MASM提供基数控制,.RADIX伪指令可以改变默认进制。伪指令格式:.RADIX n要求:n为216范围内任何数值。功能:把n表示的数值作为默认基数。例如指令“.RADIX 16”,将缺省基数改为16第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计(2)字符串常量用单引号单引号引起来的字符或字符串也代表常数。例:A,BCDE,汇编时被翻译成对应的ASCII码41H和42H,43H,44H,45H。字符串最大长度为字符串最大长度为255255个字符个字符第第4 4章章

11、80X8680X86汇编语言程序设计汇编语言程序设计(3)符号常量利用一个标识符表达的一个数值。常数若使用有意义的符号名来表示,可以提高程序的可读性,同时更具有通用性。MASM提供等价机制,用来为常量定义符号名,符号定义伪指令有“EQU”和“”第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计2运算符运算符 MASM 6.x支持多种运算符,如表4.1所示。(1)算术运算符 实现加、减、乘、除、取余的算术运算。其中MOD也称为取模,它产生除法之后的余数,如19 MOD 75。MOVAX,3*4+5;等价于MOVAX,17加“”和减“”运算符还可以用于地址表达式。除加、减外,其它

12、运算符的参数必须是整数。(2)逻辑运算符实现按位相与、相或、异或、求反的逻辑运算。例如:ORAL,03H AND 45H;等价于OR AL,01H第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计(3)移位运算符实现对数值的左移、右移的逻辑操作,移入低位或高位的是0。其格式为:SHL/SHR移位次数。例如:MOVAL,0101BSHL(2*2);等价于MOVAL,01010000B逻辑和移位运算符与指令助记符相同,并有类似的运算功能。汇编程序能够根据上下文判断它们是指令还是运算符,前者进行代码翻译,后者汇编时计算其数值。第第4 4章章 80X8680X86汇编语言程序设计汇编

13、语言程序设计(4)关系运算符用于比较和测试符号数值,MASM用FFFFH(补码 1)表示条件为真,用0000H表示条件为假。例如:MOVBX,(PORT LT 5)AND 20)OR(PORT GE 5)AND 30);当PORT5时汇编结果为MOV BX,20 ;否则,汇编结果为MOV BX,30(5)高低分离符取数值的高半部分或低半部分。HIGH、LOW从一个字数值或符号常量中得到高、低字节,例如:MOV AH,HIGH 8765H ;等价于MOVAH,87H MASM 6.0引入的HIGHWORD,LOWWORD取一个符号常量(不是一般的常量)的高字或低字部分,例如:DD_VALUEEQ

14、U 0FFFF1234H;定义一个符号常量 MOV AX,LOWWORD DD_VALUE;等价于MOV AX,1234H第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计 运算符类型 运算符号及说明 算术运算符+(加)(减)*(乘)/(除)MOD(取余)逻辑运算符 AND(与)OR(或)XOR(异或)NOT(非)移位运算符 SHL(逻辑左移)SHR(逻辑右移)关系运算符EQ(相等)NE(不相等)GT(大于)LT(小于)GE(大于等于)LE(小于等于)高低运算符HIGH(高字节)LOW(低字节)HIGHWORD(高字)LOWWORD(低字)表4.1运算符第第4 4章章 80X

15、8680X86汇编语言程序设计汇编语言程序设计3 3、运算符的优先级、运算符的优先级 优先级 运算符 1()LENGTH SIZE WIDTH MASK 2PTR OFFSET SEG TYPE THIS :3HIGH LOW 4*/MOD SHL SHR 5+6EQ NE GT LT GE LE 7NOT 8AND 9OR XOR 10SHORT第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计关于优先级问题关于优先级问题不同的运算符,有不同的优先级,由于运算符多,优先级层次多,编程时通常用圆括号规定优先级第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计

16、 TYPE运算符用来取存储器的单元类型,各单元类型对应值如下:存储器单元类型 对应值 DB(字节)1 DW(字)2 DD(双字)4 NEAR -1 FAR -2若BUFFER1存储区是用如下伪指令定义的:BUFFER1 DB100 DUP(?)则 TYPEBUFFER1等于1第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计LENGTH运算符用来计算一个存储区的单元(单元可以是字节,字或双字)的数目。注意:LENGTH返回的存储区必须用复制操作符DUP()来定义,否则返回值为1。例:若FEES被定义为:FEES DW4,5,6 则 MOV CX,LENGTH FEES 汇编后

17、,MOVCX,1第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计SIZE运算符用来计算一个存储区的字节总数。例:若BUFFER2存储区是用如下伪指令定义的:BUFFER2 DW200 DUP(0)则:TYPEBUFFER2等于2 LENGTHBUFFER2等于200 SIZEBUFFER2等于400第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计(5)合成运算符用来建立或临时改变变量或标号的类型或存储器操作的存储单元类型。包括:PTR、THIS、SHORT。PTR运算符用来指定或修改存储器操作数的类型,通常和伪指令BYTE、WORD等连起来使用。例:MO

18、VBYTE PTRDI,0 MOVWORD PTRDI,0 而 MOVDI,0 ;类型不定第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计例:STRI1 DW?;定义为字类型 可用如下语句:PPEQUBYTE PTR STRI1QQEQUBYTE PTR STRI1+1 通过PP,QQ把STRI1和STRI1+1又规定为字节类型。MOVSTRI1,AX是合法的MOVAL,STRI1是非法的 只能用:MOV AL,PP 或 MOV AL,BYTE PTR STRI1第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计THIS运算符 可以指定存储器操作数的类型。

19、使用THIS运算符可以使标号或变量具有灵活性。例:AREAW EQU THIS WORD AREAB DB 100 DUP(?)SHORT运算符 可以指定一个标号的类型为SHORT(短标号),即标号到引用该标号之间的距离在127127个字节范围内。短标号可以用于转移指令中,使用短标号的指令比使用近程标号的指令少一个字节。第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计(5)其它运算符1)方括号 指令中用方括号表示存储器操作数,方括号里的内容表示操作数的偏移地址。例如:MOV AX,BX;将(BX)和(BX+1)指向的存储器两个单元的内容送AX2)段超越运算符“:”运算符“:

20、”(冒号)跟在某个段寄存器名(DS、ES、SS或CS)之后表示段超越,用来指定一个存储器操作数的段属性,而不管其原来隐含的段是什么。例如:M0V AX,ES:DI;把ES段中由DI指向的字操作数送(AX)第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计4.表达式 表达式表达式是常量、寄存器、标号、变量与一些运算符组合的序列,分数字表达式和地址表达式两种。汇编时按一定的优先规则对表达式进行计算后可得到一个数值或一个地址。第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计1数字表达式(number expression)数值表达式一般是指由运算符(MASM统称

21、为操作符Operator)连接的各种常量所构成的表达式。汇编程序在汇编过程中计算表达式,最终得到一个数值。由于在程序运行之前,就已经计算出了表达式,所以,程序运行速度没有变慢,然而程序的可读性却增强了。例如:MOV DX,(6*A-B)/2指令的源操作数(6*A-B)/2是一个表达式。若设变量A的值为1,变量B的值为2,则此表达式的值为(6*1-2)/22,是一个数字结果,此表达式是数字表达式。第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计2地址表达式(address expressions)地址表达式的结果是一个存储单元的地址。当这个地址中存放的是数据时,称为变量;当这

22、个地址中存放的是指令时,则称为标号。当在指令的操作数部分用到地址表达式时,应注意其物理意义。例如,两个地址相乘或相除是无意义的,两个不同段的地址相加减也是无意义的。经常使用的是地址加减数字量。例如,SUM+1是指向SUM字节单元的下一个单元的地址。又如:MOV AX,ES:BX+SI+1000HBX+SI+1000H为地址表达式,结果是一个存储单元的地址。第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计4.2.2变量及其属性变量及其属性1变量定义伪指令变量定义伪指令 变量是存储器中某个数据区的名字,在指令中可以作为存储器操作数。变量定义(Define)伪指令可为变量申请固定

23、长度的存储空间,并可以同时将相应的存储单元初始化。该类伪指令是最经常使用的伪指令。伪指令格式:伪指令格式:变量名变量名 伪指令伪指令 初值表初值表第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计说明:变量名是用户自定义标识符,表示初值表首元素的逻辑地址,即用这个符号表示地址,常称为符号地址。变量名可以没有,这种情况,汇编程序将直接为初值表分配空间,无符号地址。设置变量名是为了方便存取它指示的存储单元。初值表是用逗号分隔的参数,主要由数值常量,表达式或?、DUP组成。其中?表示初值不确定,即未赋初值;重复初值可以用DUP进行定义。DUP的格式为:重复次数 DUP(重复参数,被

24、重复的数据列表)变量定义伪指令有DB/DW/DD/DF/DQ/DT,它们根据申请的主存空间单位分类,第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计(1)定义字节单元伪指令DB功能:定义变量的类型为BYTE,给变量分配字节或字节串。要求:初值表中每个数据一定是字节量(Byte),可以是0255的无符号数或是 128+127带符号数,也可以是字符串常量。例如:DATA SEGMENT;数据段 XDBa,5 DB2DUP(100),?YDBABC DATAENDS存储器中的分配情况如图4.1(A)第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计数据定义的存储

25、形式第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计针对上述的DATA定义,在执行下述汇编指令后,可以看到所定义的DATA中的数据发生了变化。MOVAL,X ;此处X表示它的第1个数据,故ALa DECX+1 ;对X为起始的第2个数据减1,故成为 6MOV Y,AL;现在Y这个字符串成为ABC第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计汇编程序的地址计数器汇编程序的地址计数器每进入一个新段,地址计数器清零,每分配一个的单元,地址计数器自动加一,指向下一个待分配的单元;$表示当前值。第

26、第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计(2)定义字单元伪指令DW功能:定义变量的类型为WORD,给变量分配一个或多个字单元,并可以将它们初始化为指定值。要求:初值表中每个数据一定是字(Word),一个字单元可用于存放任何16位数据,如一个段地址、一个偏移地址、两个字符、065535之间的无符号数或者是32768+32767之间的带符号数。例如:DATASEGM;数据段 COUNTDW8000H,?,AB MAXINTEQU64H NUMBER DWMAXINT ARRAYDWMAXINT DUP(0)DATAENDS数据在存储器的分配情况如图4.1(B)所示第第4

27、4章章 80X8680X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计(3)定义双字单元伪指令DD功能:定义变量的类型为DWORD,用于分配一个或多个双字单元,并将它们初始化为指定值。要求:初值表中每个数据是一个32位的双字(Double Word),可以是有符号或无符号的32位整数,也可以用来表达16位段地址(高位字)和16位的偏移地址(低位字)的远指针。例如:VARDDDD0,?,12345678H

28、 FARPOINTDD00400078H LDS SI,FARPOINT注意:在内存中存放时,低位字在前,高位字在后。第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计(4)其它数据定义伪指令定义3字伪指令DF功能:用于为一个或多个6字节变量分配空间及初始化。用途:6字节常用在 32位CPU中表示一个48位远指针(16位段选择器:32位偏移地址)。定义4字伪指令DQ功能:用于为一个或多个8字节变量分配空间及初始化。用途:8字节变量可以表达一个64位整数。定义10字节伪指令DT功能:用于为一个或多个10字节变量分配空间及初始化。第第4 4章章 80X8680X86汇编语言程序设

29、计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计(5)定位伪指令用数据定义伪指令分配的数据是按顺序一个接着一个存放在数据段中的。但有时,我们希望能够控制数据的偏移地址。例如使数据对齐可以加快数据的存取速度。MASM提供了这样的伪指令,这些伪指令我们称为定位伪指令。第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计ORG伪指令伪指令格式:ORG参数 功能:ORG伪指令是将当前偏移地址指针指向参数表达的偏移地址。例如:ORG 100h ;从100h处安排数据或程序 ORG$+10 ;偏移地址加10,即跳过10个字节空间汇编语言程序中,符号“$

30、”表示当前偏移地址值。例如,在偏移地址100H单元开始定义“DW 1,2,$+4,$+4”,那么在104H单元的值为108H,106H单元的值为10AH。又如:ARRAYDB12,34,56 LENEQU$ARRAY那么,LEN的值就是ARRAY变量所占的字节数。第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计EVEN伪指令伪指令格式:EVEN 功能:EVEN伪指令使当前偏移地址指针指向偶数地址,即若原地址指针已指向偶地址,则不作调整;否则将地址指针加1,使地址指针偶数化。用途:EVEN可以对齐字数据。ALIGN伪指令伪指令格式:ALIGNn 功能:ALIGN伪指令是将当前

31、偏移地址指针指向n(n是2的乘方)的整数倍的地址,即若原地址指针已指向n的整数倍地址,则不作调整;否则将指针加以1n1中的一个数,使地址指针指向下一个n的整数倍地址。第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计例如:DATASEGMENT;完整段定义 DATA01DB 1,2,3;DATA01的偏移地址为 ;0000H,$=0003h EVEN;$=0004h,等价于ALIGN 2 DATA02DW 5;DATA02的偏移地址为;0004H,$=0006h ALIGN 4 ;最接近6,可被4整除的是8 DATA03DD 6;DATA03的偏移地址为0008H,$=000

32、ch ORG$+10H;000ch+10h=001ch,;$=001ch DATA04DB ABC;DATA04的偏移地址为001CH,$=001fh DATAENDS第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计2变量和标号的属性变量和标号的属性变量、标号、段名及过程名都表示的是地址,那么,这些标号和名字一经定义便具有以下三种属性:段值:段属性,标号和名字对应存储单元所在段的段地址。偏移值:偏移属性,标号和名字对应存储单元所在段的段内偏移地址。类型属性:标号、子程序名的类型可以是NEAR(近)和FAR(远),分别表示段内或段间;变量名的类型可以是BYTE(字节),WOR

33、D(字)和DWORD(双字)等。第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计(1)地址操作符地址操作符可获得名字或标号的段地址和偏移地址两个属性值。中括号 表示将括起的表达式作为存储器地址指针;符号$表示当前偏移地址;段前缀的冒号:也是一种地址操作符,它表示采用指定的段地址寄存器。另外,还有两个经常应用的地址操作符OFFSET和SEG。第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计OFFSET操作符使用格式:OFF

34、SET名字/标号 功能:返回名字或标号的偏移地址SEG操作符使用格式:SEG名字/标号 功能:返回名字或标号的段地址 例如把字节变量ARRAY的段地址和偏移地址送入DS和BX就可用下列指令序列实现。MOVAX,SEG ARRAY MOVDS,AX MOVBX,OFFSET ARRAY ;等价于LEABX,ARRAY加、减运算符同样可以用于地址表达式,例如:MOVCL,ARRAY+4;等效于MOV CL,ARRAY4,这里的”4”表示4个字节单元第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计(2)类型操作符类型操作符对名字或标号的类型属性进行有关设置。该类操作符有PTR、T

35、HIS、SHORT和TYPE。PTR操作符使用格式:类型名 PTR 名字/标号要求:PTR操作符中的“类型名”可以是BYTE/WORD/DWORD/FWORD/QWORD/TBYTE,或者是NEAR/FAR,还可以是由STRUCT,RECORD,UNION以及TYPEDEF定义的类型。功能:使名字或标号具有指定的类型第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计例:MOV AL,BYTE PTR W_VAR ;W_VAR是一个字变量,BYTE PTR使其作为一个字节变量JMPFAR PTR N_LABEL ;N_LABEL是一个标号,FAR PTR使其作;为段间转移使用P

36、TR操作符,可以临时改变名字或标号的类型。第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计SHORT操作符,只用于JMP指令使用格式:SHORT标号 要求:转移范围为 128+127字节内。功能:设定标号为短转移标号。SHORT指定标号作为128+127字节范围内的短转移。例如:JMPSHORTN_JUMP第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计表4.3 类型的返回数值类型 返回数值 变量该变量类型的每个数据占用

37、的字节数 结构每个结构元素占用的字节数 常量0 标号距离属性值 寄存器该寄存器具有的字节数第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计操作符SIZEOF和LENGTHOF具有类似TYPE的功能,分别返回整个变量占用的字节数和整个变量的数据项数(即元素数)。实际上:SIZEOF返回值LENGTHOF返回值 TYPE返回值请注意,在MASM 5.x仅支持SIZE和LENGTH操作符。LENGTH对于变量定义使用 DUP的情况,返回分配给该变量的单元数,其它情况为1。SIZE返回LENGTH与TYPE的乘积。第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计

38、第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计例例4.3 下面程序的功能为:在屏幕上显示字符串“1357?”.MODELSMALL .STACK .DATA V_BYTE EQUTHIS BYTE;V_BYTE是字节类型的变量,但与变 ;量V_WORD地址相同 V_WORDDW3332H,3735H;V_WORD是字类型的变量 TARGET DW 5 DUP(20H);分配数据空间2 510个字节 CRLFDB0DH,0AH,$FLAGDB0 N_POINTDW OFFSET S_LABEL ;取得标号S_LABEL的偏移地址 .CODE .STARTUPMOVAL,BY

39、TE PTR V_WORD;用PTR改变V_ WORD的 ;类型,否则与AL寄存器类型不匹配,指令行后(AL)=32H 第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计DECALMOVV_BYTE,AL;对V_WORD的第一个字节操作,原;来是32H,现在是31HN_LABEL:CMP FLAG,1JZS_LABEL;FLAG单元为1,则转移 INCFLAG JMPSHORT N_LABEL;短转移S_ LABEL:CMPFLAG,2JZNEXT;FLAG单元为2转移INCFLAGJMPN_POI;段内的存储器间接寻址,转;移到标号S_LABEL处,等同于JMP S-LAB

40、LE NEXT:MOVAX,TYPE V_WORD;汇编结果为MOV AX,2 MOVCX,LENGTH TARGET;汇编结果为MOV CX,5 MOVSI,OFFSET TARGET第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计 W_AGAIN:MOV SI,AX;对字单元操作 INCSI;SI指针加2 INCSI LOOP W_AGAIN;循环 MOVCX,SIZETARGET;汇编结果为MOV CX,0AH MOVAL,?MOVDI,OFFSETTARGET B_AGAIN:MOVDI,AL;对字节单元操作 INCDI;DI指针加1 LOOP B_AGAIN;循环

41、 MOVDX,OFFSET V_WORD;显示结果:1357?MOVAH,9 INT21H .EXIT 0END第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计4.3 4.3 程序段的定义和属性程序段的定义和属性4.3.1 DOS4.3.1 DOS的程序结构的程序结构1.EXE程序 2.COM程序第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计4.3.2 4.3.2 简化段定义的格式简化段定义的格式.MODEL SMALL;定义程序的存储模式(一般采用SMALL).STACK;定义堆栈段.DATA;定义数据段 ;数据定义.CODE;定义代码段.START

42、UP;程序起始点,并建立DS,SS内容(注1);程序代码.EXIT 0;程序结束点,返回DOS(注2);子程序代码END;汇编结束(注3)第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计1.1.存储模式伪指令存储模式伪指令伪指令格式:MODEL存储模式,语言类型,操作系统类型,堆栈选项(混合编程使用)使用简化段定义格式时必须使用必须位于所有段定义语句之前MASM有7种不同的存储模式TINY(微型模式):专用于创建COM程序SMALL(小型模式):只能有一个代码段和数据段,每段不大于64KB。数据段为附加段、

43、堆栈段和数据段的总和,共用同一个段地址,即DS、ES和SS三个段寄存器相同。指令准一、程序调用及数据访问都是近属性。是最常用的模式第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计COMPACT(紧凑模式)MEDIUM(中型模式)LARGE(大型模式)HUGE(巨型模式)FLAT(平展模式)第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计2 2简化段定义伪指令简化段定义伪指令(1).STACK堆栈段伪指令(2).DATA数据段伪指令(3).CODE 代码段伪指令 第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X86

44、80X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计4.3.3 4.3.3 完整段定义的格式完整段定义的格式 STACKSEGMENT;定义堆栈段STACK ;分配堆栈段的大小 STACKENDS;堆栈段结束 DATASEGMENT ;定义数据段DATA ;定义数据 DATA ENDS ;数据段结束 CODE SEGMENT CODE;定义代码段CODEASSUME CS:CODE,DS:DATA,SS

45、:STACK;确定CS/DS/SS指向;的逻辑段 START:MOVAX,DATA ;设置数据段的段地址DS MOVDS,AX ;程序代码 MOVAX,4C00H;返回DOS INT21H ;子程序代码 CODEENDS ;代码段结束END START;汇编结束,程序起始位置为START第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计 例例4.4 设计一个COM程序,实现按任意键后响铃的功能。.MODELTINY;采用微型模式 .CODE;只有一个段,没有数据段和堆栈段 .STARTUP ;等效于ORG 1

46、00H,汇编程序自动产生 MOVDX,OFFSET STRING;显示信息 MOVAH,9 INT21H MOVAH,01H;等待按键 INT21H MOVAH,02H ;响铃 MOVDL,07H INT21H .EXIT 0STRING DB PRESS ANY KEY TO CONTINUE!$;数据安排在不与代码冲突的地方END 第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计4.3.3 完整段定义的格式完整段定义的格式 对于一个典型的MASM程序,完整段可用下述格式定义。STACKSEGMENT STACK;定义堆栈段STACK ;分配堆栈段的大小 STACKEND

47、S ;堆栈段结束 DATASEGMENT ;定义数据段DATA ;定义数据 DATA ENDS ;数据段结束 CODE SEGMENTCODE;定义代码段CODEASSUME CS:CODE,DS:DATA,SS:STACK ;确定CS/DS/SS指向的逻辑段第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计 START:MOV AX,DATA ;设置数据段的段地址DS MOV DS,AX ;程序代码 MOV AX,4C00H;返回DOS INT21H ;子程序代码 CODEENDS ;代码段结束END START;汇编结束,程序起始位置为START第第4 4章章 80X86

48、80X86汇编语言程序设计汇编语言程序设计1 1完整段定义伪指令完整段定义伪指令完整段定义由SEGMENT和ENDS这一对伪指令实现。伪指令格式:段名 SEGMENT 定位 组合 段字 类别 ;语句序列段名 ENDS功能:SEGMENT伪指令定义一个逻辑段的开始,ENDS伪指令表示一个段的结束。第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计(1).段定位(Align)属性指定逻辑段在主存储器中的边界,该关键字可表示为:BYTE:段开始地址为字节地址(xxxx xxxxB),属性值为1;WORD:段开始地址为字地址(xxxx xxx0B),属性值为2;DWORD:段开始地址

49、为4的倍数(xxxx xx00B),属性值为4PARA:段开始地址为16的倍数(xxxx 0000B),即节地址,属性值为16PAGE:表示段开始地址256的倍数(0000 0000B),即页地址,属性值为256第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计(2)段组合(Combine)属性指定多个逻辑段之间的关系。组合的关键字有:PRIVATE:PUBLIC:STACK:COMMON:第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计(3)段字(Use)属性这是为支持32位段而设置的属性。(4)段类别(Class)属性当连接程序组织段时,将所有的同类别

50、段相邻分配。段类别可以是任意名称,但必须位于单引号中;大多数MASM程序使用CODE,DATA和STACK来分别指名代码段、数据段和堆栈段,以保持所有代码和数据的连续。第第4 4章章 80X8680X86汇编语言程序设计汇编语言程序设计2 2指定段寄存器伪指令指定段寄存器伪指令伪指令格式:ASSUME 段寄存器:段名,段寄存器名:段名,功能:ASSUME伪指令通知MASM用指定的段寄存器来寻址对应的逻辑段,即建立段寄存器与段的缺省关系。CODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA MOVAX,DATA MOVDS,AX MOVES,AX

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com