2015第四章 8086汇编语言程序设计
第4章8086汇编语言程序设计
定义数据段 定义附加段
定义代码段
程序结束
汇编伪指令语句 1.段定义伪指令 段定义伪指令(segment与ends) 段定义伪指令 与
格式: 格式 : 别’] 段名 segment [定位 组合 段字 类 定位][组合 段字][‘类 定位 组合][段字
…. 段名 ends 段的起始地址 段间关系
定位默认para,段起始地址低4位是0 定位默认para,段起始地址低4位是0,所以默认 para,段起始地址低 情况下数据段的偏移地址从0 情况下数据段的偏移地址从0开始 初学者暂不考虑后面的参数,会定义段就可以了 初学者暂不考虑后面的参数 会定义段就可以了
汇编伪指令语句 4.模块通信伪指令 模块通信伪指令
(1)格式:public 符号 格式: 符号[,…] 格式 功能: 功能:当一个符号允许被其他模块调用应该用 public声明。 声明。 声明 这里的符号可以是常量、变量、标号、 这里的符号可以是常量、变量、标号、过程名 (2)格式:extrn 符号 类型 格式: 符号:类型 类型[,…] 格式 功能:指明符号是由其他模块用public定义 功能:指明符号是由其他模块用 定义 该符号在本模块中被引用。 的,该符号在本模块中被引用。 该符号在本模块中被引用 p83 例4.11
第四章 8086汇编语言程序设计
1 2 3 4
汇编语言格式 汇编伪指令语句 汇编语言中的数据 汇编程序的执行过程
汇编语言的语句类型 指令语句 执行,可产生机器代码 由CPU执行 可产生机器代码 执行 可产生机器代码,CPU根据这些 根据这些 代码才能执行相应的操作。 代码才能执行相应的操作。 伪指令语句 由编译器处理,为编译和连接提供控制信息 为编译和连接提供控制信息, 由编译器处理 为编译和连接提供控制信息 不产生机器代码。 不产生机器代码。 宏指令语句 以一个宏名定义的一段指令序列,在汇编中 以一个宏名定义的一段指令序列 在汇编中 凡是出现宏指令语句的地方,都会有相应的 凡是出现宏指令语句的地方 都会有相应的 指令语句序列的目标代码插入。 指令语句序列的目标代码插入。
《微机原理》第04章 习题
习题1 习题
1.编写 编写8086汇编语言程序 , 将寄存器 的高 位传 汇编语言程序, 的高8位传 编写 汇编语言程序 将寄存器AX的高 送到寄存器BL, 位传送到寄存器DL 送到寄存器 ,低8位传送到寄存器 位传送到寄存器
习题2 习题
2.将寄存器 的内容从低到高位的顺序分成 组 , 将寄存器DX的内容从低到高位的顺序分成 将寄存器 的内容从低到高位的顺序分成4组 并将各组数分别送到寄存器AL,BL,CL和 DL( 如 并将各组数分别送到寄存器 和 ( DX=6D82H,分成:06H、0DH、08H、02H)。 ,分成: 、 、 、 )
MOV AX,MEN MOV BX,AX SHR AX,1 JC PO_1 MOV MEMB,BX JMP DONE PO_1: MOV MEMA,BX : DONE:
习题4 习题
4.试统计 个数中偶数的个数,并将结果在屏幕显示 试统计9个数中偶数的个数 试统计 个数中偶数的个数,
SI BUFF 3BH 47H 8DH -75 0A4H 69H -2EH 0CCH 200 0000H 0001H 0002H 0003H 0004H 0005H 0006H 0007H 0008H
逻辑左移
CF
0 1 XXX XXXX 0 XXX XXXX
SHL AL,1 ADC DL,0
ADC指令实现 指令实现DL+CF+0 指令实现 如果是负数, 为 , 个数记录加1 如果是负数,CF为1,则DL个数记录加 个数记录加
DATA SEGMENT BUFF DW 6700H,9E00H,-6A00H,0A0BH,6D00H NUM DB $-BUFF MEM DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA , START:MOV AX,DATA MOV DS,AX MOV CX,NUM LEA BX,BUFF
(微机原理)第4章8086汇编语言程序设计
逻辑运算指令的编写与使用
逻辑操作
包括与、或、异或、非等运算。
测试指令
对某一位或某一组存储单元进行 运算和测试。
字符串操作
适合处理字符串拼接、截取等操 作。位操作指令的编写与使用 Nhomakorabea1
设置指令
包括STC、STD等,可设置标志寄存器中
输入输出
2
相应的位。
指令IN、OUT等,可实现从外部设备的输
入和输出。
堆栈是一种重要的存储结构,在程序中 起到了重要的作用。
寄存器的种类及其功能
通用寄存器
8个通用寄存器,用于存储数据 或内存地址。
计数器与时序寄存器
用于计数和处理时间信息。
状态标志寄存器
记录程序的运行状态,如进位标 志、零标志、符号标志等。
数据传输指令的编写与使用
MOV
用于数据传输,是汇编程序常用的一种指令。
3
控制指令
HLT、WAIT等控制指令,可控制程序的执 行。
转移指令的编写与使用
JMP
无条件转移指令,直接跳转到指定的地址。
JE
条件转移指令,按指定条件进行转移操作。
CALL
过程调用指令,可将参数传递给被调用的程序。
RET
过程返回指令,将跳转到调用指令后面的位置。
输入输出指令的编写与使用
IN 指令
从设备或端口读入数据到指定的 操作数中。
O U T指令
将指定的操作数中的数据送到设 备或端口中。
PUS H /PO P指令
将寄存器的值压入堆栈或从堆栈 中取出数据。
堆栈操作的编写与使用
1
PUSHA/POPA
将16个通用寄存器的值一次性入栈或出栈。
2
第04章 8086汇编语言程序设计A
4.2 伪 指 令(书P87)
•伪操作又称为伪指令,它们不像机器指令那样是在程 序运行期间由计算机来执行的,而是在汇编程序对源
程序汇编期间由汇编程序处理的。
•它们可以完成如处理器选择、定义程序模式、定义数 据、分配存储区、指示程序结束等功能。 •伪指令形式上与一般指令相似,但伪指令只是为汇编 程序提供有关信息,不产生相应的机器代码。
CONSTANT DATA ALPHA BETA ADDR B P8 EQU EQU EQU EQU EQU EQU
EQU
256 ;将数256赋以符号名CONSTANT ;HEIGHT为一标号,地址表达式赋以符号名DATA
HEIGHT+12 7
ALPHA-2 ;这是一组赋值伪操作,把7-2=5赋以符号名BETA VAR + BETA [BP+8] DS:[BP+8] ;将VAR+5赋以符号名ADDR ;变址引用赋以符号名B ;加段前缀的变址引用赋以符号名P8
4.1.1
汇编语言源程序的框架结构
• 按逻辑段组织源程序,每段由伪指令SEGMENT开始、 由ENDS结束。 • 包括: • 代码段(必不可少) • 堆栈段 • 建立一个堆栈区,以存放中断时的断点地址, 子程序调用时断点地址及子程序间传递参数。 • 数据段等。 用来在内存中建立一个适当容量的工作区用以 存放数据。
英文字母(A~Z,a~z); (2) 数字(0~9); (3) 特殊符号(?、@、_等)。
(1)
•名字的定义要满足如下规则: (1) 数字不能作为名字的第一个符号; (2) 单独的问号(?)不能作为名字; (3) 一个名字的最大有效长度为31位,超过31位 的部分计算机不再识别; (4) 汇编语言中有特定含义的保留字(如操作码、 寄存器名等),不能作为名字使用。 • 为了便于记忆,名字的定义应该做到见名知义,如 用BUFFER表示缓冲区、SUM表示累加和等。
《微机原理》第04章 8086汇编语言程 课件序设计
;定义数据段 ;定义变量 ;数据段结束
CODE SEGMENT ;定义代码段 ASSUME DS:DATA , CS: CODE ;段属性说明 START: MOV AX , DATA ;初始化 初始化DS MOV DS , AX …… ; 填写代码 MOV AX , 4C00H ;返回 返回DOS INT 21H CODE ENDS ;代码段结束 END START ;源程序结束
关系运算符例
例: AND AX,((NUMB LT 5)AND 30 ) OR((NUMB GE 5)AND 20) ,
当NUMB<5时,指令含意为 时 指令含意为AND AX,30; , 当NUMB≥5时,指令含意为 时 指令含意为AND AX,20。 , 。 此例中,操作符 与操作数表达式中的AND具有 此例中,操作符AND与操作数表达式中的 与操作数表达式中的 具有 不同的含意,前者是助记符,后者是伪运算。 不同的含意,前者是助记符,后者是伪运算。
4.2.3 段定义语句 段定义语句按段来组织程序和使用寄存器 1. 段定义语句格式: 段定义语句格式: 段名 SEGMENT [定位类型 [组合类型 [‘类别 定位类型] 组合类型] 定位类型 组合类型 ‘ ’] …… 段名 ENDS 说明: (1)SEGMENT和ENDS必须成对出现 说明: ) 和 必须成对出现 (2)段名可以是包括下划线在内的字母、数字串, )段名可以是包括下划线在内的字母、数字串, 前后必须一致。 前后必须一致。
4.分析操作符 分析操作符 (1)SEG操作符 ) 操作符 例: MOV AX , SEG BUFF (2)OFFSET操作符 ) 操作符 例:MOV BX , OFFSET BUFF =LEA BX,BUFF
5.综合运算符(合成操作符) 综合运算符(合成操作符) 综合运算符 功能: 功能: 由已有的操作数建立新的操作数; 由已有的操作数建立新的操作数; 新操作数和已有的操作数类型不一样 (1)PTR运算符 ) 运算符 格式: 格式: 类型 PTR 表达式 例:INC WORD PTR [BX] BUFF DW 1234H MOV AL,BYTE PTR BUFF MOV AH,BYTE PTR BUFF+1
第4章 汇编语言程序设计
因此, 因此,对例子中的存储器地址作如下运 算: SUM+2 CYCLE-5 NOT_DONE-GO 是有效的表达式。 是有效的表达式。而 SUM-CYCLE
(2)逻辑运算符 逻辑运算符是按位操作的AND、OR、 、 逻辑运算符是按位操作的 、 XOR和NOT。 和 。 1010 1010 1010 1010B AND 1100 1100 1100 1100B=1000 1000 1000 1000B 1100 1100 1100 1100B OR 1111 0000 1111 0000B=1111 1100 1111 1100B NOT 1111 1111 1111 1111B=0000 0000 0000 0000B
ASSUME CS:MY_CODE, ;规定 和DS 规定CS和 : 的内容 DS:MY_DATA : PORT_VA1 EQU 3 ;端口的符号名 GO: MOV AX, MY_DATA ;DS : 初始化为MY_DATA 初始化为 MOV DS, AX MOV SUM, 0 ;清SUM单元 单元
变量可以具有以下几种寻址方式: 变量可以具有以下几种寻址方式: ① 直接寻址 ② 基址寻址 变址(索引) ③ 变址(索引)寻址 ④ 基址变址寻址
2.运算符(Operators) .运算符( ) 算术运算符( Operators) ① 算术运算符(Arithmetic Operators) 逻辑运算符( Operators) ② 逻辑运算符(Logical Operators) 关系运算符( Operators) ③ 关系运算符(Relational Operators) 分析运算符( Operators) ④ 分析运算符(Analytic Operators) 合成运算符( Operators) ⑤ 合成运算符(Synthetic Operators)
第4章8086,8088微机汇编语言程序设计
2)段内偏移量(Offset) 它是标号与段起始地址之间相距的字节数,为一16位 无符号数。 3)类型(Type) 类型表示该标号所代表的指令的转移范围,分NEA R(近)与FAR(远)两种。NEAR类型的标号仅在 同一段内使用,用2字节指针给出转移的偏移量属性(即 只改变IP值,不改变CS值);而FAR类型的标号无此限 制,必须用4字节指针指出转移的段地址与段内偏移量。 当标号用作JMP或CALL等指令的目标操作数时,若 为段内转移或调用则采用NEAR类型;若为段间转移或 调用则应当采用FAR类型。 JMP FAR PTR LINE
第4章 8086/8088汇编语言程序设计
汇编语言程序设计是开发微机系统软件的基本 功,在程序设计中占有十分重要的地位。
由于汇编语言具有执行速度快和易于实现对硬件的控 制等独特的优点,所以至今它仍然是用户使用得较多的程 序设计语言。特别是在对于程序的空间和时间要求很高的 场合,以及需要直接控制设备的应用场合,汇编语言更是必 不可少了。 由于汇编语言本身的特点,本章将选择目前国内广泛 使用的IBM PC机作为基础机型,着重讨论8086/8088汇编 语言的基本语法规则和程序设计的基本方法,以掌握一般 汇编语言程序设计的初步技术。
(1)立即操作数 立即操作数在指令中直接给出,不需要使用 寄存器,也不涉及访问数据区的操作,只能作为 源操作数。立即操作数是整数,可以是1字节或 2字节。在汇编语言中,立即操作数用常量(包 括数值常量和符号常量)以及由常量与有关运算 符组成的数值表达式表示。 如:MOV BX,1000+5*3 (2)寄存器操作数 通用寄存器AX、BX、CX、DX、BP、 SP、DI、SI以及段寄存器CS、SS、D S、ES都可以作为操作数。如:MOV BX,AX
第4章 计算机 8086汇编语言程序设计
格式:
ASSUME 段寄存器:段名,段寄存器:段名,… 例: ASSUME CS:CODE,DS:DATA
由于ASSUME伪指令只是指定某个段分配给哪一个 段寄存器,它并不能把段地址装入段寄存器中,所 以在代码段中,还必须把段地址装入相应的段寄存 器中: mov ax, data mov ds, ax
数据定义及存储器分配伪操作的操作数
4. 操作数字段用复制操作符DUP
[例 ] ARRAY1
ARRAY2
ARRAY1
00H ----
DB
DB
2 DUP(0,?)
100 DUP(?)
ARRAY2
00H -------------
ARRAY1的语句可等价于: ARRAY1 DB 0,?,0,?
100个字节单元
伪指令又称为伪操作,它是在对源程序汇编期间由汇编 程序(如MASM、TASM)处理的操作,它们可以完成如处理 器选择、定义程序模式、定义数据、分配存储区、指示程序结 束等功能。
伪指令和指令的区别在于,每一条指令必须生成机器代 码,然后在程序运行期间由CPU来执行其操作;而伪指令是在 汇编期间由汇编程序执行的操作命令,除了数据定义及存储器 分配伪指令分配存储器空间外,其它伪指令不生成目标码。
第4章 8086汇编语言程序设计
8086 汇编语言的语句
8086 汇编语言中的伪指令 汇编语言程序设计 汇编语言程序实例与上机调试
几个概念
汇编语言:汇编语言(Assembly Language)是用 助记符、符号地址、标号等编写程序的语言,是 机器语言的一种符号表示, 汇编语言源程序:用汇编语言编写的程序叫做汇 编语言源程序(简称源程序) 汇编:将汇编语言源程序翻译成机器语言程序的 过程叫汇编
第四章 8086汇编语言程序设计
DOS功能调用
IBM-PC的DOS把机器资源的使用用INT 21H功能调用的方式提供给用户 使用时应注意: * 按功能确定应调用的功能号送AH寄存器 * 根据要求把参数填入相应的寄存器中 * 最后用INT 21H功能调用 例: 在当前光标位置显示以'$'结尾的字符串 D SEGMENT D1 DB 'HOW ARE YOU?',0DH,0AH,'$' D2 DB 'OK',0DH,0AH,'$' D ENDS C SEGMENT ASSUME CS:C,DS:D BG: MOV AX,D ; 建立数据段 MOV DS,AX LEA DX,D1 ; DX=字串D1指针 MOV AH,9 ; 9号功能(显示字串) INT 21H ; DOS功能调用 MOV AH,8 ; 8号功能调用(接收键盘输入但不显示) INT 21H ; DOS功能调用 CMP AL,'Y' ; 输入键是'Y' JNE NEXT ; 不是'Y'键,则直接返回系统 LEA DX,D2 ; 是'Y'键,DX=字串D2指针 MOV AH,9 ; 9号功能调用(显示字串) INT 21H ; DOS功能调用 NEXT: MOV AH,4CH ; 4CH号功能调用(返回系统) INT 21H ; DOS功能调用 C ENDS END BG
END
START
分支程序结构
例: 比较D1,D2两个带符号数的大小,大的放在BX SEGMENT DW -123H DW -120H ENDS SEGMENT ASSUM CS:CODE,DS:DATA BEGIN: MOV AX,DATA MOV DS,AX MOV BX,D1 CMP BX,D2 JGE DOWN MOV BX,D2 DONE: MOV AH,4CH INT 21H CODE ENDS END BEGIN DATA D1 D2 DATA CODE
第4章. 8086 8088汇编语言程序设计_软件调试技术
4.4 软件调试技术
例10:将利用DOS功能2 显示字符a的一段小程序汇编到 2180: 100H开始的内存中。
由于A命令不支持字符方式,当在0102地址后输入指令 MOV DL, ’a’ 后,显示出错信息,然后仍然提示当前汇编地址 2180: 0102,此时可重新输入指令 MOV DL,61,其中61H为a的 ASCII码。
1上海交通大学网络学院2theprincipleapplicationofmicrocomputer微机原理与应用王春香副教授wangcxsjtueducn3主要内容41程序设计语言概述4280868088汇编语言的基本语法4380868088汇编语言程序设计基本方法44软件调试技术章第四章汇编语言程序设计4掌握软件技术不仅应具有很强的抽象能力分析能力与综合能力还应具有较强的调试能力及排错能力
标志寄存器各标志位的显示字符
标志位 溢出位 方向位 中断位 符号位 零值位 辅助进位位 奇偶位 进位位 置位 OV DN EI NG ZR AC PE CY 复位 NV UP DI PL NZ NA PO NC
OF DF IF SF ZF AF PF CF
18
4.4 软件调试技术
例5:-r ;显示CPU内所有寄存器内容和标志位状态
30
4.4 软件调试技术
4.4.1 调试软件
常用的DEBUG命令。 8. 指定文件名命令 格式:N文件名及扩展名 指出即将调入内存或从内存中存盘的文件名。 这条命令要配合L或W命令一起使用。
31
4.4 软件调试技术
4.4.1 调试软件
常用的DEBUG命令。 9. 装入命令 格式1:L起始地址 驱动器号 起始扇区 扇区数
4.4.1 调试软件
常用的DEBUG命令。 10. 写磁盘命令 格式1:W起始地址 驱动器号 起始扇区 扇区数
第四章 8086汇编语言程序设计
第四章8086汇编语言程序设计本章共2小节。
主要内容:1、程序设计分类2、程序设计举例重点内容:顺序程序、分支程序和循环程序本章学习目标通过本章的学习,应当掌握以下内容:•了解汇编语言的基本知识和特点。
•熟悉汇编语言的程序结构、段定义以及语句的格式。
•掌握汇编语言常用伪指令的使用方法。
•熟练掌握汇编语言程序设计的基本方法:顺序结构、•分支结构、循环结构和子程序结构。
第一节:机器语言、汇编语言与高级语言程序设计语言通常分为3类:机器语言(Machine Language)汇编语言(Assembler Language)高级语言(High Level Language)4、1、1 机器语言和汇编语言1.机器语言(1)机器指令机器指令是指用二进制编码的指令,以表示计算机所要进行操作数及操作对象(数据或数据地址)。
(2)指令系统和机器语言指令系统是指特定计算机上机器指令的集合。
机器语言是由指令系统以及机器指令的使用规则构成的。
机器语言是计算机惟一能识别的语言,只有用机器语言描述的程序,计算机才能直接执行。
4、1、1 机器语言和汇编语言1.机器语言(1)机器指令机器指令是指用二进制编码的指令,以表示计算机所要进行操作数及操作对象(数据或数据地址)。
(2)指令系统和机器语言指令系统是指特定计算机上机器指令的集合。
机器语言是由指令系统以及机器指令的使用规则构成的。
机器语言是计算机惟一能识别的语言,只有用机器语言描述的程序,计算机才能直接执行。
(3)机器语言的主要特点机器语言主要具有下列两个特点:①机器语言与机器密切相关②机器语言设计程序非常困难,但容易实现高性能2.汇编语言以助记符描述的指令称作汇编格式指令或符号指令,通常简称指令。
指令和伪指令的集合及其程序设计规则便构成了汇编语言。
用汇编语言编写的程序就是汇编语言源程序。
4、1、2 汇编语言与高级语言机器语言和汇编语言都是面向机器的,是低级语言。
高级语言在程序设计的简易性与代码的可移植性等方面有了质的飞跃。
第04章8086汇编语言程序设计
4.2.5 结束语句
格式:END 常数或表达式
功能:该语句标志整个程序的结束,是源程序的 最后一条语句。
4.3 8086汇编语言中的运算符
4.3.1 常用运算符和操作符
+(加)、-(减)、*(乘)、/(除)、 MOD(求余)。
1、算术运算符
2、逻辑运算符 AND、OR、XOR、NOT
3、关系运算符 EQ(相等)、NE(不等、)、 LT(小于)、GT(大于)、 LE(小于等于)、GE(大于等于)。 关系成立,全1 关系不成立,全0 例: MOV DL , 10H LT 16 ; MOV DL,0 例: AND AX , 555 GT 222 ; AND AX,0FFFFH
存储器操作数的三种属性: 段值属性(SEGMENT):存储器操作数的段起始地 址,此值必须在一个段寄存器中,而标号的段则总 是在CS寄存器中。 段内偏移量属性(OFFSET):代表从段起始地址到该 操作数所在位置之间的字节数。等于当前地址计数 器(可用$表示)的值。 类型属性(Type):表示变量占用存储单元的字节 数。用DB定义的变量类型属性为字节;用DW定义 的变量类型属性为字(2B);用DD定义的变量类 型属性为双字(4B)。指出标号在本段内还是在其 他段中引用,段内称NEAR,指针长度为2字节;段 间FAR,4字节。
4、复制操作 复制操作符DUP(Duplication)可预置重复的数值 n DUP (表达式) 例4:ALL_ZERO DB 0,0,0,0,0 用复制操作可改为: ALL_ZERO DB 5 DUP(0) 为若干重复数据单元分配存储单元。
4.2.3 段定义语句 1、段定义语句格式:
段名 段名 SEGMENT …… ENDS [定位类型] [组合类型] [‘类别’]
2015第四章 8086汇编语言程序设计
例4-6: 编写AX*10AX子程序
子程序编写 1、子程序组成 使用说明 a、子程序功能 b、使用寄存器情况 c、入口出口参数 程序体 入口出口参数传递 现场保护 功能程序段
2、现场保护和入口出口参数传递 现场保护 方案一:在子程序中保护 方案二:在主程序中保护 参数传递 •寄存器传递 •变量传递 •堆栈传递
BUFF2 DB -1DH, 6AH
…….
MOV
AX, BUFF1
MOV
BX, BUFF1+2
MOV
CL, BUFF2
2、定义一串字符 例2: STR DB ‘ Welcome !’ 3、定义保留存储单元 例3: SUM DW ? , ?
4、复制操作 复制操作符DUP可预置重复的数值
例4: ALL_ZERO DB 0,0,0,0,0 用复制操作可改为: ALL_ZERO DB 5 DUP(0)
5、将已定义的地址存入内存单元 例5: LIT DD CYC
… CYC: MOV AX , BX
4.2.3 段定义语句 1、 段定义语句格式:
段名 SEGMENT [定位类型] [组合类型] [‘类别’] ……
段名 ENDS
只需要掌握
段名 SEGMENT ……
段名 ENDS
2、段假设语句 ASSUME 段寄存器名:段名[,…]
4、分析操作符
1)SEG 例: BUFF DW 1234H
MOV AX , SEG BUFF 2)OFFSET 例: MOV BX , OFFSET BUFF
MOV DX , BUFF
3)TYPE
对于变量有3种: 1 字节型; 2 字型; 4 双字型;
第4章8086汇编语言程序设计
(2)段属性——定位类型,组合方式,类别 定位类型——定位段的起始地址 BYTE——字节型,段可从任意地址开始 WORD——字型,段从偶数地址开始 PARA——节型(默认),16字节为1节,段起始地址能被16 整除:XXXX0H PAGE——页型,256字节为1页,段起始地址能被256整除: XXX00H 组合方式——不同模块间同名段的连接与组合 NONE——默认为独立段,不组合 PUBLIC——公共段,各公共段连接形成大逻辑段 STACK——堆栈段,各堆栈段连接形成大逻辑段 AT——由表达式值定本段起始地址 类别——类别名用引号括起,相同类别名的段装入连续存储 区
JNL NEXT
JMP MAX STOP:MOV NUM2,AX
;若≥,则转NEXT
;若<,则转MAX ;最大值存入NUM2字单元
MOV AH,4CH
INT 21H CODE ENDS END START
例:编写程序,统计ARRAY字数组中正数、 负数和零的个数,并分别保存在变量 BUF1、BUF2、BUF3中。
例:编写程序,将包含10个字节数据的数组 ARRAY分成正数组ARYP和负数组 ARYM,并统计它们的长度。
DATA SEGMENT ARRAY DB 1,-2,3,-6,5,4,8,34,-67,20 ARYP DB 10 DUP(?) ;正数组 PNUM DB 0 ;正计数 ARYN DB 10 DUP(?) ;负数组 NNUM DB 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA BX,ARRAY ;ARRAY数组指针 LEA SI,ARYP ;ARYP数组指针 LEA DI,ARYN ;ARYN数组指针 MOV CX,10
第4章 8086汇编语言程序设计的基本方法-汇编语言程序设计教程-陆遥-清华大学出版社
4.6.1 宏定义、宏调用与宏 展开 4.6.2 宏定义中的指令标号 4.6.3 宏库的建立与使用
4.1 顺序程序设计
所谓顺序程序,是指完全按照源程序中指令的先 后次序,从头到尾依次执行每一条指令的程序结 构。
【例4.1】编写程序,计算下列算术表达式的值。
X =(A×B+C-D )/(E+F )
分析:本例的处理过程可用下面的程序流程图描述。
开始
N A↔B
A≤B ? Y
N A↔C
A≤C ? Y
N B↔C
B≤C ? Y
结束
图4.2 例4.3的程序流程图
【例4.4】设字节变量SCORE中存有某生某门课的百分制成 绩,请编写程序,将该百分制成绩转换为五级记分制成绩, 并将转换结果用大写字母A~E存入变量LEVEL中。五级成 绩定义为:A(SCORE≥90),B(90>SCORE≥80),C (80>SCORE≥70),D(70>SCORE≥60),E(60> SCORE)。
有时,一个循环的循环体中也包含一个循环,这 就形成了循环嵌套。如果嵌套深度为两层,则称 为双重循环,三层以上则称为多重循环。
【例4.8】设某班有40个学生,现平均分为5个小组(每小 组8人)参加某课程学习竞赛,以各小组的考试总分作为 排名依据。试编写程序,求各小组的考试总分。
分析:求5个小组的考试总分,需要用一个5次的计数循环; 而每个小组有8人,求其总分又需要一个8次的计数循环。 因此,这是一个典型的双重循环问题。 5个小组的竞赛成绩按组序(每组8个成绩数据)依次连续 地存储在一个一维数组中,求得的各组总分也存入一个数 组中。其处理流程如下图所示。
循环有两种类型:计数型循环和条件型循环。在 实际应用中,还有一种计数型与条件型相结合的 循环控制类型。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LOOP NEXT MOV MEM , DL
例4-5:在BLOCK 存储区有一字符串,统计“%” 之前的字符个数
BLOCK COUNT MEM DB ‘FHJLIO689%yyuo’ EQU $-BLOCK DB 0
MOV SI,OFFSET BLOCK
MOV CX,COUNT
LOOP1:MOV AL, [SI] CMP AL, ‘%’ JE INC INC DONE MEM SI
4.2.4 过程定义语句
过程名 PROC NEAR/FAR …… RET 过程名 ENDP …… CALL 过程名
4.3 8086汇编中的运算符
4.3.1 常用运算符
1、算术运算符 +(加)、-(减)、*(乘)、/(除)、MOD (求余) 2、逻辑运算符 AND、OR、XOR、NOT
3、关系运算符
popf pop bx ret endp
;2ax ;2axbx ;4ax ;8ax ;10ax
;恢复现场
功 能 程 序 段
mul10
MOV AX, XX CALL MUL10 MOV YY, AX
4.6 汇编语言程序设计与上机调试
4.6.1 程序设计实例
4.6.2 DOS功能调用与子程序设计
循环控制方法
1) 循环次数已知, 用计数控制循环 2) 用条件控制循环 无法确定循环次数时,可用某种条件来确定是否结束 循环。程序要是寻找控制条件以及对控制条件的检测。 。
例4-3: 编程统计BUFF为首地址的缓冲区 中负数的个数。
BUFF DB 67H,9EH, -6AH,0ABH,6DH MEM DB ?
;定义数据段 ;被加数
DATA2 DB 0C1H
DATA ENDS
;加数
;数据段结束
CODE START:
SEGMENT ;定义代码段 ASSUME CS:CODE,DS:DATA MOV AX,DATA MOV DS,AX MOV SI,0 ;初始化DS ;置SI初值为0
MOV AL,DATA2[SI]
ASSUME DS:DATA , CS: CODE START: MOV AX , DATA
MOV DS , AX
…… MOV AX , 4C00H
INT 21H
CODE ENDS END START
框架二:
DATA VAL1
DATA
SEGMENT DB 12H , 8EH …… ENDS
;定义数据段 ;ห้องสมุดไป่ตู้义变量
4.4 汇编语言程序设计
常用的汇编语言程序框架:
DATA VAL1 DATA CODE SEGMENT DB 12H , 8EH …… ENDS ;定义数据段 ;定义变量 ;数据段结束
SEGMENT ;定义代码段 ASSUME DS:DATA , CS: CODE START: MOV AX , DATA ;初始化DS MOV DS , AX …… MOV AX , 4C00H ;返回DOS INT 21H CODE ENDS ;代码段结束 END START ;源程序结束
4.2.2 变量定义语句 格式: 符号名 DB/DW/DD [操作数1,] [操作数2] … 1、定义一组数据 例1: BUFF1 DW 1234H, 0ABCDH, 8EH BUFF2 DB -1DH, 6AH ……. MOV AX, BUFF1 MOV BX, BUFF1+2 MOV CL, BUFF2
XOR
LEA
DL,DL
BX,BUFF
;DL←0
;BX←缓冲区首址
MOV
CX,5
;CX←缓冲区长度
;取一个数据到AL ;使数据影响状态标志位 ;不为负,转AA1 ;为负DL+1 ;移动指针 ;循环控制 ;保存统计结果
NEXT:MOV AL, [BX] ADD AL,0 JNS INC AA1: INC AA1 DL BX
4)LENGTH
已用DUP说明的变量,则用LENGTH 可得到 这个变量的个数。否则得到1
5)SIZE
SIZE=TYPE×LENGTH 例: BUFF DW 10 DUP(?) MOV CX, LENGTH BUF MOV CX,10 MOV CX,SIZE BUF MOV CX,20
5、综合运算符(合成操作符)
;段属性说明
4.4.1 汇编语言程序设计基本步骤
分析问题,建立模型,确定算法
绘制流程图
确定变量与工作单元,编写程序
检查和调试
4.4.2 汇编语言程序的基本结构
1、顺序结构
例4-1
DATA SEGMENT ;定义数据段 BLOCK DW 0ABCDH ;定义变量 BUFF DD ? DATA ENDS ;数据段结束
1)PTR运算符
格式: 类型 PTR 表达式 例:INC WORD PTR [BX] wx dw 1234h
mov al, byte ptr wx mov ah, byte ptr wx+1
2)THIS操作符
格式: THIS 类型(或属性) 例:FIRST EQU THIS BYTE
SECOND DW 100 DUP (?)
CODE
相关代码:
MOV DX, BLOCK
MOV AX , DX
AND AX, 0F0FH AND DX, 0F0FH
MOV CL,4
SHR DX,CL LEA BX, BUFF
MOV [BX], AL
MOV [BX+1], DL MOV [BX+2], AHL MOV [BX+3], DH
2、分支结构
2、现场保护和入口出口参数传递
现场保护
方案一:在子程序中保护
方案二:在主程序中保护
参数传递 • 寄存器传递 • 变量传递 • 堆栈传递
;这是一个乘10子程序
;使用寄存器AX ;入口:AX,出口:AX proc push bx ;保护现场 pushf
mul10
add ax,ax mov bx,ax add ax,ax add ax,ax add ax,bx
NEXT1: JE NEXT2 MOV JMP AL,1 DONE
;为0时转NEXT2 ;否则将1送入AL
NEXT2:MOV
DONE: MOV
AL,0
MEMD,AL
;将0送入AL
(二)
MOV CMP MOV JL MOV JG MOV
AL,MEMS AL,0 AL,-1 DONE AL,1 DONE AL,0 MEMD,AL
LOOP LOOP1 DONE: MOV …… AH,4CH
4、子程序
Call proc1 ret
实现方法
主程序有调用指令call 子程序有返回指令ret
特点
Call指令与ret缺一不可
现场保护 入口出口参数设置
例4-6:
编写AX*10AX子程序
子程序编写 1、子程序组成 使用说明 a、子程序功能 b、使用寄存器情况 c、入口出口参数 程序体 入口出口参数传递 现场保护 功能程序段
⑵ BUFF
⑶ MEM ⑸ ABC
EQU PORT+58
EQU DS:[BP+20H] EQU AAA
⑷ COUNT EQU CX
等号语句 格式: 符号名 EQU 表达式
例:
NUM=34 MOV CX,NUM …… NUM=34+1
与 EQU 伪指令基本相同,主要区别在于它可 以对同一个名字重复定义。
例4-2
实现
1 x 0 y0 x0 1 x0
≥
实现符号函数程序的流程图
MEMS
DB 8
MEMD
……
DB ?
(一)
MOV CMP JGE MOV JMP
AL,MEMS AL,0 NEXT1 AL,-1 DONE
;AL←MEMS
;x≥0时转NEXT1 ;否则将−1送入AL
DONE:
MOV
3、循环结构
(1) 初始化部分:如设置地址指针、计数器、其他循环参数的 起始值等。 (2) 工作部分:循环所要完成的具体操作。它可以是一个顺序 程序、一个分支程序或另一个循环程序。 (3) 修改部分:如修改地址指针、其他循环参数等。 (4) 循环结束判断部分 (5) 结束处理部分:如存储结果等。可以没有这部分。
MOV AX , SEG BUFF
2)OFFSET
例: MOV BX , OFFSET BUFF MOV DX , BUFF
3)TYPE
对于变量有3种: 1 字节型; 2 字型; 4 双字型; 对于标号有2种:-1 NEAR(段内), -2 FAR(段间)。 例: BUFF DB 20H MOV BX ,TYPE BUFF MOV BX,01
属性 标号有三种属性:段、偏移量和类型
4.1 8086汇编语言的语句
指示性语句格式
[名字] 伪指令 [操作数1,] [操作数2] ;[注释] DATA1 DB 0F8H,60H,3BH;被加数
属性
存储器操作数的属性有三种:段值、段内偏移量
和类型。
4.2 8086汇编中的伪指令
4.2.1 符号定义语句 等值语句 格式:符号名 EQU 表达式 例: ⑴ PORT EQU 1234
…
CYC: MOV AX , BX
4.2.3 段定义语句
1、 段定义语句格式:
段名 SEGMENT [定位类型] [组合类型] [‘类别’]
…… 段名 ENDS
只需要掌握
段名 SEGMENT
……
段名 ENDS