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.1 汇编语言程序设计概述1、计算机的汇编语言以助记符表示的指令,每一条指令就是汇编语言的一条语句。
(汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。
汇编语言的语句有严格的格式要求)2、汇编语言的语句格式MCS-51汇编语言的语句格式表示如下:[<标号>]: <操作码> [<操作数>]; [<注释>]标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。
①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。
)操作码:规定语句执行的操作容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。
操作数:给指令的操作提供数据或地址。
注释:是对语句或程序段的解释说明。
(在单片机中,这四个部分怎么加以区分呢?使用分界符)分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。
冒号(:)用于标号之后空格()用于操作码和操作数之间逗号(,)用于操作数之间,分割两个以上的操作数分号(;)用于注释之前。
第4章 汇编 语言程序设计

DJNZ R1,LOOP ;R1减1不为零,则跳LOOP处 NOP
HERE:SJMP
HERE
上述4个字段应该遵守的基本语法规则如下。
10
1.标号字段
语句所在地址的标志符号,才能被访问。如标号 “START”和“LOOP”等。有关标号规定如下: (1)标号后必须跟冒号“:”。 (2)标号由1~8个ASCII码字符组成,第一个字符必须是
8
汇编语言语句是符合典型的汇编语言的四分段格式:
标号字段 (LABLE) 操作码字段 (OPCODE) 操作数字段 (OPRAND) 注释字段 (COMMENT)
标号字段和操作码字段之间要有冒号“:”分隔; 操作码字段和操作数字段间的分界符是空格; 双操作数之间用逗号相隔;
操作数字段和注释字段之间的分界符用分号“;”。
表示的机器语言程序,才能识别和执行。
完成“翻译”的程序称为汇编程序。经汇编程序“汇编”得 到的以“0”、“1”代码形式表示的机器语言程序称为目标 程序。
5
优点:用汇编语言编写程序效率高,占用存储空间小,运行 速度快,能编写出最优化的程序, 缺点:可读性差,离不开具体的硬件,是面向“硬件”的语 言通用性差。 2.高级语言
功能是把P1.6的位地址赋给变量QA。
4.2
汇编语言源程序的汇编
“汇编”?汇编可分为手工汇编和机器汇编两类。
22
4.2.1
手工汇编
通过查指令的机器代码表(表3-2),逐个把助记符指令 “翻译”成机器代码,再进行调试和运行。 手工汇编遇到相对转移偏移量的计算时,较麻烦,易出 错,只有小程序或受条件限制时才使用。实际中,多采用“ 汇 编程序”来自动完成汇编。
16
重叠。例如:
ORG …… ORG …… ORG …… 2000H 2500H 3000H
第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)。
;取数送A ;除数100送B中 ;商(百位数BCD码)在A中,余数在B中 ;百位数送22H ;余数送A做被除数 ;除数10送B中 ;十位数BCD码在A中,个位数在B中 ;十位数BCD码移至高4位 ;并入个位数的BCD码 ;十位、个位BCD码存人21H
查表
[例4-5]一变量放在内部RAM 的20H,取值为00H-05H。 编写程序,求该变量的平方值,将结果放片内21H ORG 1000H START:MOV DPTR, #2000H; or MOV DPTR, #TABLE MOV A, 20H MOVC A, @A+DPTR MOV 21H, A SJMP $ ORG 2000H TABLE: DB 00, 01, 04, 09, 16, 25 END
Y
循环结束?
N 循 环处理 循 环修改
循环结束?
Y 结 束处理 结束 ( a)先执行后判断 结 束处理 结束 (b)先 判断 后执行
二、程序清单
ORG START : MOV LOOP: MOV MOV DEL1: DEL2: DEL3: MOV MOV DJNZ DJNZ DJNZ RL AJMP END OOOOH A,#01H P1,A R1,#10H R2,#200 R3,#126 R3,DEL3 R2,DEL2 R1,DEL1 A LOOP
4.1.1 汇编语言程序设计步骤
使用汇编语言设计一个程序大致上可分为以下几个步骤。 (1) 分析题意,明确要求。 (2) 确定算法。 (3) 画程序流程图,用图解来描述和说明解题步骤。
图4.1 常用的流程图符号
(4) 分配内存工作单元,确定程序与数据区的存放地址。 (5) 编写源程序 (6) 程序优化。 (7)上机调试、修改和最后确定源程序。
A (41H)
Y
N
A与(61H)交换
A
$
(60H)
结束
图4.4 [例4-6]程序框图
【例4-8】某温度控制系统,采集的温度值(Ta)放在累加器 A中。此外,在内部RAM54H单元存放控制温度下限(T54), 在55H单元存放控制温度上限(T55)。若Ta >T55,程序转向JW (降温处理程序);若Ta<T54,则程序转向SW(升温处理程 序);T55≥Ta≥T54,则程序转向FH(返回主程序)。 程序如下:
;将C清零 ;送被加数首址 ;送加数首址 ;取被加数低字节 ;两个低字节相加 ;低字节和存人被加数低字节 ;修改指针,指向被加数高字节 ;修改指针,指向加数高字节 ;取被加数高字节 ;高字节相加 ;存结果
【例4-3】编写16位二进制数求补程序 二进制数的求补可归结为“求反加1”的过程,求反可用 CPL指令实现;加1时应注意,加1只能加在低8位的最低位上。 因为现在是16位数,有两个字节,因此要考虑进位问题,即低8 位取反加1,高8位取反后应加上低8位加1时可能产生的进位, 还要注意这里的加1不能用INC指令,因为INC指令不影响CY标 志。 ORG 0200H 程序如下: MOV A ,R0 ;低8位送A CPL A ;取反 ADD A ,#01H ;加l MOV R2 ,A ;存结果 MOV A ,R1 ;高8位送A CPL A ;取反 ADDC A ,#00H ;加进位 MOV R3 ,A ;存结果(R1R0---R3R2) END
4.3 分支程序设计
图4.2 分支程序结构
图4.2(a) 结构使用条件转移指令来实现分支, 当给出的条件成立时,执行程序段A,否则执行程序 段B。 图4.2 (b) 结构使用散转指令JMP来实现多分支转 移,它首先将分支程序按序号的值来实现分支转移。
【例4-6】设补码X放在内部RAM30H单元中,函数 Y与X有如下的关系式:
【例4-4】编程将20H单元中的8位无符号二进制数转换成3位 BCD码,并存放在22H(百位)和21H(10位,个位)两个单元中。 程序如下: ORG 1000H MOV A ,20H MOV B ,# 64H DIV AB MOV 22H ,A MOV A,B MOV B , #0AH DIV AB SWAP A ORL A,B MOV 21H , A END
【例4-9】N路分支程序,N≤8。要求程序根据其运行 中所产生的寄存器R3的值,来决定如何进行分支。
MOV A ,R3 MOV DPTR ,#BRTAB MOVC A ,@A+DPTR JMP @A+DPTR BRTAB AJMP BR0 AJMP BR1 AJMP BR2 AJMP BR3 BR0: SETB P1.0 SJMP BRK BR1: SETB P1.1 SJMP BRK BR2: SETB P1.2 SJMP BRK BR3: SETB P1.3 BRK: SJMP BRK
MOV MOV
A, 40H 61H, 41H
开始 (40H) (40H) A (60H)
CJNE AJMP LOOP:JNC
XCH AGEQ: MOV SJMP END
A , LOOP AGEQ
AGEQ A, 61H 60H, A
41H ,
;A≥(41H)则无借位 ;A<(41H)有借位;A与(61H)交 换
(5)定义字命令 DW 格式:[标号:] DW 16位二进制数表 例如, ORG 1000H TAB: DW 1234H , 0ABH , 10 汇编后: (1000H)=12H (1001H ) = 34H (1002H ) = 00H ( 1003H ) = ABH (1004H ) =00H (1005H) =0AH DB、DW伪指令都只对程序存储器起作用,不能 用来对数据存储器的内容进行赋值或进行其它初始化 的工作。
【例4-11】从内存BLOCK单元开始有一个无符号 数的数据块,其长度为LEN,试求出其最大值,并存 入MAX单元。 这是一个搜索问题。这里采用依次进行比较和取 代的方法来寻找最大值。具体做法是:先取出第一个 数作为基准,和第二个数比较,若比较结果基准数大, 不作变动;若比较结果基准数小,则用大数来代替原 基准数,然后再和下一个数作比较。到比较结束时, 基准数就是所求的最大值。 为了进行两数的比较,采用两数相减以后判断CY 的值来确定哪个数大,这比用CJNE指令更简单。比较 时将基准数放在累加器A中。若A中先放零,比较次数 等于LEN;若A中先放人第一个数,则比较次数等于 LEN-1。采用R2作为计数器,R1作为地址指针。程序 流程如图4.9所示。
X Y 试编写程序,根据X的值求出Y,并放回原单元。 解 取出X后先做取值范围的判断,用累加器A状态转 移指令判断X是否为0,用位状态转移指令判断X是大 于0还是小于0。程序流程图如图4.3所示。 程序如下:
MOV A,30H JZ ZER0 JNB ACC.7,PLUS ADD A,#5 MOV 30H,A PLUS: SJMP $ ZERO: MOV 30H,#20H SJMP $ END
4.2 顺序程序设计
顺序结构程序是一种最简单、最基本的程序(也称为简单 程序),它是一种无分支的直线形程序,按照程序编写的顺序 依次执行。 【例4-1】 两个8位无符号数相加,和仍为8位。 假设两个无符号数X1 , X2 分别存放于内部RAM60H、 61H单元中,求其和并将和送入62H单元。 程序如下: ORG 0000H CLR C MOV R0 ,# 60H ;设R0为数据指针 MOV A ,@R0 ;取X1 1NC R0 ADDC A ,@R0 ;X1+X2 1NC R0 MOV @R0,A ;保存结果 END
【例4-2】两个无符号双字节数相加。设被加数存放在内部存 储器30H(高位字节)、31H(低位字节)单元,加数存放在内 部存储器40H(高位字节)、41H(低位字节)单元,和存入30H (高位字节)、31H(低位字节)单元。 程序如下: ORG 0000H CLR C MOV R0 ,#31H MOV R1 ,#41H MOV A ,@R0 ADD A ,@R1 MOV @R0 ,A DEC R0 DEC R1 MOV A,@R0 ADDC A,@R1 MOV @R0 , A END
;左移一位,下一个发光二极管亮
;使L1灯亮,其它不亮 ;从P1口输出到发光二极管 ;延时1秒,根据机器周期算
;循环
【例4-10】多个单字节数求知。 已 知 有 10 个 单 字 节 数 , 依 次 存 放 在 内 部 RAM 40H单元开始的数据存储区中,求和并将 结果存人寄存器R2、R3中(高位存R2,低位存 R3)。 本题中,要重复进行加法运算,因此采用 循环结构程序。循环次数就是数据块字节数,这 是已知的。在置初值时,将数据块长度置人寄存 器R5;将数据块首地址送人寄存器R0,即以R0 作为数据块的地址指针,采用间接寻址方式:每 做一次加法之后,修改地址指针,以便取出下一 个数来相加,并且使计数器R5减l。到R5减为0 时,求和结束。程序流程图如图4.8所示。
CJNE AJMP LOOPl: JNC CJNE AJMP LOOP2: FH: JC RET A,55H,LOOP1 FH JW A,54H,LOOP2 FH SW ;Ta≠T55,转向LOOPl ;Ta=T55,返回 ;若(CY)=0,表明Ta>T55,转降温处理程序 ;Ta≠T54,转向LOOP2 ;Ta=54,返回 ;若(CY)=1,表明Ta<T54,转升温处理程序 ;T55≥Ta≥T54,返回主程序
开始 (30H) A
A=0?
A>0?
20H (30H)
(30H)
(30H)+5
结束 图4.3 [例4-5]程序框图
【例4-7】内部RAM40H和41H单元中各有 一无符号数,比较其大小,将大数存放于内部 RAM60H单元,小数存放于内部RAM61H单元, 如两数相等,则分别送往这2个单元。 解 用比较不等转移指令CJNE比较力两个 无符号书,先确定它们是否相等,若不相等时 再根据借位标志确定这两个无符号书的大小。 程序框图如图4.4所示。 程序如下: