第4章 80X86汇编语言程序设计.ppt
《第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汇编语言程序设计汇编语言程序设计汇编程序的地址计数器汇编程序的地址计数器每进入一个新段,地址计数器清零,每分配一个的单元,地址计数器自动加一,指向下一个待分配的单元;$表示当前值。第
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第4章 80X86汇编语言程序设计 80 X86 汇编语言 程序设计
限制150内