第4章 汇编语言程序设计
汇编语言程序设计

汇编语⾔程序设计第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。
汇编语言程序设计

第4章 汇编语言程序设计
例4.4 显示两位压缩BCD码值(00~99) ,要求不显示前导0。 本例一方面要排除前导0的情况,另一方面 对于全0情况又必须显示一个0,所以形 成了两个双分支结构的程序。
第4章 汇编语言程序设计 DATA SEGMENT BCD DB 04H ; 给出一个BCD码数据 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA BEGIN: MOV AX, DATA MOV DS, AX MOV DL,BCD ;取BCD码 TEST DL,0FFH ;如果这个BCD码是0,则显示为0 JZ ZERO TEST DL,0F0H ;如果这个BCD码高位是0,不显示 JZ ONE MOV CL,4 ;BCD码高位右移为低位 SHR DL,CL OR DL,30H ;转换为ASCII码 MOV AH,2 ;显示 INT 21H
第4章 汇编语言程序设计 ADC MOV MOV MUL ADD DX,0 W+4,DX AX,A B+2 W+2,AX ;部分积2的高16位与进位相加 ;结果保存到从W+4开始的内存单元 ;取被乘数的低16位 ;与乘数的高16位相乘,得到部分积3 ;部分积3的低16位与W+2开始的内存单元相加 ;结果保存在从W+2开始的内存单元 ;部分积3的高16位与W+4开始的内存单元及 ;进位相加,结果保存在从W+4开始的内存单元 ;把进位值保存在从W+6开始的内存单元 ;取被乘数的高16位 ;与乘数的高16位相乘,得到部分积4 ;部分积4的低16位与W+4开始的内存单元相加 ;结果保存在从W+4开始的内存单元 ;部分积4的高16位与W+6开始的内存单元及 ;进位相加,结果保存在从W+6开始的内存单元
第四章 汇编语言程序设计

一、算术运算符
包括:+,-,*,/(取商),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)
第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章 单片机汇编语言程序设计

RO 20HBCMDH BCDL
SWAP A ORL A, #30H MOV 21H, A SJMP $
;BCDH数送A的低4位 21 0011
;完成转换 @R0 ;存数
H22HB0C001D0HBCD 01000L
END
回目录 上页 下页
方法1小结:
以上程序用了8条指令,15个内存字节,执行时间为9个 机器周期。
21 0011BCDH H22H0011BCDL
回目录 上页 下页
程序:
ORG 1000H
MOV R0, #22H ;R0 22H MOV @R0,#0 ; 22H 0 MOV A, 20H ;两个BCD数送A
A
B00C01D01H0BB0CC0D0DHL
XCHD A, @R0 ;BCDL数送22H ORL 22H, #30H ;完成转换
例4-7:设30H单元存放的是一元二次方程ax2+bx+c = 0
根的判别式△= b2 – 4ac的值。
试根据30H单元的值,编写程序,
判断方程根的三种情况。
在31H中存放“0”代表无实根,
存放“1”代表有相同的实根,
存放“2”代表两个不同的实根。
解:△为有符号数,有三种情况,这是一多重分支程序
即小于零,等于零、大于零。
R3
R2
回目录 上页 下页
程序:
ORG 1000H CLR C CLR A SUBB A, R0 MOV R2, A CLR A
SUBB A, R1 MOV R3 , A SJMP $ END
;CY 0
;A 0
;低字节求补
;送R2
;A清零 R3 0000
;高字节求补 0000
单片机第4章汇编语言程序设计

4.2 伪指令
伪指令是在机器汇编中告诉汇编程序 如何汇编、对汇编过程进行控制的命令。 伪指令与汇编语言指令不同,只在源程序 中出现,不产生任何机器代码,在程序的 运行过程中不起作用,故称为“伪指令”。
处理 判断 连接
2.绘制程序流程图 简单的问题可由文字说明, 当问题复杂时,将文字说明的步骤以图形符号表示, 称流程图。
3.编写源程序 用汇编语言把流程图所表明的 步骤描述出来,实现流程图中每一框内的要求,从 而编制出一个有序的指令流,即汇编语言源程序。
4.汇编、调试 汇编语言是用指令助记符代替机 器码的编程语言,所编写的程序是不能在计算机上 直接执行的,因此利用它所编写的汇编语言程序必 须转换为单片机能执行的机器码形式的目标程序才 能运行,我们把这一过程称为汇编,进行汇编的程 序称为汇编程序。
4. 定义字伪指令DW
[标号:] DW 16位字数据表
该指令的功能与DB相似, 区别仅在于从指定地
址开始存放的是指令中的16位数据, 而不是字节串。
每个16位数据要占两个存储单元, 高8 位先存(低位
地址), 低 8 位后存(高位地址)。
1403H 3CH
ORG 1400H DATA1:DW 324AH,3CH
散转程序是分支程序的一种, 它可根据运算结果或输入数 据将程序转入不同的分支。MCS - 51 指令系统中有一条跳转指 令JMP@A+DPTR,用它可以很容易地实现散转功能。该指令 把累加器的8位无符号数与16位数据指针的内容相加, 并把相加 的结果装入程序计数器PC,控制程序转向目标地址去执行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
b)取段基址算符SEG
格式:SEG 变量或标号 例:MOV AX,SEG BUF;将BUF所在段的 段基址送入寄存器AX。
c)取类型算符TYPE
格式:TYPE 变量或标号 该算符返回的结果为一数值。
d)取变量单元数算符LENGTH
格式:LENGTH 变量 如果一个变量已用重复操作符 DUP 说明其变 量的个数,则利用 LENGTH 算符可以得到这 个变量的个数。 如果未用DUP说明,则得到结果总为1。
e)取变量字节数算符 SIZE
格式:SIZE 变量 如果一个变量已用重复操作符 DUP 说明其变 量的个数,则利用 SIZE 算符可以得到这个变 量的字节总数。 如果未用DUP说明,则得到的结果和TYPE算 符所得结果相同。
⑤合成运算符
可对变量、标号或存储器操作数的类型属性 进行修改。 包括: 类型设置运算符PTR 定义类型算符THIS
①算术运算符
包括:+ ( 加 ) 、- ( 减 ) 、× ( 乘 ) 、/ ( 除 ) 、 MOD(取模)等。 算术运算符可用于数值表达式,运算结果是 一个数值。 在地址表达式中,只能使用‚+‛、‚-‛ 运算符。 例如:MOV AL,10 MOD 4 ;10 MOD 4=2, 故(AL)=2
汇编:机器只能识别机器指令,所以需要将符号指令 翻译成机器指令,翻译的过程称作汇编。 汇编程序:完成汇编任务的程序。
4.1 汇编语言概述(续)
汇编语言源程序:用符号指令书写的程序。
1E 2BC0 50 B83412 8ED8 PUSH DS SUB AX,AX PUSH AX MOV AX,1234 MOV DS,AX
2.数据定义伪指令
数据定义伪指令用来定义一个变量,为变量 分配存储空间,赋初值等。 格式:[变量名] 伪指令 表达式[,表达式] 变量名字段为可选项,可有可无。 表达式可以不止一个,但相互之间应以逗号 分开。
伪指令
① ② ③ ④ ⑤
用DB定义的变量类型为字节(BYTE); 用DW定义的变量类型为字(WORD); 用DD定义的变量类型为双字(DWORD); 用DQ定义的变量类型为四字(QWORD); 用 DT 定义的变量类型为 10 个字节 (TBYTE) 。
2)助记符和定义符
指令语句中的助记符,规定了该指令语句的 操作。例如ADD、XOR等。 伪指令语句中的定义符对应于 8086 宏汇编中 提供的伪操作功能。
3)操作数
根据不同的指令,可能是单操作数或双操作数,也 可能不带操作数。 伪指令语句中的操作数可以是一个或多个,操作数 之间用逗号隔开。 操作数可以是: 常量 变量 标号 寄存器 表达式
第4章 汇编语言程序设计
本章内容: 汇编语言概述 汇编语言源程序格式 汇编语言程序设计 系统功能调用
4.1 汇编语言概述
机器指令:用二进制编码的指令 如:1000 1001 1101 1000
机器语言编写程序烦 琐,难记忆,易出错。
符号指令:由助记符、符号组成,与机器指令一一对应 1000 1001 1101 1000 MOV AX,BX
SA_BUF LA_BUF
’H’ ‘E’ ‘L’ ‘L’ ‘O’
BUF1的偏移地址 BUF1的偏移地址 BUF1的段基址 存储器
3.段定义伪指令
一个汇编语言源程序由若干个逻辑段组成, 所有的指令、变量分别存放在各个逻辑段中。 段定义伪指令用来定义汇编语言源程序的逻 辑段。 常用的段定义伪指令有: SEGMENT/ENDS ASSUME ORG
②逻辑运算符
包括: AND( 与 ) 、 OR( 或 ) 、 XOR( 异或 ) 、 NOT(非)。 注意:逻辑运算符只适用于数字操作,对存 储器地址操作不适用。 例: MOV AX,789AH XOR 000FH 该指令实际等价于 MOV AX,7895H。
③关系运算符
包括: EQ( 等于 ) 、 NE( 不等于 ) 、 LT( 小于 ) 、 GT( 大 于)、LE(小于等于)、GE(大于等于)。 关系运算符所连接的两个操作数,必须是数字或是 同一段内的存储器地址。 运算结果为数字值。 当关系不成立,则结果为0; 当关系成立,则结果为全1。 例:MOV AL,5 NE 2;关系成立,故(AL)=0FFH MOV AL,5 LT 2;关系不成立,故(AL)=00H
指令语句的格式为: [标号:] 助记符号 [操作数] [;注释] 伪指令语句的格式为: [名称] 定义符号 [参数][,…参数][;注释]
1)标号和名称
标号和名称代表该语句的存储器地址。 标号后面要紧跟一个冒号‚:‛ 。标号在一些指令中充 当操作数,用来表示转移地址。 名称可以是变量名、段名、过程名等。 汇编语言中标识符的命名规则为: ①标识符的第一个字符必须是字母、问号?、 @ 或下划线四 者之一; ②从第二个字符开始可以是字母、问号?、@、下划线或数 字; ③标识符不能是保留字(例如MOV、STACK)。 在给标识符命名时,应使标识符命名与它代表的内容相符。
表达式
表达式可以是以下几种: 常量或常量表达式。 ASCII码字节或字节串。 问号‚?‛表示初值未确定,常用来预留存储空 间。 重复子句DUP格式为: N DUP (表达式) 其中N为重复次数,括号内的表达式为重复的内容。 地址表达式。即用变量名来表示的变量地址。
例4.4
X1 BUF 08H 01H 00H 02H 00H 03H 00H 04H 00H 存储器 01H 02H 03H 04H
2)等号伪指令
格式:符号名 = 表达式 等号伪指令主要用来定义符号常量。 其功能与 EQU 类似,而 与EQU 的唯一区别是 它能对符号进行再定义。 例如: COUNT = 100 MOV CL,COUNT ;(CL)=100 COUNT = 200 MOV CL,COUNT ;(CL)=200
X1 DB 08H BUF DW 01H,02H,03H,04H
例4.5
BUF1 DB ‘HELLO’ BUF2 DB ‘AB’ BUF3 DW ‘AB’
BUF1 ’H’ ‘E’ ‘L’ ‘L’ ‘O’ ’A’ ‘B’ ‘B’ ‘A’ 存储器
BUF2
BUF3
例4.8
B U F 1 D B BUF1 ‘HELLO’ SA_BUF DW BUF1 LA_BUF DD BUF1
(1)常量
常量:指令中出现的固定不变的值。可分为:
数值常量 字符常量
数值常量允许使用二进制、十进制、十六进 制数,但要注意应以B、D、H字符结尾。 十六进制数如果以字母开头,则必须在该数 前面加0,以区别于标识符,如0F5H。 ASCII码常数可将字符放在单引号内,如 ‘A’。
(2)变量
1)伪指令SEGMENT/ENDS
格式:段名 SEGEMNT [定位方式] [组合方式] [‘类别’] … 段名 ENDS SEGEMNT为段定义符,ENDS为段结束符,它们必须成对出 现。 省略号部分: 对于数据段、扩展段和堆栈段来说,一般是存储单元的定 义、分配等伪指令; 对于代码段来说,一般是完成程序功能的指令语句和伪指 令语句。 段名是程序员为该段起的名字,不可省略。 定位方式、组合方式、‘类别’是赋给段名的属性。
(4)寄存器
操作数部分是寄存器名,如AX、BX、SI等。
(5)表达式
表达式:由常数、变量、操作符和运算符组成。 有三种运算符(算术运算符、逻辑运算符、关系运算 符)和两种操作符(分析操作符、合成操作符)。 表达式分为数值表达式和地址表达式。 数值表达式只产生数值结果。 地址表达式不是单纯的数值,而是具有不同属性 的存储器地址变量或标号,属性包括:段、偏移 量和类型。
4)注释
注释由分号‚;‛引导,用来说明一段程序、 一条或几条指令的功能,使程序便于阅读。 汇编程序对注释不进行汇编。
4.2.2 伪指令
伪指令是给汇编程序的控制命令,在汇编过程中由 汇编程序进行处理。 翻译成目标程序后,这些伪指令就不存在了。 包括: 符号定义伪指令 数据定义伪指令 段定义伪指令 过程定义伪指令 源程序结束伪指令
④分析运算符
包括: 取地址偏移量算符OFFSET 取段基址算符SEG 取类型算符TYPE 取变量单元数算符LENGTH 取变量字节数算符SIZE
a)取地址偏移量算符OFFSET
格式:OFFSET 变量或标号 例: MOV SI,OFFSET BUF 等价于 LEA SI,BUF 注意:OFFSET后面只能是变量或标号。
变量:指存放在某些存储单元中的值,这些值是可 变的。 可以用不同的寻址方式对其存取。变量具有如下三 种属性: 段属性:指变量所在段的段基址。 偏移量属性: 指变量单元地址与段的起始地址 之间的地址偏移量。 类型属性: 是指变量所占存储单元的字节数大 小。类型有字节 (BYTE) 、字 (WORD) 、双字 (DWORD)等。
(3)标号
标号有三种属性: 段属性: 定义标号的程序段的段基址,当程序中引用一 个标号时,该标号的段地址应在CS寄存器中。 偏移量属性: 标号所在段的起始地址与定义标号的地址 之间的字节数 。 标号的类型属性:NEAR和FAR。 NEAR标号可以在段内被引用,它所代表的地址指针 为两个字节; FAR标号可以跨段引用,它所代表的地址指针为四个 字节。
4.2.1 汇编语言的语句格式