第四章 汇编语言程序设计
汇编语言程序设计
汇编语⾔程序设计第4章汇编语⾔程序设计§4.1 汇编语⾔的模式⼀、汇编语⾔源程序的⼀般模式[Name 模块名][Title 标题][定义宏][定义数据段][定义附加段][定义堆栈段]定义代码段源程序结束中括号括起的部分可以省略,可见在⼀个汇编语⾔源程序中必须要定义代码段,并且必须有源程序结束指令。
⼆、8086汇编语⾔程序的⼀个例⼦Pg90。
§4.2 语句⾏的构成汇编语⾔中的语句⼀般分为两种类型:指令性语句和指⽰性语句。
指令性语句的格式为:[标号:] 助记符 [操作数1[,操作数2]] [;注释]指⽰性语句的格式为:[名称] 助记符 [参数1,参数2,……] [;注释]标号和名称都是编程⼈员根据需要和⼀定的规则任意取的。
也可以认为汇编语⾔的语句⾏是由标记和分隔符(空格)构成。
⼀、标记1.IBM宏汇编的字符集(1)字母(2)数字符(3)特殊字符2.界符⽤于定界⼀个标记的结束或⼀个标记的开始,本⾝具有⼀定的意义。
3.常量出现在汇编语⾔源程序中的固定值称为常量。
(1)数值常量①⼆进制:以字母B结束。
②⼗进制:以字母D或⽆字母结束。
③⼋进制:以字母Q(或O)结束。
④⼗六进制:以字母H结束。
(2)字符常量指⽤单引号或双引号引起的字符或字符串。
4.标识符由程序员⾃⼰建⽴的字符序列(标号或名称)。
⼀个标识符不能超过31个字符,不能以数字开头。
5.保留字汇编语⾔中具有特殊意义的字符序列。
6.注释⼀⾏中分号以后的部分。
⽤于对⼀段或⼀⾏程序进⾏说明,便于阅读和理解。
⼆、符号具有⼀定意义的字符序列。
1.寄存器名2.变量段属性、偏移属性、类型属性3.标号段属性、偏移属性、类型属性4.常数5.其它三、表达式由操作数和运算符组合⽽成的序列。
1.操作数(1)⽴即数(2)寄存器操作数(3)存储器操作数2.运算符(1)算术运算符+、-、*、/、MOD(求余)(2)逻辑运算符AND、OR、NOT、XOR(3)关系运算符EQ、NE、LT、LE、GT、GE结果为“假”时,返回0,结果为“真”时,返回⼆进制全1。
第四章 汇编语言程序设计
一、算术运算符
包括:+,-,*,/(取商),MOD(取余),SHL,SHR 特点:①运算对象及结果均为整数 ②地址只能加减 例: DA1 DA2 MOV MOV MOV MOV DB 1,2,3,4 DB 20 AX,30*5 汇编时 AL,31MOD5 AL,31/5 AL,DA2-DA1
MOV MOV MOV MOV
如:加法:1001、1D、2B……
特点:计算机能够直接识别,执行速度快;
但不方便记忆和编程
2、汇编语言(Assembly Language) 用助记符来表示指令,如:加法:ADD…… 特点:机器不能识别,需翻译;但仍然面向硬件, 执行速度较快;多用于编制系统程序、实时控制和通 信程序。 3、高级语言(High-level Language) 用数学语言和自然语言编程; 如:加法:+,输出:Printf… 特点:编程方便简单,无需了解机器硬件;但机器 不能识别,需要庞大的翻译系统,速度较慢。
类型 返回值 1 2 4 类型 返回值 -1 [FFH] -2 [FEH] DB DW DD
变量
标号
NEAR FAR
数值返回运算符(续)
LENGTH:
•对于一般变量,返回1; •对于DUP定义的变量,返回单元数(直接返回第一
个DUP前的N值); 说明:DUP为复制操作符,格式:N DUP(表达式); N表示复制次数,表达式为复制内容 例:2 DUP(1,2) 等价于 1,2,1,2
则:COUNT的值为5
COUNT表示:DA1,DA2占的字节总数(长度之和) 七、优先级(P136 表4-3)
4.3 伪指令语句
在汇编时进行处理,主要完成变量定义,段定义,
段分配,指示程序开始和结束等功能。
第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)
004第四章汇编语言程序设计
逻辑运算符 关系运算符 分析运算符
属性运算符
其
它
+、-、*、/、MOD
AND、OR、NOT、XOR EQ、NE、LT(<)、GT(>)、LE(<=)、GE(>=) SEG、OFFSET、TYPE、LENGTH、SIZE PTR、THIS、SHORT LOW、HIGH
1.算术运算符
例(1)ARRAY DW 1*2+3-4,56H MOV AX,ARRAY ;汇编后为:MOV AX,1
ASSUME:用于明确段与段寄存器的关系
ASSUME 段寄存器名:段名[,段寄存器名:段名…]
例:ASSUME DS:DSEG,CS:CSEG,ES:ESEG,SS:SESG 例:ASSUME CS:CODE,DS:DATA,ES:DATA 说明: 1. 该伪指令出现在代码段中; 2. 本伪指令只是指示各逻辑段使用段寄存器的情况,并没有
…… MOV BL,AREAB ;BL = 34H
3.段定义伪指令
段名 SEGMENT [定位类型] [组合类型] [‘类别’ …
段名 ENDS
定位类型:说明段的起始地址应有怎样的边界值:
BYTE:×××× ×××× ×××× ××××B, 即段可以从任何地址开始;
WORD:×××× ×××× ×××× ×××0B, 即段的起始地址必须为偶地址;
执行的起始点,一个程序只有一个起始点 所有的可执行性语句必须位于某一个代码段内,说明
性语句可根据需要位于任一段内 通常,程序还需要一个堆栈段
源程序由语句序列构成
汇编语言语句行
标号/名字: 操作码 操作数 ;注释
汇编语言源程序的格式 源程序由若干各段组成。每段以 SEGMENT开始,以ENDS结束,整个源 程序以END结束。
第4章 汇编 语言程序设计
汇编时,遇到“ 就停止“翻译” 因此, 汇编时,遇到“;” 就停止“翻译”。因此,注释字 段不会产生机器代码。 段不会产生机器代码。 4.1.3 伪指令 在汇编语言源程序中应有向汇编程序发出的指示信息, 在汇编语言源程序中应有向汇编程序发出的指示信息, 向汇编程序发出的指示信息 告诉它如何完成汇编工作,这是通过伪指令来实现。 伪指令来实现 告诉它如何完成汇编工作,这是通过伪指令来实现。 伪指令不属于指令系统中的汇编语言指令,它是程序员 伪指令不属于指令系统中的汇编语言指令, 发给汇编程序的命令,也称为汇编程序控制命令。 发给汇编程序的命令,也称为汇编程序控制命令。 命令 汇编程序控制命令 只有在汇编前的源程序中才有伪指令。 “伪”体现在 只有在汇编前的源程序中才有伪指令。 汇编后,伪指令没有相应的机器代码产生。 汇编后,伪指令没有相应的机器代码产生。 没有相应的机器代码产生 伪指令具有控制汇编程序的输入/输出、 伪指令具有控制汇编程序的输入/输出、定义数据和符 号、条件汇编、分配存储空间等功能。 条件汇编、分配存储空间等功能。
6
经过十几年努力,C51已成为单片机的实用高级编程语言。 经过十几年努力,C51已成为单片机的实用高级编程语言。 已成为单片机的实用高级编程语言 尽管目前已有不少设计人员使用C51来进行程序开发, 尽管目前已有不少设计人员使用C51来进行程序开发,但在 C51来进行程序开发 对程序的空间和时间要求较高的场合,汇编语言仍必不可少 程序的空间和时间要求较高的场合, 空间 要求较高的场合 。 在这种场合下,可使用C语言和汇编语言混合编程。 在这种场合下,可使用C语言和汇编语言混合编程。在很多 需要直接控制硬件且对实时性要求较高的场合,则更是非用 需要直接控制硬件且对实时性要求较高的场合, 汇编语言不可。 汇编语言不可。 掌握汇编语言并能进行程序设计, 掌握汇编语言并能进行程序设计,是学习和掌握单片机程 序设计的基本功之一。 序设计的基本功之一。 基本功之一 4.1.2 汇编语言语句和格式
第四章-汇编语言程序的设计
第四章汇编语言程序设计本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。
在介绍之前,我们还是来学习汇编语言的一些基础知识)4.1 汇编语言程序设计概述1、计算机的汇编语言以助记符表示的指令,每一条指令就是汇编语言的一条语句。
(汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。
汇编语言的语句有严格的格式要求)2、汇编语言的语句格式MCS-51汇编语言的语句格式表示如下:[<标号>]: <操作码> [<操作数>]; [<注释>]标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。
①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。
)操作码:规定语句执行的操作容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。
操作数:给指令的操作提供数据或地址。
注释:是对语句或程序段的解释说明。
(在单片机中,这四个部分怎么加以区分呢?使用分界符)分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。
冒号(:)用于标号之后空格()用于操作码和操作数之间逗号(,)用于操作数之间,分割两个以上的操作数分号(;)用于注释之前。
第4章-汇编语言程序设计
*
目标文件中的段与目标存储器之间的关系:
目标文件
目标存储器
.bss
.data
.text
RAM
E2PROM
ROM
第4章 汇编语言程序设计
*
3. 段定义伪指令
汇编器对段的处理是通过段伪指令来区别各个段的,并将段名相同的语句汇编在一起。 汇编器有5条伪指令可识别汇编语言程序的各个部分:
;初始化数据段 ;3组数据放入.data段 ;在.bss段保留10个单元 ;0123h放入.data段 ;初始化文本段 ;1字指令 ;2字指令 ;2字指令
;初始化数据段 ;3组数据放入.data段
第4章 汇编语言程序设计
*
汇编语言源程序:
链接器能够读/写所有类型的COFF文件,默认时链接器生成的是COFF2文件,采用-vn链接选项可以选择不同类型的COFF文件。
第4章 汇编语言程序设计
*
4.2.1分段结构 所谓“段”就是在存储器映像中占据连续空间的一段独立的代码或数据。每个目标文件都分成若干段。
COFF目标文件包含以下三个默认的段: .text 段:通常内含可执行代码; .data段:通常内含已初始化数据; .bss段:是为没有初始化的数据保留空间的。
第4章 汇编语言程序设计
*
C源文件
C编译器
汇编 源文件
汇编器
汇编 源文件
COFF 目标文件
链接器
可执行的 COFF文件
宏源文件
存档器
宏库
存档器
目标 文件库
建库工具
运行时 支持库
EPROM 编程器
交叉引用 列表器
调试工具
绝对地址 列表器
04_汇编语言程序设计完整
第4章 汇编语言程序设计 类型属性(TYPE):指变量占用存储单元的字节数。若占 用一个字节,称为字节变量,其类型为BYTE:若占用两个字 节,称为字变量,其类型为WORD;若占用4个字节,称为双 字变量,其类型为DWORD。
第4章 汇编语言程序设计
2) 伪指令语句
伪指令语句也叫指示性语句,它只是为汇编程序在翻译汇 编语言源程序时提供有关信息,并不翻译成机器代码,所以也 不占用执行时间。 伪指令的格式为:
【符号名】 伪指令定义符 【参数表】 【;注释】
实际上,汇编语言源程序中还可出现宏指令语句。宏指令
语句就是由若干条指令语句形成的语句体。一条宏指令语句的
果程序中有堆栈段,也需要把段地址装入SS中。但是,代码段
CS不需要这样做,这一操作是在程序初始化时完成的。
第4章 汇编语言程序设计 为了对段定义作进一步地控制,SEGMENT伪操作添加有类 型及属性的说明,其格式如下:
<段名> SEGMENT [定位类型][组合类型][使用类型]
[类别] … <段名> ENDS 在一般情况下,这些说明可以不用。但是,如果需要用连 接程序把本程序与其他程序模块相连接时,就需要使用这些说 明。
ASSEMBLER)两种。我们采用QASM2.7版来说明汇编程序所提供的
伪操作和操作符,操作流程如图所示。
第4章 汇编语言程序设计
出错 编辑程序 EDLINE WPS WORD EDIT 文件 EXMP.ASM 汇编程序 ASM MASM TASM
文件 EXMP.OBJ (EXMP.LST) (EXMP.CRF)
串、?、用逗号隔开的上述各项或DUP(表达式)。
第四章 汇编语言程序设计
(1)OFFSET运算符 格式:OFFSET 变量或标号 功能:分离出其后变量或标号的偏移地址。 例如:MOV BX,OFFSET BUF (2)SEG 运算符 格式:SEG 变量或标号 功能:分离出其后变量或标号所在段的段首址。 例如:MOV AX,SEG NEXT MOV DS,AX
(3)TYPE运算符 格式:TYPE 变量或标号 功能:分离出其后变量或标号的类型。如果是变量, 将返回该变量的类型对应字节数;如果是标号,则返 回代表标号类型的数值。它们之间的关系见下表所示
标号:指令助记符 操作数,操作数
;注释
•
伪指令语句
– – – 在汇编时不产生目标代码,只为汇编程序提供汇编时 所需要信息 完成数据定义、存储区分配、段定义、段分配、指示 程序结束等
名字 伪指令指示符 操作数,操作数
;注释
第四章 汇编语言程序设计
• 数据项:常数、变量、标号
变量:存放在存储单元中的值。 ⅰ)段属性(SEGMENT):变量所在的逻辑段基址 ⅱ)段的偏移属性(offset):表示变量在逻辑段中离段起点 的字节数。变量的段属性和偏移属性构成了变量的逻辑地址 ⅲ) 类型属性(type):表示变量占用存储单元的字节数 DB( 1),DW( 2),DD (4),DQ(8),DT(10) 标号 ⅰ)段值(SEGMENT):标号所在的段地址 ⅱ)段内偏移地址(offset):标号地址与所在段的段首址之间 的偏移地址字节数 ⅲ)类型(TYPE):在转移指令中标号可转移的距离
第四章 汇编语言程序设计
2、段分配伪指令ASSUME 格式:ASSUME 段寄存器:段名 [,段寄存器: 段名] 功能:建立段寄存器与段之间的对应关系。该伪 指令一般出现在代码段中。
3、设置段地址(把段地址装入相应段寄存器) DS、ES、SS段地址装入用MOV指令完成,CS 段不需要,代码段的这一操作在程序初始化时完 成。
第04章 汇编语言程序设计 39页 0.2M PPT版
MOV AL,10100000B OR 00000101B ;(AL)←10100101B
例4-4 关系运算符的应用
MOV AX,5 EQ 101B ;(AX)←0FFFFH
MOV BH,10H GT 16 ;(BH)←0
例4-5 数值返回运算符的应用
K1 DB 30H,31H,32H
K2 DW 4041H,4043H
(4)STACK
(5)MEMORY
(6)AT表达式
4. 类别名
返回
4.2.4 段寻址伪指令
格式:
ASSUME 段寄存器名:段名,段寄存器名:段名,……
例4-15 求从NUM开始的12个无符号字节数的和,结果放在SUM字单元中。
DATA SEGMENT NUM DB 95H,83H,36H,2DH DB 33H,22H,1AH,34H DB 62H,45H,75H,49H SUM DW ?
例4-13
STR1 DB ‘COMPUTER’ ;定义一个字符串,字符串的首地址为STR1 STR2 DW ‘AA’,‘BC’,‘DE’ ;给两个字符组成的字符串分配两个字节存储单元 DATA DW ?,?,? ;为DATA预留6个存储单元
例4-14
DATA1 DB 20 DUP(?) ;为变量DATA1分配20个字节的空间,初值为任意值 DATA2 DW ? ;为变量DATA2分配2个字节的空间,初值为任意值 DATA3 DB 20 DUP(30H) ;为变量DATA3分配20个字节的空间,初值均为30H
K3 DW 20H DUP(0)
K4 DD 50515253H
MOV AL,TYPE K1 ;等效于MOV AL,1
MOV AH,TYPE K2 ;等效于MOV AH,2
第4章 汇编语言程序设计
例: 三字节无符号数相加,其中被加数在内部RAM 的50H、51H和52H 单元中;加数在内部RAM的53H、 54H和55H单元中;要求把相加之和存放在50H、 51H和52H单元中,进位存放在位寻址区的00H位中。
内部RAM
50H 51H 52H
高字节 低字节
53H 54H 55H
R1→55H
结 束
常用程序结构:
顺序程序、分支程序、循环程序。
4-3
顺序程序
顺序程序又称简单程序,程序走向只有一条路径。 例:双字节求补程序(设数据在R4R5中): 开 始 CLR C MOV A,R5 ;取低字节 处 理 CPL A ADD A,#01H ;低字节变补 处 理 MOV R5,A MOV A, R4 ;取高字节 处 理 CPL A ADDC A,#00H ;高字节变补 结 束 MOV R4,A
片内 RAM 42H 0 十 41H 0 个 40H 十 个
4 -- 4
分支程序(参见书P49-57)
分支程序就是在程序执行过程中要判 断某些条件,当条件成立后程序转移到不 同的功能处运行。在MCS-51单片机中条件 转移指令都可以用在分支程序中。 (复习、参见书P38---39) (1)测试条件符合转移,如: JZ、JNB …等
汇编的主要任务:
1)确定程序中每条汇编语言指令的指令机器码。 2)确定每条指令在存储器中的存放地址。 3)提供错误信息。 4)提供目标执行文件(*.OBJ/*.HEX)和 列表文件(*.LST)。
一、汇编语言指令类型:
1. 机器指令: 指令系统中的全部指令,每条指令有对应的机器代码。 2. 伪指令: 汇编控制指令,仅提供汇编信息,没有指令代码。
在源程序中只能有一条END指令
第4章汇编语言程序设计
MOV AL ,BYTE PTR AARRAY
汇编语言程序设计基础
4.ASSUME伪指
令
ASSUME 伪 指 令 告 诉 汇 编 程 序 (MASM.EXE)在对源程序汇编时,源程序 中的段名与哪个段寄存器建立关系。这种关 系只是一种承诺关系,汇编程序对源程序汇 编时,承认这种关系,但段寄存器的值并未 确定,用户必须在代码段一开始用MOV指令 对DS、ES、SS初始化。
汇编语言程序设计基础
汇编语言源程序的完整结构
STACK SEGMENT STACK DB 256 DUP(?)
TOP LABEL WORD STACK ENDS DATA1 SEGMENT
用DB、DW等伪指令定义的段的实体 DATA1 ENDS
……
……
汇编语言程序设计基础
DATA2 SEGMENT
SS:0000 H
SS:00FF H 0100
H
……
256B堆栈
区 TOP具有该单
TOP
元的偏移地址 属性,但不占
用该单元。
汇编语言程序设计基础
由于堆栈指针SP初始化后要指向栈底+1 单元,所以上述程序段中有:
……
MOV AX , STACK
MOV SS , AX
此段程序完成对
MOV SP , OFFSET TOP SS、SP的初始
即它们的边界地址(20位地址)应分别 可以被256、16、2、1除尽,分别称为以 页、节、字、字节为边界。
汇编语言程序设计基础
在实际应用中,每个段的定位类型常 选PARA(节)型。因为若选PAGE(页) 型,将会使相邻的段间有较大空间的浪 费;而选WORD或BYTE型,又很难做 到使一个段的偏移地址从0000H开始。
第4章(汇编语言程序设计)
本章要点
1. 掌握汇编语言语句格式
2. 掌握段定义源程序格式
3. 了解指令与伪指令的区别,掌握常用伪指令 的使用。
4. 掌握常量表达式、变量的定义及应用;变量、 标号的属性。 5. 掌握基本DOS功能的调用
4.1 8086汇编语言概述
汇编语言是利用指令的助记符、符号地址、 标号来编写的语言,它是机器语言的符号 表示,是低级语言。 汇编语言是面向机器的,是和CPU密切相 关的。 汇编语言编写的程序效率高,节省内存, 运算速度快。
伪指令语句主要完成变量定义、存储 器分配、指示程序开始和结束、段定义、 段分配等。 伪指令语句没有对应的机器代码,它 是由汇编程序(MASM)对源程序汇编期 间进行处理的。
4.2.1 符号定义语句
1.EQU 格式: 符号名 2.= EQU 表达式 功能: 定义符号名
格式: 符号名 = 表达式
功能:与EQU相同
标号、变量与标识符
• 标号是反映指令位置(逻辑地址)的标识符, 后跟一个冒号分隔。 • 变量是反映伪指令位置(逻辑地址)和属性 的标识符,后跟空格或制表符分隔,没有冒 号。 • 标识符一般最多由31个字母、数字及规定的 特殊符号(如 _、$、?、@)组成,不能以 数字开头。默认情况下,汇编程序不区别标 识符中的字母大小写。 • 一个程序中,每个标识符的定义是唯 一的,还不能是汇编语言采用的保留字。
语句格式
• ⑴ 指令性语句——由指令构成的语句,它通常对应 一条机器指令,出现在程序的代码段中: • [标号:] 指令助记符 [操作数1][,操作数2][;注释]
操作码
⑵ 说明性语句——由伪指令构成的语句,它通常指示 汇编程序如何汇编源程序:
[名字] 伪指令助记符 参数,参数,… [;注释]
第4章汇编语言程序设计
2000H
MOV
R0,#10
MOV
R1,#30H
START: MOV A,@R1 ;取数
JB ACC.7,NEG
;若为负数,转NEG
JZ ZER0 ;若为零,转ZER0
ADD
A,#02H ;若为正数,求X+2
AJMP SAVE ;转到SAVE,保存数据
ZER0: MOV A,# 64H ;数据为零,Y=100
2.汇编语言的语句格式 汇编语言源程序是由汇编语句(即指令)组成
的。汇编语言一般由四部分组成。 其典型的汇编语句格式如下:
标号: 操作码 操作数 ;注释 START:MOV A,30H ;A←(30H)
即将30H这个存储单元给累加器A
返回本节
4.1.3 伪指令
1.ORG:汇编起始地址
用来说明以下程序段在存储器中存放的起始地址。此后的源程 序或数据块就依次连续存放在以后的地址内, 直到遇到另一 个ORG指令为止。
开始 初始化
修改循环参数
循环结束?
Y
N 循环体
结束部分
结束 (a)当型循环结构
开始 初始化 循环体 修改循环参数
N
循环结束?
Y 结束部分
结束
(b)直到型循环结构
图4-6 循环结构程序流程图
外循环 中循环 内循环
(a)嵌套正确
外循环 内循环 内循环
(b)嵌套正确
外循环 内循环
(c)交叉不正确
图4-7 多重循环示意图
返回本节
4.2 汇编语言程序设计
4.2.1 汇编语方程序设计步骤 4.2.2 顺序程序 4.2.3 分支程序 4.2.4 循环程序 4.2.5 子程序 4.2.6 位操作程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DB 100 DUP(0)
STACK ENDS
MOV AH,2 ;显示高位数字 CODE SEGMENT 'CODE' ;定义代码段 ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV CX,1 CYCLE: ADD SUM,CX INC CX ;加上当前数 ;产生下一个新数 CODE ENDS END START MOV AH,4CH INT 21H ;返回操作系统 MOV DL,BH INT 21H
第四章 汇编语言程序设计
基本概念: ①汇编语言:用指令的助记符、符号地址、标号 等来编写的语言。 ②汇编语言源程序:用汇编语言编写的程序(*.asm) ③汇编程序:将汇编语言源程序翻译成目标目标程 有两种语句格式: 序(代码),这个翻译过程称为汇编,翻译软件就 ⑴指令性语句:汇编时翻译成目标代码(机器码), 叫汇编程序。 占代码段空间。 ⑵指示性语句(伪指令):汇编时,不产生目标代 用户 生成 通过 汇编 生成 通过 连接 生成 码,只是为汇编程序提供信息,不占代码段空间。 *.asm *.obj *.EXE
DT:用来定义10个字节,表示每个操作数10个字节
例4-21 操作数是常数或表达式 DA1 DB 10H,20H DA2 DW 1122H,34H DA3 DD 5*10H,1234H
DA1 DA2
10 20 22 11 34 00
DA3
1122H 0034H
50 00 00 00 34 12 00 00
例4-5 IN AL,PORT AND DX,PORT AND 0FEH OUT DX,AX 前一个AND是指令助记符,而后一个AND是 逻辑运算符。
三、关系运算符 有:EQ(相等)、NE(不等)、LT (小于)、GT(大于),LE(小于或等于)、 GE(大于或等于)。 关系运算符的两个操作数必须是数据, 例4-6 MOV AX,10H GT 16 或是同一段内的两个存储单元的地址。进行 MOV BL,6 EQ 0110B 关系运算的比较操作后,结果是一个数值, MOV CX, 12H GE 12 若结果为真,输出全1,即FFH(8位)或 由于表达式12H GE 12 为真所以汇编成: 由于表达式6 EQ 0110B为真所以汇编成: FFFFH(16位)。若结果为假,输出全0。 由于表达式10H GT CX,0FFFFH 16为假所以汇编成: MOV BL,0FFH MOV CX,1 AX,0 注意: MOV BL,1 × ×
五、修改属性运算符 修改属性运算符也经常称作综合运算符 有:段操作符、PTR、THIS、HIGH、LOW 、SHORT 6种,可以在程序运行过程中,通 过修改属性运算符来修改变量或标号的属性, 包含段属性、偏移地址属性、类型属性等。 1.段操作符 格式: 段前缀:变量或地址表达式 段前缀有段寄存器CS、DS,ES,SS后跟冒号 例4-12 ‘:’,用来表示某个变量或地址被修改到哪个 MOV AX,[BX] ;DS:BX→AX 段寄存器提供的段地址。 MOV AX,ES:[BX] ;ES:BX→AX
四、数值返回运算符 数值返回运算符也经常称作分析运算符 有:OFFSET、SEG、TYPE、LENGTH、 SIZE 5种,它们加在变量或标号前,返回运 算对象的某个参数值,例如偏移地址值、段 地址值、类型属性、变量包含的单元数等。
1.OFFSET 格式:OFFSET 变量或标号 OFFSET 返回标号或变量的偏移地址值。
编辑 程序 程序
汇编过程
DATA SEGMENT
;定义数据段
SUM DW ?
DATA ENDS
;变量SUM用来保存结果
MOV AX,SUM AAM ;将该值转化为BCD数字 ;转化为ASCII码 ;数字存于BX中
STACK SEGMENT STACK ;定义堆栈段
ADD AX,3030H MOV BX,AX
MOV DL,BL
INT 21H
;显示低位数字
CMP CX,11
JLE CYCLE
;比较(CX)和12看是否可以结
束 ;未结束转CYCLE继续
4-1 汇编语言的标记
一个完整的汇编语言的语句由下列几部分组成: 标号和变量、指令助记符、界符、常数和注释,所 有这些都称为标记。
一、标号和变量 表示指令性语句的符号地址或表示一个数据单 元的符号地址。 例、
4-2 汇编语言中的表达式
表达式由运算对象和运算符组成,在汇编时由 汇编程序对它进行运算,运算结果作为一个语句中 的操作数来使用。 ※运算对象:常数、标号或变量
※运算符:
①算术运算符 ②逻辑运算符 ③关系运算符 ④数值返回运算符 ⑤修改属性运算符 ⑥其它运算符
一、算术运算符 有:+、-、*、/、MOD(模,即取除法运算结 果之余数)、SHL(左移,左移1位相当于乘2)、 SHR(右移,右移1位相当于除以2)。 例4-2 数组ARRAY的定义如下: ARRAY DB 1,2,3,4,5,6,7,8 TRY DB 20 两变量偏移地址之差 指令为: MOV AX,30*5 MOV CX,(TRY-ARRAY);数组长度→CX 汇编时,计算表达式形成指令为: MOV AX,150 MOV CX,8
2.PTR 格式: 类型/距离:PTR 变量或标号
功能:是将PTR左边的类型属性赋给右边的 变量或标号。这样可以保证运算时操作数类 型的匹配,常与类型BYTE、WORD、 DWORD、FAR、NEAR等连用。
JMP FARN1 DBLO;修改标号的距离属性 PTR 12H,34H 例4-13 JMP NEAR PTR LO N2 DW 1122H,3344H LO: MOV AX,WORD PTR N1 MOV BL,BYTE PTR N2
一、数据定义语句
A1 DB 1,2,3
格式1:变量名 助记符 操作数,操作数┅ 格式2:变量名 助记符 n DUP(操作数,操作数┅)
功能:将操作数存入变量名指定的存储单元 中,或者只分配存储空间不存入数据。 A3 DB 5 DUP(1,2) 助记符——主要有: 操作数——操作数可以是常数、字符串、变 变量名——它用符号表示,可以省略,作用 DB:用来定义字节,表示每个操作数占一个字节 量、标号、表达式等,多个操作数之间必须 与指令语句中的标号相同,但后面不跟冒号 DW:用来定义字,表示每个操作数占一个字 用逗号‘,’隔开。 ‘:’。汇编程序汇编时将此变量的助记符后 DD:用来定义双字,表示每个操作数占两个字 的第一个字节的偏移地址作为它的符号地址。 DQ:用来定义四个字,表示每个操作数四个字
4-3 伪指令语句
伪指令语句没有对应的机器代码,并不 像指令语句那样由CPU来执行,它是MASM 汇编程序对源程序汇编期间进行处理的。主 要完成变量定义、存储器分配、指示程序开 始和结束、段定义、段分配等。伪指令ቤተ መጻሕፍቲ ባይዱ以 下几种类型:
●程序开始结束语句ORG、END、NAME ●过程定义语句PROC┅ENDP ●标号赋值语句EQU、= ●段分配语句ASSUME ●段定义语句SEGMENT┅ENDS ●数据定义语句DB、DW、DD等
汇编成:
4.LENGTH 格式:LENGTH 变量
★当变量中使用DUP时,LENGTH返回此变 例4-10 M1 DW 100 DUP(?) 量所包含的单元数,对其它变量则返回1。 M2 DB 1,2,3,4
M3 DW 1234H,12H,3456H MOV CX,LENGTH M1 MOV BL,LENGTH M2 MOV DL,LENGTH M3 汇编成: 汇编成: MOV MOV MOV BL,1 BL,4 DL,1 CX,100 DL,3 √ × √ ×
5.SIZE 格式:SIZE 变量 ★SIZE加在变量前,返回该变量包含的总字 例4-10 M1 DW 100 DUP(?) 节数,注意不能简单去数有多少个字节,而 M2 DB 1,2,3,4 是利用公式SIZE=LENGTH×TYPE来计算。 M3 DW 1234H,12H,3456H MOV CX,SIZE M1 MOV BL,SIZE M2 MOV DL,SIZE M3 汇编成: 汇编成: MOV BL,1 MOV DL,2 CX,200 √ MOV BL,4 × DL,6
00000050H
00001234H
例4-22 操作数是字符串 FIRST DB ‘HELLO’ SECOND DW ‘OK’ THIRD DB ‘OK’
FIRST
注意:用DW定义字符 串时,只允许包含两个 字符,多于两个字符时, SECOND 只能用DB来定义。
THIRD
48(‘ H’ ) 45(‘ E’ ) 4C(‘ L’ ) 4C(‘ L’ ) 4F(‘ O’ ) 4B(‘ K’ ) 4F(‘ O’ ) 4F(‘ O’ ) 4B(‘ K’ )
汇编成:MOV AL,0BL,0 汇编成:MOV 汇编成:MOV AH,0FFH 汇编成:MOV CH,0FFH 例4-4 MOV MOV MOV MOV AL,NOT 0FFH BL,8CH AND 73H AH,8CH OR 73H CH,8CH XOR 73H
★逻辑运算符与8086指令系统中的指令助记 符AND、OR、XOR、NOT符号完全相同, 但两者是不会混淆的。作为MASM的运算符 是在汇编过程中进行计算的,而指令助记符 是在程序执行时进行运算的。
3.TYPE 格式:TYPE 变量或标号 ①TYPE加在变量前,返回变量的类型属性。 ②TYPE加在标号前,返回标号的距离属性。
类型 DB 类型 DW DB DD DW DQ DD DT DQ NEAR DT FAR NEAR FAR 返回 返回 1 2 1 4 2 8 4 10 8 FFH或FFFFH(-1) 10 FEH或FFFEH(-2) FFH或FFFFH(-1) FEH或FFFEH(-2)