汇编语言课件第4章80X86汇编语言程序设计.ppt
《汇编语言课件第4章80X86汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《汇编语言课件第4章80X86汇编语言程序设计.ppt(135页珍藏版)》请在三一办公上搜索。
1、第4章 80X86汇编语言程序设计,本章主要内容:MASM宏汇编语句结构以及开发过程MASM汇编语言表达式、运算符程序段的定义和属性复杂数据结构宏汇编基本汇编语言程序设计子程序设计高级汇编语言程序设计,4.1 MASM宏汇编语句结构以及开发过程,1语句的类型硬指令语句(指令性语句)是指能产生目标代码,CPU可以执行的,能完成特定功能的语句,它主要由CPU指令组成。伪指令语句(指示性语句)是一种不产生目标代码的语句,它仅仅在汇编过程中告诉汇编程序应如何汇编。定义变量,定义过程,给变量分配存储单元,给数字或表达式命名等。所以伪指令语句是汇编程序在汇编时用的,不产生机器码。宏指令语句它是一个指令序列
2、,汇编时凡有宏指令语句的地方都将用相应的指令序列的目标代码插入。,指令性语句是计算机可执行的,而伪指令不能执行,用来定义变量,分配存储单元,指示程序开始和结束等。这两种语句的差别:在形式上:带不带冒号,是否可转向它.在本质上:汇编时能否形成对应的机器码.,2语句的格式汇编语言源程序由语句序列构成。汇编语言源程序中的每条语句一般占一行,每行不超过132个字符(MASM 6.0开始可以是512个字符),执行性语句标号:硬指令助记符 操作数,操作数;注释说明性语句名字 伪指令助记符 参数,参数;注释,4.1.2 汇编语言的程序格式,在实地址模式和虚拟8086模式下,按照逻辑段组织程序,具有代码段、数
3、据段、附加段和堆栈段。一个汇编语言源程序可以包含若干个代码段、数据段、堆栈段或附加段,段与段之间的顺序可随意排列。需独立运行的程序必须包含一个代码段,并指示程序执行的起始位置,一个程序只有一个起始位置。所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内,简化段定义的源程序格式MODELSMALL;定义程序的存储模式STACK;定义堆栈段DATA;定义数据段 STRING DB Hello,Everybody!,0DH,0AH,$;在数据段定义要显示的字符串CODE;定义代码段STARTUP;说明程序起始位置,并建立DS、SS内容 MOVDX,OFFSET STRING;
4、指定字符串在数据段的偏移地址 MOVAH,9 INT21H;利用DOS功能调用显示信息EXIT 0;程序结束点,返回DOS END;汇编结束,完整段定义的源程序格式 DATA SEGMENT;定义数据段DATA STRINGDB Hello,Everybody!,0DH,0AH,$DATA ENDS;数据段结束 CODE SEGMENT;定义代码段CODE ASSUME CS:CODE,DS:DATA;确定CS、DS、SS指向的逻辑段 START:MOV AX,DATA;设置数据段的段地址DS MOV DS,AX MOV DX,OFFSET STRING;利用功能调用显示信息 MOV AH,9
5、 INT 21H MOV AH,4CH;利用系统功能调用返回DOS INT 21H CODEENDS;代码段结束 ENDSTART;汇编结束,4.1.3 汇编语言程序的开发过程,ML.EXE 汇编程序ML.ERR 汇编错误信息文件DOSXNT.EXE MS-DOS扩展文件LINK.EXE 连接程序LIB.EXE 子程序库管理文件MASM5.1以下:MASM.EXE,4.2 MASM汇编语言表达式、运算符,包括常量、变量、标号及表达式1.常量(1)数字常量 二进制常量,以B(或b)结尾;十进制常量,以D(或d)结尾或省略;十六进制常量,以H(或h)结尾,如0A8C6H。,MASM提供基数控制,.
6、RADIX伪指令可以改变默认进制。伪指令格式:.RADIX n要求:n为216范围内任何数值。功能:把n表示的数值作为默认基数。例如指令“.RADIX 16”,将缺省基数改为16,(2)字符串常量用单引号引起来的字符或字符串也代表常数。例:A,BCDE,汇编时被翻译成对应的ASCII码41H和42H,43H,44H,45H。字符串最大长度为255个字符,(3)符号常量利用一个标识符表达的一个数值。常数若使用有意义的符号名来表示,可以提高程序的可读性,同时更具有通用性。MASM提供等价机制,用来为常量定义符号名,符号定义伪指令有“EQU”和“”,2.变量变量是内存中的数据区,在程序中作为存储器操
7、作数来使用。变量有三种属性:段 值变量定义所在段的段地址偏移量变量单元地址与段起始地址之 间的位移量。类 型有字节、字和双字等。,3.标号标号是某条指令所存放单元的符号地址,可作为转移指令或CALL指令的转移地址。标号也有三种属性:段值总是在CS段寄存器中,偏移量概念与变量同,类型分NEAR和FAR两种。NEAR表示标号所在语句与转移指令或调用指令在同一码段内,只需改变IP即可。FAR标号所在语句与转移指令或调用指令不在同一代码段内。若没有对类型进行说明,默认为NEAR。,标号?变量?,请仔细阅读网络课程问题专讲汇编语言的符号、标号和变量符号一文!,4.表达式 表达式是常量、寄存器、标号、变量
8、与一些运算符组合的序列,分数值表达式和地址表达式两种。汇编时按一定的优先规则对表达式进行计算后可得到一个数值或一个地址。下面介绍几种运算符:算术运算符、逻辑运算符、关系运算符、移位运算符、高低运算符、分析(取属性)运算符、合成(指定属性)运算符、其它运算符,(1)算术运算符有+、-、*、/,以及MOD,其中MOD表示除法运算后得到的余数。例:19/7的商是2,19 MOD 7则为5(余数)算术运算符可以用于数字表达式例:MOV AL,2*7汇编后为B0,0E算术运算符也可以用于地址表达式注意:对地址运算的结果应有明确的物理意义,例两个地址的乘或除无意义,而加或减则可以。例:LEA SI,SUM
9、+3 表示变量SUM的地址加上3得到的和作为新存储器地址。,表示相对于当前地址向高地址或向低地址方向偏移,(2)逻辑运算符逻辑运算符有AND、OR、XOR和NOT,它们只能用于数字表达式中。例:MOVAL,36H AND 0FH逻辑运算符也是8086/8088的指令助记符,它们的区别:前者在汇编时进行,而后者在指令执行时进行的。例:AND DX,PORT_VAR AND 0FEH,(3)关系运算符 共有6个,它们为:EQ(相等),NE(不等),LT(小于),GT(大于),LE(小于或等于),GE(大于或等于)关系运算符的两个操作数必须都是数字或者是同一段内的两个存储器地址。关系为真,结果为0F
10、FFFH(或0FFH)关系为假,结果为0例:MOV BX,PORT_VAL GE 5 若PORT_VAL的值大于等于5,则汇编后为:MOV BX,0FFFFH 若PORT_VAL的值小于5,则汇编后为:MOV BX,0,(4)移位运算符SHL/SHR实现对数值的左移、右移的逻辑操作,移入低位或高位的是0。其格式为:SHL/SHR移位次数。例:MOV AL,0101BSHL(2*2)逻辑和移位运算符与指令助记符相同,并有类似的运算功能。,(5)高低分离符HIGH、LOW功能:取数值的高半部分或低半部分。HIGH、LOW从一个字数值或符号常量中得到高、低字节例:MOV AH,HIGH 8765H;
11、(AH)=87HMASM 6.0引入的HIGHWORD,LOWWORD取一个符号常量(不能是一般的常数)的高字或低字部分例:DD_VALUE EQU 0FFFF1234H;定义一个符号常量 MOV AX,LOWWORD DD_VALUE;(AX)=1234H,(6)分析运算符它们可以把存储器一些特征作为数值送回。这些操作符有OFFSET,SEG,TYPE,SIZE及LENGTH。OFFSET运算符可以得到一个标号或变量的偏移地址例:MOV SI,OFFSET STRI1;代表将变量STRI1;处的地址偏移量取到SI中.注意与 MOV SI,STRI1的差别.但它与 LEA SI,STRI1类似
12、.SEG运算符用来取存储单元的段值例:MOVAX,SEG STRI1;将变量STRI1所MOVDS,AX;在段值取到DS中,LEA指令可以取动态的地址,OFFSET只能取静态的地址,指令执行后SI的值是变量STRI1存储单元的内容。,TYPE运算符用来取存储器的单元类型,各单元类型对应值如下:存储器单元类型 对应值 DB(字节)1 DW(字)2 DD(双字)4 NEAR-1 FAR-2若BUFFER1存储区是用如下伪指令定义的:BUFFER1 DB100 DUP(?)则 TYPEBUFFER1等于1,TYPE运算符用来取存储器的单元类型,各单元类型对应值如下:存储器单元类型 对应值 DB(字节
13、)1 DW(字)2 DD(双字)4 NEAR-1 FAR-2若BUFFER1存储区是用如下伪指令定义的:BUFFER1 DB100 DUP(?)则 TYPEBUFFER1等于1,LENGTH运算符用来计算一个存储区的单元(单元可以是字节,字或双字)的数目。注意:LENGTH返回的存储区必须用复制操作符DUP()来定义,否则返回值为1。例:A1 DW4,5,6 A2 DW 10 DUP(2)A3 DW 8 DUP(1,2),54H A4 DB 21,4 DUP(3)则LENGTH A1=1;LENGTH A2=10;LENGTH A3=8;LENGTH A4=1,有多个数据项的,以第一个数据项为
14、准!,SIZE运算符用来计算一个存储区的字节总数。即 SIZE=LENGTHTYPE例:ARRAY DW 50 DUP(0)则 SIZE ARRAY=502=100注意:对字符串变量求其长度,使用SIZE不能达到目的.例:ST DB ABCDEFG 则 SIZE ST值为1而不是7欲求字符串长可用COUNT EQU$-ST,则COUNT值为7,其中$为定义ST一串字符后下一个可用的偏移地址.,(7)合成运算符用来建立或临时改变变量或标号的类型或存储器操作的存储单元类型。包括:PTR、THIS、SHORT。PTR运算符用来指定或修改存储器操作数的类型,通常和伪指令BYTE、WORD等连起来使用。
15、例:INCBYTE PTRDI INCWORD PTRDI 而 INCDI;类型不定,例:STR DW?;定义为字类型 PPEQUBYTE PTR STR QQEQUBYTE PTR STR+1;把STR和STR+1又规定为字节类型下面指令:MOVSTR,AXMOVAL,STR,是合法的,是非法的,只能用:MOV AL,PP 或 MOV AL,BYTE PTR STR,THIS运算符功能:指定存储器操作数的类型。使用THIS运算符可以使标号或变量具有灵活性。例:AREAW EQU THIS WORD AREAB DB 100 DUP(?)SHORT运算符指定一个标号的类型为SHORT(短标号)
16、,即标号到引用该标号之间的距离在128127个字节范围内。短标号可以用于转移指令中,使用短标号的指令比使用近程标号的指令少一个字节。,知道LABLE伪指令吗?,(8)其它运算符1)方括号 指令中用方括号表示存储器操作数,方括号里的内容表示操作数的偏移地址。例:MOV AX,BX;将(BX)和(BX+1)指向;的存储器两个单元的内容送AX2)段超越运算符“:”跟在某个段寄存器名(DS、ES、SS或CS)之后表示段超越,用来指定一个存储器操作数的段属性,而不管其原来隐含的段是什么。例:M0V AX,ES:DI;把ES段中由DI指向的字操作数送(AX),运算符的优先级,例4.5 属性及其应用.MOD
17、ELSMALL.STACK.DATA V_BYTE EQU THIS BYTE V_WORD DW 3332H,3735H TARGET DW 5 DUP(20H)CRLF DB 0DH,0AH,$FLAG DB 0 N_POINT DW OFFSET S_LABEL.CODE.STARTUP MOV AL,BYTE PTR V_WORD DEC AL MOV V_BYTE,ALN_LABEL:CMP FLAG,1 JZ S_LABEL INC FLAG JMP SHORT N_LABELS_ LABEL:CMPFLAG,2 JZNEXT INCFLAG JMPN_POINT,NEXT:MOV
18、AX,TYPE V_WORD MOVCX,LENGTHOF TARGETMOVSI,OFFSET TARGETW_AGAIN:MOV SI,AX INC SI INC SI LOOP W_AGAIN MOV CX,SIZEOF TARGET MOV AL,?MOV DI,OFFSET TARGETB_AGAIN:MOV DI,AL INC DI LOOP B_AGAIN MOV DX,OFFSET V_WORD MOV AH,9 INT 21H.EXIT 0 END,4.3 伪指令语句,常用的伪指令有:数据定义伪指令符号定义伪指令段定义伪指令过程定义伪指令结束伪指令,变量定义(Define)伪
19、指令可为变量申请固定长度的存储空间,并可以同时将相应的存储单元初始化。,4.3.1 变量定义伪指令,格式:变量名 伪指令 初值表,变量名是用户自定义的标识符,表示初值表中首元素的逻辑地址,即用这个符号表示地址,常称为符号地址。,初值表是用逗号分隔的参数,主要由数值常数,表达式、字符串或?、DUP组成。,1.定义字节单元伪指令DB2.定义字单元伪指令DW 3.定义双字单元伪指令DD4其它数据定义伪指令定义3字伪指令DF定义4字伪指令DQ 定义10字节伪指令DT,变量定义伪指令包括:,1定义字节单元伪指令DB功能:定义变量的类型为BYTE,给变量分配字节 或字节串。要求:初值表中每个数据一定是字节
20、量,可以是0-255的无符号数或是 128-+127带符号数,也可以是字符串常数。,例:XDBa,5 DB 2DUP(100),?YDBABC,2定义字单元伪指令DW功能:定义变量的类型为WORD,给变量分配一个或 多个字单元,并可以将它们初始化为指定值。要求:初值表中每个数据一定是字,一个字单元可用于存放任何16位数据,如一个段地址、一个偏移地址、两个字符、065535之间的无符号数或者是32768+32767之间的带符号数。,例:COUNT DW8000H,AB,3定义双字单元伪指令DD功能:定义变量的类型为DWORD,用于分配一个或多个双字单元,并将它们初始化为指定值。要求:初值表中每个
21、数据是一个32位的双字(Double Word),可以是有符号或无符号的32位整数,也可以用来表达16位段地址(高位字)和16位的偏移地址(低位字)的远指针。例:VARDDDD0,?,12345678H FARPOINTDD00400078H,1.等价“EQU”伪指令伪指令格式:符号名 EQU 数值表达式 符号名 EQU 例:DOSWRITECHAREQU2 CALLDOSEQU 注:1、仅在汇编源程序时作为替代符号用,不产生任何目标代码,也不占用存储单元,因此符号名没有段、偏移量和类型这3种属性。2、EQU定义伪指令同一符号名不能重复定义,必须取消(用PURGE伪指令)后才能重复再定义。,4
22、.3.2 符号定义伪指令,2.等号“”伪指令 格式:符号名数值表达式 功能:与EQU伪指令相同,但是可以重复定义符号名。例:X7;X EQU7是正确的 XX+5;X EQUX+5是错误的,3.LABLE伪指令格式:名字 LABLE 类型功能:LABLE可以使同一个数据区域兼有两种属性例:AREAW LABEL WORD;变量AREAW类型为WORD AREAB DB 100 DUP(?);变量AREAB类型为BYTE MOV AREAW,AX;AX送第1,第2字节中 MOV AREAB49,AL;AL送第50个字节中,变量的类型可以是BYTE、WORD、DWORD,标号的类型可以是NEAR或F
23、AR.,例:画图说明下面数据区的分配及初始化的数据值DATA DB 100,0FFH;设DATA的逻辑地址为1000:0000HEXPR DB 2*3+7CHAR EQU 64HADR DB CHARSTR DB WELCOMEAB DB ABBA DW ABOFFAB DW ABADRS DW DATA,DATA+5TOTAL DD DATA,有点烦杂哦!,4.3.3 程序段的定义伪指令,简化段定义 完整段定义,4.3.3.1 完整段定义的格式,STACKSEGMENT STACK;定义堆栈段STACK;分配堆栈段的大小 STACKENDS;堆栈段结束 DATASEGMENT;定义数据段DA
24、TA;定义数据 DATA ENDS;数据段结束 CODE SEGMENTCODE;定义代码段CODEASSUME CS:CODE,DS:DATA,SS:STACK;确定CS/DS/SS指向;的逻辑段 START:MOVAX,DATA;设置数据段的段地址DS MOVDS,AX;程序代码 MOVAX,4C00H;返回DOS INT21HCODEENDS;代码段结束END START;汇编结束,程序起始位置为START,1完整段定义伪指令,完整段定义由SEGMENT和ENDS这一对伪指令实现。格式:段名 SEGMENT 定位类型 组合类型 类别;语句序列 段名 ENDS功能:SEGMENT伪指令定义
25、一个逻辑段的开始,ENDS伪指令表示一个段的结束。,(1)段定位(Align)类型指定逻辑段在主存储器中的边界,该关键字可表示为:BYTE:段开始地址为字节地址(xxxx xxxxB),属性值为1;WORD:段开始地址为字地址(xxxx xxx0B),属性值为2;DWORD:段开始地址为4的倍数(xxxx xx00B),属性值为4PARA:段开始地址为16的倍数(xxxx 0000B),即节地址,属性值为16PAGE:表示段开始地址256的倍数(0000 0000B),即页地址,属性值为256,(2)段组合(Combine)类型指定多个逻辑段之间的关系。组合的关键字有:PRIVATE:PUBL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 课件 80 X86 程序设计
链接地址:https://www.31ppt.com/p-6475908.html