汇编语言程序设计第四章.ppt

上传人:max****ui 文档编号:15493872 上传时间:2020-08-12 格式:PPT 页数:40 大小:314.86KB
返回 下载 相关 举报
汇编语言程序设计第四章.ppt_第1页
第1页 / 共40页
汇编语言程序设计第四章.ppt_第2页
第2页 / 共40页
汇编语言程序设计第四章.ppt_第3页
第3页 / 共40页
点击查看更多>>
资源描述
第四章 高级汇编语言的语法,4.1.1 汇编语言语句格式 1、机器指令的形式 标号 指令前缀 助记符 操作数 ;注释 例如: EXEC: REP MOVS DEST, SOURCE ;(OPS)OPD,构成汇编语言程序的语句主要包括两类:指令与伪指令。它们之间的区别: 指令是程序运行期间由CPU执行的,汇编后由对应的机器代码所取代。 伪指令是不可执行的。它只是源程序汇编期间由汇编器处理的命令,用来指示汇编器为数据分配内存空间,或者为汇编器提供源程序结束或段定义等。,2、伪指令语句的形式,名字 伪操作命令 参数,参数 ;注释 伪操作命令包括: 符号定义: EQU, = , LABEL; 数据定义: DB, DW, DQ, DT, RECORD, ORG, SEGMENT,ASSUME, ORG 模块定义:EXTERN , PUBLIC, NAME, END 过程定义:PROC, ENDP,4.1.2 数值表达式,数值表达式是常量或运算符与常量的组合。表达式的值是在汇编阶段已经确定或得到的值。 (1)整常量 MOV EAX, 0FA5CH (2)字符串常量 MOV AX, Aa ; AX=4161H (3)符号常量 COUNT =60*60 MOV ECX, COUNT ; COUNT=3600ECX,算法运算符共7种: +, -, *, /, MOD, SHR, SHL 对于语句:MOV AL,2 可用下列语句替换: VAL EQU 5 MOV AL, VAL SHL 1 ; VAL=5=00000101B 逻辑右移位为:00000010B=2 注意:移位运算符只对常量移位。而移位指令SHR, SHL只出现在指令码中,对寄存器或内存操作数进行移位操作。,实例: VAL=5 SHR AL, VAL SHL 1 ;若VAL=5, 等价于语句SHR AL,10,逻辑运算符4种:AND , OR, XOR, NOT, 分别对常量按位进行逻辑与,或,异或和非的运算。运算的结果也是一个已知的常量。 注意与指令AND, OR, XOR, NOT的区别。 上述指令放在操作码中,而操作符放在操作数中。 例: PORT EQU 29H ; AND DX, PORT AND 0F0H ;DX表达式的值(20H) DX,关系运算符共6种:EQ(相等), NE(不等), LT(小于), GT(大于),LE(小于等于),GE(大于等于) 对两个常量进行运算,结果是两特殊的常量值。如果关系成立(为真),结果为-1, 即0FFFFH, 如果关系不成立(为假),结果为0。 例: PORT EQU 3 MOV BX, (PORT LT 5) AND 18) OR (PORT GE 5) AND 69) 语句被汇编成: MOV BX, 18,4.1.3 标号变量与地址表达式,标号:在代码段定义的指令的地址。三个属性值:段地址,EA, 类型(FAR, NEAR)。 变量: 是内存中一个数据区的名字,作为指令的存储器操作数引用。三个属性值:段地址,EA, 类型。 类型由:DB,DW,DD,DQ,DT定义。 如: count dw 5,地址表达式 地址表达式形成的结果是存储器的地址,用来表标指令中的标号或变量操作数,有个属性:段地址,和类型。 而数值表达式的结果只有大小没有属性。 地址表达式可由变量、标号、常量、寄存器及一些运算符组成。,例1: ARRAYD DD 2,0,0,2,6,1,8,9,4,40 MOV EAX, ARRAYD+36 MOV ESI, 36 SUB ESI,4 ADD EAX,ARRAYDESI,例 ARRAYW DW 1,2,3,4 DW 5,6,7,8 DW 9,10,11,12 MOV AX,ARRAYWBXSI 等价于: MOV AX,ARRAYW+BX+SI或者 MOV AX,ARRAYWBX+SI,4.1.4 特殊运算符,1、属性替换运算符 用来取代一个操作数的属性。 (1)强制类型运算符PTR 如:MOV byte ptr BX, 5 JMP FAR PTR NEXTLABBX (2)段取代运算符: 如:MOV DX, ES:BX+DI,2. 属性分离运算符 功能:只是分离变量或标号的属性值,而不取代有关的属性。 SEG: 取段地址。 OFFSET: 取偏移地址。 如: ARRAYW DW 20 DUP (0) start: mov ax, seg ARRAYW mov ds,ax mov bx, offset ARRAYW,OFFSET与LEA指令的使用区别 OFFSET是伪指令,在汇编阶段进行计算。所以OFFSET后面的地址表达式不能带寄存器,因为汇编阶段还不能计算出寄存器的值。 如: MOV DX, OFFSET ARRAYWBX+SI ;错误 LEA DX, ARRAYWBX+SI,TYPE运算符 功能:取TYPE后面变量或标号的类型值。 类型是字节、字、双字,则返回:1,2,4 例如:MOV CL, TYPE ARRAYW ; ARRAYW为字类型,则返回。,3、返回数值运算符 (1) LENGTH 取变量数据项个数。 如果变量采用DUP定义,则LENGTH取DUP前面的重复系数。如果有多个DUP嵌套,仍取每一个DUP前面的系数否则LENGTH取值为 例如:ARRAY DW 100 dup(?) MOV CX, LENGTH ARRAY ; CX=100 ARRAY DB 10 dup(1,20 dup (20H) MOV CX, LENGTH ARRAY ;CX=10,(2)SIZE 取变量数据的字节数用来取变量定义中,有dup项时的字节数 设变量Y, 则SIZE Y=LENGTH Y TYPE Y 例如: DW 100 DUP(0) TYPE Y=2 , LENGTH Y=100 则SIZE Y=2*100=200,(3)动态求数据项个数的方法 对于:STRING DB “macro assemble” mov cx, size string ; cx=1*1=1 所以size在一些场合并不适用可以考虑动态求取 例如: string db advanced assembly counts equ $-string ;counts=16 varw dw 9,8,7,6,5,4,3,2,1,0 countw equ ($-varw) ;countw=(10*2/2)=10 buffer db 10 dup(2 dup(8),A) countL equ $-buffer ;countL=(10*(2+1)=30 $符号表示:该条包含有$语句之后下一个可用的偏移值。,(4) 字节分离运算符HIGH, LOW 功能:从一个字数值或符号常量中得到高字节或低字节。 如:WVAR EQU 0CA19H mov ah, HIGH WVAR mov al, LOW WVAR,表达式运算符的优先级,从高到低排列: LENGTH, SIZE, WIDTH *, MASK *,以及( ), ,中的项目。 .(结构引用操作符);: (段取代运算符) PTR, OFFSET, SEG, TYPE, THIS; HIGH, LOW *, / , MOD, SHL, SHR ; + , - EQ, NE, LT, LE, GT, GE NOT; AND ; OR,XOR; SHORT,4.2 汇编伪指令语句,方式伪指令 包括:.8086, .386, .386P等,用来指定CPU的类型 例如: .386 code segment code ends .8086 code segment 注意:默认是8086方式。,数据与符号定义伪指令,1.定义符号伪指令 包括EQU, =, LABEL,它们只用来定义名字,不分配存储空间 格式:名字EQU 表达式 名字 = 表达式 注意 (1)EQU的表达式可以是常量,变量名,标号,指令助记符,寄存器名;而=的表达式只能是数字表达式,主要用来定义符号常量 (2) 同一个源程序,EQU符号名不能重复定义,=则可以 (3)同一个源程序中同一符号名,不能同时用EQU和=语句定义,例如: NUMBER EQU 60 ; NUMBER=60 TIMES EQU NUMBER*24 ;TIMES=60*24=1440 BYTES DB 10 dup(?) WORDF EQU WORD PTR BYTES ;定义新名字,新类型 COUNT EQU CX ;COUNT为CX寄存器的同义名字 DEC COUNT ; 相当于CX=CX-1 VALUE =88 VALUE =VALUE+1 ;VALUE=89 MOV CL, VALUE ;CL=89 COUNT =VALUE+1 ;COUNT的值=90,(2)定义名字语句的LABEL格式 格式:名字 LABEL 类型 类型包括:byte, word,dword,near,far等 功能:它可以把同一数据区的内容既看作字节,也可以作为字或双字等类型参与运算,以适应按不同类型的存取操作 如: BARRAY LABEL BYTE WARRAY DW 50 dup (0) MOV AX, WARRAY48 ;取数组的第25个元素到AX MOV AL, BARRAY49 ; 取数组的第50个字节值到AL. 最后一条语句也可以用:MOV AL,BYTE PTR WARRAY49代替,LABEL还可以定义指向同一条指令NEAR和FAR类型的标号由其它程序段来调用FAR标号,在同一段内调用NEAR标号如: FARSUB LABEL FAR NEARSUB: MOV EBX,ECX JZ NEARSUB 在另一个程序段可用:JMP FARSUB 来执行 MOV EBX,ECX,2. 程序模块名与结束语句 (1) 模块命名语句 格式:NAME 模块名 模块语句可以在程序中不写出 (2)源程序模块结束语句 END 格式: END 表达式 源程序模块的最后一条语句.如果有表达式的值,则为程序开始执行目标代码的地址。程序汇编后,指令指针IP或EIP指向这个入口地址。如: NAME Pentium_MASM61x codes segment start: codes ends end start 注意:模块是独立的汇编单元,汇编程序只处理到END为止。后面的语句被忽略。,3.数据定义及存储分配语句 指令:DB(字节), DW(字), DD(双字), DF(长字), DQ(4字), DT(10字) 格式:变量名 DB 初值表达式1,初值表达式2 表达式可以是下列的形式: (1) 数值表达式 (2) ? 定义的数据项无法确定初值,即只分配存储存储单元。 (3) ASCII字符串 多于两个字符的字符串可用DB定义 (4) n DUP (?) 重复运算符dup用来重复定义n个数据项,内容是未确定的。 (5) n DUP(表达式,表达式) (6) n DUP(m DUP(表达式1),表达式2) 多层嵌套DUP项 ,共有n*(m+1)项,初值由表达式确定。,例4.1 定义单项变量 (1)定义单项变量 VARN DB 88 VARM DB 60*60 STRC DW AB MAXN DD -2147483468 STRS DD AB ; STRS的逻辑值00004142H ,物理存储为42410000H QVAR DQ ? TVAR DT 1024D ;为变量TVAR分配10个字节,初值为整数,即: 00000000000000000400H=1024,例4.2 定义字符串变量 STR1 DB A, B, C,D STR2 DB ABCDE ERROR DB syndax error!, 13, 10 例4.4 定义数组或缓冲区变量 BUF DB 98 dup (?) TABB DB 2 DUP (3 DUP(8),A) ARRA DW 26 DUP (41H),4.2.3 段定义与段管理伪指令,指令包括: SEGMENT, ENDS, ASSUME,GROUP,ORG等。 段完整定义格式: 段名 SEGMENT 使用类型边界类型连接类型类别 段名 ENDS 其中,两处段名是相同的。SEGMENT表示段的开始,ENDS表示段的结束。 表示可选项。,(1) 使用类型 只有使用了.386,这个选项才作用。 选项值: use16 表示该段按16位寻址,与8086方式 一样。 use32 表示该段按32位寻址,地址指针48位,段地址16位,偏移地址32位。 注意: 在定义段时,如果用了.386等伪指令后,默认使用use32,(2) 边界类型 作用: 指令段起始地址的类型。 参数值: 无 即省略边界,指系统默认值:节类型PARA PARA 段地址是16的倍数,最后4位是0000 BYTE 段地址从任意地址开始(字节地址) WORD 段地址是2的倍数,即偶地址,最低位为0 DWORD 段地址是4的倍数,最低两位为0 PAGE 段地址是256的倍数,最低8位都为0,(3)连接类型 作用:告诉LINK程序,本段与其它段的相互关系。 参数值: 无 省略连接符,表示本段有自己的段地址,与其它同名段无联系(独立段)。 PUBLIC 同名同类型连接, LINK程序将本段与其它具有该类型且段名相同(可包括不同模块)的段连接在一起,组成一个物理段。具有一个段地址。 STACK 指定堆栈段。LINK程序连接后的段为堆栈段,与PUBLIC处理相同。如果定义堆栈段没有说明STACK类型,LINK程序将发出警告”no stack” 此外,还有COMMON,MEMORY , AT 表达式的形式。,例4.7 同名段的连接。 程序段1 DATAS SEGMENT PUBLIC VAR1 DB 5 DATAS ENDS CODES SEGMENT CODES ENDS,程序段2 DATAS SEGMENT PUBLIC VAR2 DB 8 DATAS ENDS CODES SEGMENT CODES ENDS,汇编后,将生成一个段码段和数据段。数据依序存放。,(4)类别 类别是任何合法的名字。连接时,LINK程序将类别相同的段依次放在内存中。,2. 置汇编单元计数器语句ORG,格式: ORG 表达式 ORG $+表达式 表达式的值必须为常量。$表示当前地址。 ORG的功能指定该语句后面的程序或数据存放的起始地址。 例: ORG 400H DATA DB 20H, 30H ; DATA的地址为400H,例4.10 .386 DATAS_SEG SEGMENT use32 dword public data ORGAREA db ? ORG $+100H VAR db 128 dup (99) DATAS_SEG ENDS CODE_SEG SEGMENT use32 dword public code . CODE_SEG ENDS,3.指示段寄存器语句 ASSUME 格式1: ASSUME 段寄存器:段名/组名,段寄存器:段名/组名 格式2: ASSUME 段寄存器:NOTHING 格式3: ASSUME NOTHING 后两种方式取消段寄存器与段或组的联系。 例4.1 code segment use16 para public code assume cs:codes,ds:datas,es:datas, ss:stack start: mov ax,datas mov ds,ax mov es,ax . ASSUME ES:NOTHING ;取消ES段寄存器寻址,再用ES就出错了。 code ends,4. 段组语句 GROUP 功能:GROUP语句可以把模块中几个不同段合成一个组,并赋于一个组名,使它们都装在同一个物理段(64K)中。 格式为:组名 GROUP 段名, 连接时,如果超出64KB,则出错。 例: CGROUP GROUP DATA1,DATA2 ASSUME DS:CGROUP,CS:CODES DATA1 SEGMENT WORD PUBLIC DATA1 VAR1 DW 10 DUP (?) START: MOV AX, CGROUP MOV DS,AX MOV BX,OFFSET CGROUP:VAR1,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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