430 likes | 617 Views
第 5 章. 汇编语言. 5.1 8086 汇编语言基础 5.1.1 汇编语言基本语法 5.1.2 汇编语言语句 5.1.3 伪指令语句 5.1.4 宏指令语句. 5.2 汇编语言程序设计 5.2.1 顺序程序设计 5.2.2 分支程序设计 5.2.3 循环程序设计 5.2.4 子程序设计 5.2.5 DOS 功能调用. 8086 汇编语言基础. 5.1. 汇编语言的处理过程 : ( 1 )编写汇编语言源程序,生成扩展名为 ASM 的汇编源源文件。 ( 2 )对汇编源程序进行编译。
E N D
第5章 汇编语言 5.1 8086汇编语言基础 5.1.1 汇编语言基本语法 5.1.2 汇编语言语句 5.1.3 伪指令语句 5.1.4 宏指令语句 5.2 汇编语言程序设计 5.2.1 顺序程序设计 5.2.2 分支程序设计 5.2.3 循环程序设计 5.2.4 子程序设计 5.2.5 DOS功能调用
8086汇编语言基础 5.1 汇编语言的处理过程: (1)编写汇编语言源程序,生成扩展名为ASM的汇编源源文件。 (2)对汇编源程序进行编译。 (3)对目标文件进行连接 。 ● 教学进程
8086汇编语言基础 5.1 汇编语言进行程序设计的优点 ● 1)充分利用机器的硬件功能和结构特点,加快程序的执行速度, 减少目标程序所占用的存储空间; 2)用来编写实时控制程序、实时通信程序,有时也用来编制某些 系统软件程序。 汇编语言进行程序设计缺点 ● 1)效率低(与人们描述计算过程的需要差距大); 2)机器硬件的具体结构联系过于紧密——在一种结构的机器上开发 的程序极难移植到另一种不同结构的机器上去。 教学进程
汇编语言基本语法 指令语句: 伪指令语句: 宏指令语句: 5.1.1 在8086汇编中使用的语句可以分成3种类型 这类指令能够产生目标代码,是CPU可以执行的能够完成特定功能的语句,主要由机器指令组成。在汇编时一条指令语句被翻译成对应的机器码,对应着特定的操作。 伪指令语句是为汇编程序和连接程序提供一些必要控制的管理性语句,它不产生目标代码,仅仅在汇编过程中告诉汇编程序应如何汇编,并完成相应的伪操作。 宏指令语句是由编程者按照一定的规则来定义的一种较“宏大”的指令,可包括多条指令或伪指令。 教学进程
汇编语言语句 5.1.2 ● 1.汇编语言格式 汇编语言源程序中的语句可以由四项组成,格式如下: [名字] 操作符[操作数] [;注释] (1)名字项是程序设计人员自己定义的符号, 用于代表内存单元的 地址,表示本条语句的符号地址。一般来说,名字可以是标号和 变量,统称为标识符。 (2)操作符可以是指令、伪指令或宏指令的助记符。 (3)操作数字段是操作符的操作对象。 (4)注释字段是以“;”开头的说明部分,可以用英文或者中文书写。 教学进程
标号和变量都有三个属性 • 段属性:标号所代表的段的值,可用SEG算符得到。 • 偏移量属性:标号所代表的偏移量的值,可用OFFSET算符得到。 • 类型属性:标号所代表的内存单元所存放的数据或指令代码的类型。 名字项的组成规则 • 组成标号的字符:A〜Z,a〜z,0〜9,?,@,$,和_(下划线); • 标号的最大长度为3l(字符个数); • 标号的第一个字符不能是0〜9的数字; • 机器指令语句中标号必须以冒号结束,伪指令语句中的标号不允 许有冒号。 5.1.2 汇编语言语句 ● 1.汇编语言格式 标识符 标号:标号在代码段中定义,后面跟着冒号标号。 变量:变量在数据段或附加数据段中定义,后面不跟冒号。 教学进程
算术操作符 例: MOV AL,10MOD3 ;AL=1 ADD AL,11HSHR1 ;AL=8 MOV AX,(9-1) * 2 ;AX=0FH 5.1.2 汇编语言语句 2. ● 算术操作符有+、-、*、/ 和 MOD以及SHL(左移)、SHR(右移)。其中MOD运算是取模运算,即除法之后所得的余数。 教学进程
逻辑操作符 例: AND DX,PORT_VAL AND ;DX=DX AND PORT_VAL AND MOV AL,00H AND 0FH ;AL=00H MOV CX,08FH OR F8H ;CX=0FFHS 5.1.2 汇编语言语句 ● 3. 逻辑操作符包括AND、OR、XOR、NOT,逻辑操作符是按位操作的,只能用于数字表达式。 教学进程
数值回送操作符 例: ARRAY DW 1,2,3 MOV AX,05H ADD AX,TYPE ARRAY ;AX=5+2=7 5.1.2 汇编语言语句 ● 4. ●求变量或标号类型值 格式:TYPE 变量或标号 功能:若为变量,则程序将回送该变量以字节数表示的类型:DB为1,DW为2,DD为4,DQ为8,DT为10。 若为标号,则程序将回送代表该标号类型的数值: NEAR为-1,FRA为-2。 教学进程
取地址的偏移量 例: MOV AX OFFSET LABEL; AX=0001H 例 : MOV DX SEG LABEL; AX=1000H 4.数值回送操作符 ● 5.1.2 汇编语言语句 ● 格式:OFFSET变量或标号 功能:返回变量或标号所在段的段内偏移地 ●取段基地址 格式:SEG 变量或标号 功能:返回变量或标号所在段的段地址 教学进程
取变量单元数 例: BUFFER1 DB 10 DUP(10H) BUFFER2 DW 20 DUP(20H) MOV AX,LENGTH BUFFER1 ;AX=10 MOV BX,SIZE BUFFER2 ;BX=20 4.数值回送操作符 ● 5.1.2 汇编语言语句 ● 格式:LENGTH 变量 功能:如果变量是用DUP说明,则返回DUP定义变量的重 复次数,否则,返回值为1。 ●取变量字节数 格式:SIZE BIANL1 功能:返回变量的字节数,等于LENGTH与TYPE的乘积。 教学进程
属性操作符 5.1.2 汇编语言语句 5. ●PTR操作符 格式:类型PTR 符号名 功能:该操作符用于指定操作数的类型。 ●段操作符 格式:段寄存器名:地址表达式 功能:用来表示变量或地址表达式的段属性。 ●THIS操作符 格式:THIS 类型 功能:把它后面指定的类型或距离属性赋给当前的变量、标号或定 制表达式。 教学进程
SHORT操作符 6. 关系运算符 属性操作符 5. 5.1.2 汇编语言语句 ● 格式:SHORT 标号 功能:用来修饰转移指令的目标地址的属性,偏移量为8位。 ●分类运算符 格式:HIGH 表达式LOW 表达式 功能:从表达式种分离出高字节、低字节。 运算符: EQ(相等)、NE(不等于)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于),当关系成立时, 运算结果为1(FFH或FFFFH),否则为0。 格式:表达式1 关系运算符 表达式2 教学进程
运算的优先级别 优先级 运算符(操作符) 高 低 括号中的表达式 LENGTH,SIZE,WIDTH,MASK PRT,OFFSET,SEG,TYPE,THIS,段前缀 HIGH,LOW *,/,MOD,SHL,SHR +,- EQ,NE,LT,TE,GT,GE NOT OR,XOR SHORT 5.1.2 汇编语言语句 7. 教学进程
伪指令语句 例: VAL EQU 100 JIA EQU ADD ADR EQU [SI+BX+1000H] MOV AL, VAL JIA AL, 10 MOV ADR, AL 5.1.3 1. 符号定义伪指令 ●EQU 等价伪指令 格式:符号名 EQU 表达式 功能:用来定义一个符号,用该符号代表机器指令助记符、伪 指令助记符、寄存器名字、各种运算符号、常数等。 教学进程
伪指令语句(续) 5.1.3 1. 符号定义伪指令 ●等号伪指令 格式:符号名=表达式 功能:等号伪指令用来定义一个符号,用该符号代表表达式、 常数等。 ●解除符号定义伪指令 格式:PURGE 符号1,符号2,…… 功能:用来解除之前引用符号的定义。 教学进程
数据定义伪指令 5.1.3 伪指令语句 2. 数据定义伪指令有五种:DB、DW、DD、DQ、DT和DUP。 格式: 变量名DB 表达式;定义字节 变量名DW 表达式;定义字 变量名DD 表达式;定义双字 变量名DQ 表达式;定义8个字节 变量名DT 表达式;定义10个字节 复制次数 DUP 表达式 功能:其中,DT伪操作指令用来定义10个字节,其后的每个操作数占有10个字节,形成压缩的BCD码;DUP指令可以为若干重复数据分配内存单元。 教学进程
段定义伪指令 段名SEGMENT …… 段名ENDS 段定义时,必须将段和段寄存器自之间建立对应关系,可以用ASSUME伪操作来实现,其格式为: ASSUME 段寄存器名:段名1[,段名2……] 5.1.3 伪指令语句 3. 格式: 教学进程
段定义伪指令举例 5.1.3 伪指令语句 例: * * * * * * * * * * * * * * * * * * * * * * * data_seg1 segment ;定义数据段 …… data_seg1 ends * * * * * * * * * * * * * * * * * * * * * * * code_seg segment ;定义代码段 assume ds:data_seg1, es:data_seg1 assume cs:code_seg start: ;程序执行的起始地址mov ax, data_seg1 ;数据段地址 mov ds, ax ;存入DS寄存器 mov ax, data_seg1 ;附加段地址 mov es, ax ;存入ES寄存器 …… code_seg ends ;代码段结束 * * * * * * * * * * * * * * * * * * * * * * * * * * end start 教学进程
过程定义伪指令 例: CODE SEGMENT APRC PROC NEAR ADD AX,BX …… RET APRC ENDP START: MOV AX,CX CALL APOC …… CODE ENDS END START 过程名 PROC …… 过程体 RET 过程名 ENDP 5.1.3 伪指令语句 4. 格式: 功能:完成过程定义,在过程体 中实现过程的操作功能。 教学进程
条件汇编伪指令 5.1.3 伪指令语句 5. 格式:IF ×× 表达式 …… 程序段1 ELSE …… 程序段2 ENDIF 条件汇编有多种伪操作指令: (1)IF 表达式 功能:表达式为1,汇编程序段1,否则跳过。 (2)IFE 表达式 功能:表达式为0,汇编程序段1,否则跳过。 (3)IFB 参数 功能:参数为空格,汇编程序段1,否则跳过。 教学进程
条件汇编有多种伪操作指令(续) 例: AA EQU 10H …… IF AA-10H MOV CL,4 SAL AL,CL ELSE MOV CL,4 SAR AL,CL END IF 条件汇编伪指令 5.1.3 伪指令语句 5. (4)IFNB 参数 功能:参数不为空格,汇编程序段1,否则跳过。 (5)IFIDN 参数1,参数2 功能:字符串参数1与字符串参数2相同,汇编程序1,否则跳过。 教学进程
宏指令语句 5.1.4 1.宏指令的定义 格式:宏指令名 MACRO [形式参数1,形式参数2,……] …… ENDM 其中,MACRO和ENDM是一对伪操作。 教学进程
宏调用举例 5.1.4 宏指令语句 …… MIN CL,[SI],[DI] ;把由SI和DI间接寻址的两个内存单元中 ;不带符号数中小的送入CL …… 汇编后展开: …… + PUSH AX + MOV AL,[SI] ;实参[SI]替换形参SR1 + CMP AL,[DI] ;实参[DI]替换形参SR2 + JNB ??00 ;符合地址ADDR被??00替换 + MOV AL,[DI] +??00: MOV CL,AL ;实参CL替换形参DES + POP AX …… +号代表宏展开的语句。 教学进程
局域符号定义 3. 宏指令举例 5.1.4 宏指令语句 2. 格式:LOCAL 符号地址1,符号地址2,…… ●这些符号地址在宏展开时,由汇编程序重新命名。 ● 例:宏定义参数可以时操作码 宏定义: REGINC MOCRO P1,P2,P3 MOV AX,P1 P2 P3 ENDM 宏调用: REGINC IVAR1,INC,AX 宏展开: +MOV AX,IVAR1 + INC AX ●例:宏定义可以无参数 宏定义: SAVEREG MACRO PUSH AX PUSH BX PUSH CX PUSH DX ENDM 宏调用: SAVEREG 教学进程
伪操作PURGE 5.1.4 宏指令语句 ●伪操作PURGE可以取消宏定义 宏定义: ADD2 MACRO OPTR1,OPTR2,RESULT MOV AX,OPTR1 ADD AX,OPTR2 MOV RESULT,AX ENDM 宏调用: ADD2 XX,YY,ZZ PURGE ADD2 教学进程
汇编语言程序设计 5.2 5.2.1 顺序程序设计 ● 例:计算Y=5X+8,设X为无符号字节数据,且在ARGX单元存放。计算结果,存入RLTY单元。 SSEG SEGMENT STACK ;堆栈段开始 STK DB 20 DUP(0) SSEG ENDS ;堆栈段结束 DSEG SEGMENT ;数据段开始 ARGX DB 15 RLTY DW 0 DSEG ENDS ;数据段结束 CSEG SEGMENT ;代码段开始 ASSUME CS:CSEG,DS:DSEG ASSUME SS:SSEG 教学进程
顺序程序设计举例(续) CALC:MOV AX,DSEG MOV DS,AX MOV AX,SSEG MOV SS,AX MOV SP,LENGTH STK MOV AL,ARGX ;取原始数 MOV BL,05 MUL BL ;计算5x MOV BX,08 ADD AX,BX ;再加上8 MOV RLTY,AX ;保存结果 MOV AX,4C00H INT 21H CSEG ENDS END CALC 教学进程
分支程序设计 5.2.2 ●分支程序设计举例:设内存中有三个互不相等的无符号字数据,分别存放在ARG开始的字单元,编制程序将其中最大值存入MAX单元。 SSEG SEGMENT STACK STK DB 20 DUP(0) SSEG ENDS DSEG SEGMENT ARG DW 7138H,84A6H,29EH MAX DW ? DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG ASSUME SS:SSEG 教学进程
分支程序设计举例(续) START:MOV AX,DSEG MOV DS,AX MOV AX,SSEG MOV SS,AX MOV SP,SIZESTK LEA SI,ARG ;取数据首址 MOV AX,[SI];取第1个数 MOV BX,[SI+2];取第2个数 CMP AX,BX ;两数比较 JAE FMAX1 ;AX中的数大 MOV AX,BX ;大数送AX FMAX1:CMP AX,[SI+4];大数与第3个数比较 JAE FMAX2 ;AX中的数大 MOV AX,[SI+4];第3个数大 FMAX2:MOV MAX,AX ;保存最大值 MOV AX,4C00H INT 21H CSEG ENDS ENDF START 教学进程
循环程序设计 循环初试状态 循环初试状态 循环体 Y 循环控制条件 循环体 N N 循环控制条件 Y (a) DO_WHILE结构 (b) DO_UNTIL结构 5.2.3 1、循环的结构形式 教学进程
循环程序的设计方法 5.2.3 循环程序设计 2、 例:内存DATA开始存放100个单字节数据。编写程序统计这些数据内所有为“1”的位的个数,将结果存入NUMB单元。 完成此例需要统计每一个字节数据中“1”的个数,可以用右移指令把该数据的各位逐个移到进位标志位CF中,当CF=1,计数器值加1,直到100个数据检查完毕。 教学进程
5.2.3 循环程序设计 源代码清单: SSEG SEGMENT STACK 开始 STACK DW 100 DUP(0) SSEG ENDS DSEG SEGMENT ASSUME CS:CSEG,DS:DSEG ASSUME SS:SSEG START: MOV AX,DSEG MOV DS,AX MOV AX,SSEG MOV SS,AX MOV SP,SIZE STACK MOV SI,OFFSET DATA MOV CL,100 XOR AL,AL 教学进程
5.2.3 循环程序设计 LOOP2: MOV CH,08H XOR BH,BH MOV AH,[SI] LOOP1:ROR AH,1 JNC CHT1 INC BH CHT1:DEC CH JNZ LOOP1 INC SI DEC CH JNZ LOOP2 MOV DNUMB,BH MOV AH,4CH INT 21H CSEG ENDS END START 教学进程
子程序设计 5.2.4 一般子程序有五部分组成 : 1.过程定义 格式: 过程名PROC 属性 …… 过程名ENDP ●过程名为标识符,它又是子程序入口的符号地址,与标号的作用相同。 ●属性(Attribute)是指类型属性,可以是NEAR或FAR。 用户对过程属性的确定原则很简单,即: (1)如果调用程序和过程在同一个代码段中,则使用NEAR属性。 (2)如果调用程序和过程不在同一个代码段中,则使用FAR属性。 教学进程
现场的保存与恢复 5.2.4 子程序设计 2. ●现场——主程序在调用子程序前可能在CPU寄存器和内存中存有一 些有用的数据,这些数据就是调用前的现场, ●现场保护——在子程序的执行过程中很可能会改表这些单元的内容。 因此在子程序开始执行前,把主程序中有用的数据先保 存到堆栈中,这向工作称为现场保护。 ●恢复——为使子程序返回到主程序后,主程序能够在原有环境下继 续执行,必须将现场保护时保存在堆栈中的现场数据重 新恢复。 教学进程
子程序的调用和返回 5.2.4 子程序设计 3. ● 子程序调用除一般的简单调用外,还可以嵌套调用、递归调用。 ● 在子程序执行完毕后,必须回到调用它的主程序。因此,在每个子程序结束时必须有返回指令,返回指令为RET。 教学进程
程序举例 采用子程序结构,用一个子程序DECIBIN实现从键盘取得十进制数并把它转换为二进制数;另一个子程序BINIHEX把此二进制数以十六进制数的形式在屏幕上显示出来。各个子程序之间用BX寄存器来传送信息。 5.2.4 子程序设计 4. 例:十进制到十六进制数转换程序。程序要求从键盘取得一个十进 制数,然后把该数以十六进制形式在屏幕上显示出来。 CSEGsegment ssume CSCSEG main proc far ; 程序的主要部分 START:call decibin ;调用子程序decibin call crlf ;调用子程序crlf call binihex ;调用子程序binihex 教学进程
4. 5.2.4 子程序设计 程序举例(续) call crlf jmp repeat main endp decibin proc near ; 子程序decibin mov bx,0 newchar:mov ah,1 int 21h ; 从键盘接收单个字符 ; 非0~9之间的数退出 sub al,30h jl exit cmp al,9d jg exit cbw ; al扩展到ax ; BX中的数乘以10 xchg ax,bx mov cx,10d mul cx xchg ax,bx 教学进程
4. 5.2.4 子程序设计 程序举例(续) add bx,ax jmp newchar ; 接收下一个字符 exit: ret decibinendp Binihex proc near ; 子程序binihex mov ch,4 rotate: mov cl,4 rol bx,cl mov al,bl and al,0fh add al,30h cmp al,3ah jl printit add al,7h printit: mov dl,al mov ah,2 int 21h dec ch jnz rotate ret 教学进程
5.2.4 子程序设计 4. 程序举例(续) binihexendp crlf proc near ; 子程序crlf ; 显示回车 mov dl,0dh mov ah,2 int 21h ; 显示换行 mov dl,0ah mov ah,2 int 21h ret crlf endp CSEG ends end main 教学进程
DOS功能调用 5.2.5 ● 返回系统(功能号:4CH) 功能:在程序结束后,将对微机的控制权交换给操作系统。 ●显示字符串(功能号:09H) 功能:可以将内存缓冲区中的字符串输出到显示器,缓冲区的字符 串以$作为结束符,缓冲区首地址在寄存器DX中。 教学进程
小结 ● —— 重要知识点 ● 第5章 汇编语言 5.2 汇编语言程序设计 ●5.2.1 顺序程序设计 ●5.2.2 分支程序设计 ●5.2.3 循环程序设计 ●5.2.4 子程序设计 5.2.5 DOS功能调用 5.1 8086汇编语言基础 ●5.1.1 汇编语言基本语法 ●5.1.2 汇编语言语句 ●5.1.3 伪指令语句 ●5.1.4 宏指令语句 教学进程