Top Banner
第4第 汇汇汇汇汇汇汇汇汇汇
48

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

Feb 05, 2016

Download

Documents

wirt

第 4 章 汇编语言程序设计知识. 4.1.1 汇编语言及其语句格式 1 、汇编语言 这里介绍 MCS-51 单片机的汇编语言。 2 、汇编语言的语句格式 一条汇编语言的语句包括四部分内容:标号、操作码、操作数和注释。其格式为: 标号:操作码 操作数;注释 例如: LOOP: MOV A , #20H ; (A)←20H. 4.1 汇编语言程序设计. 1 、定位伪指令 格式: ORG n 2 、定义字节伪指令 格式:标号: DB X1, X2, ……Xn - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 第 4 章  汇编语言程序设计知识

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

Page 2: 第 4 章  汇编语言程序设计知识

4.1 汇编语言程序设计4.1.1 4.1.1 汇编语言及其语句格式汇编语言及其语句格式11 、汇编语言、汇编语言 这里介绍这里介绍 MCS-51MCS-51 单片机的汇编语言。单片机的汇编语言。22 、汇编语言的语句格式、汇编语言的语句格式 一条汇编语言的语句包括四部分内容:标号、一条汇编语言的语句包括四部分内容:标号、

操作码、操作数和注释。其格式为:操作码、操作数和注释。其格式为: 标号:操作码 操作数;注释 标号:操作码 操作数;注释 例如:例如: LOOP: MOV A , #20H LOOP: MOV A , #20H ; ; (A)←20H(A)←20H

Page 3: 第 4 章  汇编语言程序设计知识

4.1.2 4.1.2 伪指令伪指令

1 、定位伪指令格式: ORG n

2 、定义字节伪指令格式:标号: DB X1, X2, ……Xn

此伪指令的功能是把 Xi 存入从标号开始连续的单元中。3 、定义字伪指令

格式:标号: DW X1 , X2 ,…… Xn

此伪指令的功能是把 Xi 存入从标号开始的连续单元中。

思考:伪指令的作用?

Page 4: 第 4 章  汇编语言程序设计知识

44 、、预留存贮区伪指令预留存贮区伪指令格式:格式: DS nDS n

DS nDS n 从标号指定单元开始,预留从标号指定单元开始,预留 nn 个单元的存贮个单元的存贮区。区。

注:注: DBDB ,, DWDW ,, DSDS 伪指令都只对程序存储器伪指令都只对程序存储器起作用,不能对数据存储器进行初始化起作用,不能对数据存储器进行初始化

55 、、赋值伪指令赋值伪指令格式:字符名称 格式:字符名称 EQU nEQU n

此指令的功能是将数据或地址此指令的功能是将数据或地址 nn 赋给字符名赋给字符名称。称。

Page 5: 第 4 章  汇编语言程序设计知识

66 、、 DATA DATA 数据地址赋值命令数据地址赋值命令格式:字符名称 格式:字符名称 DATADATA 表达式表达式

注:功能与注:功能与 EQUEQU 类似,但有区别类似,但有区别(( 11 )) EQUEQU 伪指令可以把一个汇编符号赋给一个伪指令可以把一个汇编符号赋给一个

名字,而名字,而 DATADATA 只能把数据赋给字符名只能把数据赋给字符名(( 22 )用)用 EQUEQU 必须先定义后使用,必须先定义后使用, DATADATA 定义的定义的

符号名可以后定义先使用符号名可以后定义先使用(( 33 )) DATADATA 可以把一个表达式的值赋给字符名称,可以把一个表达式的值赋给字符名称,

其中的表达式应是可求值的其中的表达式应是可求值的

Page 6: 第 4 章  汇编语言程序设计知识

77 、、结束汇编指令结束汇编指令格式: 格式: ENDEND

ENDEND 指示源程序到结束,常将其放在汇指示源程序到结束,常将其放在汇编语言源程序的末尾。编语言源程序的末尾。

88 、、 BIT BIT 位地址符号命令位地址符号命令 格式:符号名格式:符号名 BIT BIT 位地址位地址

Page 7: 第 4 章  汇编语言程序设计知识

4.1.3 汇编语言程序设计过程 1 、分析任务,确定算法或解题思路 2 、根据算法和解决思路画出程序流程图

流程图是由一些框图和流程线组合而成:

通过流程图把具有一定功能的各部分有机的联系起来。

Page 8: 第 4 章  汇编语言程序设计知识

33 、、根据流程图编写程序根据流程图编写程序44 、、上机调试程序上机调试程序

Page 9: 第 4 章  汇编语言程序设计知识

4.2 汇编程序结构4. 2. 1 顺序结构程序设计 按照程序编写的顺序,依次执行。任何复杂的

程序,都含有较大成份的顺序结构程序。

【例 4-1 】 将两位压缩 BCD 码转换成二进制数 编程思路:( a1a0 ) BCD= a1×10+a0

编程说明:待转换的两位压缩 BCD 码存放于 R2 ,转换结果存回 R2 。

程序流程图如图 4-1 所示。

Page 10: 第 4 章  汇编语言程序设计知识
Page 11: 第 4 章  汇编语言程序设计知识

编程如下:编程如下:START: START: MOV A , R2MOV A , R2

ANL A , #0F0H ANL A , #0F0H ;取高位;取高位 BCDBCD 码码 SWAP ASWAP AMOV B , #0AHMOV B , #0AHMUL ABMUL ABMOV R3 , AMOV R3 , AMOV A , R2MOV A , R2ANL A , #0FH ANL A , #0FH ;取低位;取低位 BCDBCD 码码ADD A , R3ADD A , R3MOV R2 , AMOV R2 , AENDEND

Page 12: 第 4 章  汇编语言程序设计知识

4. 2. 2 4. 2. 2 分支程序设计分支程序设计

Page 13: 第 4 章  汇编语言程序设计知识

【【例例 4-24-2 】 】 求符号函数的值 求符号函数的值

1 1 当当 X>0X>0

Y= Y= 0 0 当当 X=0 X=0 的值。的值。

-1 -1 当当 X<0 X<0

编程说明:设变量编程说明:设变量 XX 存放在存放在 40H40H 单元中,函数单元中,函数

YY 存放在存放在 41H41H 单元中。此程序为三分支程序。单元中。此程序为三分支程序。

程序流程图如图程序流程图如图 4-24-2 所示。所示。

Page 14: 第 4 章  汇编语言程序设计知识
Page 15: 第 4 章  汇编语言程序设计知识

编程如下:编程如下:

START:START: MOV A MOV A ,, 40H40H

JZ COMPJZ COMP

JNB ACC.7JNB ACC.7 , , POSTPOST

MOV AMOV A ,, #81H #81H ;表示;表示 -1-1

SJMP COMP SJMP COMP

POST: MOV APOST: MOV A ,, #01H #01H ;表示;表示 +1+1

COMP: MOV 41HCOMP: MOV 41H ,, AA

ENDEND

Page 16: 第 4 章  汇编语言程序设计知识

例 4-3 使用多条 CJNE 实现多分支程序转移 某温度控制系统 , 采集的温度值 (Ta) 放在 A 中 , 此外 , 在内部RAM 54h 单元存放控制温度的下限值 (T54), 在 55h 单元中存放控制温度的上限 (T55), 若 Ta>T55, 程序转向 JW( 降温处理 ), 若Ta<T54, 程序转向 SW( 升温处理 ), 否则 , 转向 FH( 返回主程序 ).

CJNE A,55H,LOOPH

AJMP FH

LOOPH: JNC JW

CJNE A,54H,LOOP2

AJMP FH

LOOP2: JC SW

FH: RET

JW: …. ; 降温处理SW: …. ; 升温处理

Page 17: 第 4 章  汇编语言程序设计知识

例 4-4: 使用查表地址方法实现多分支程序转移

有 BR0,BR1,BR2 和 BR3 共 4 个分支程序 , 各分支程序的功能是依次从内部 RAM 取数 , 外部低 256B Ram

取数 , 外部 4kb 取数 , 外部 64KB 取数。

R3: 入口参数( 0~3 ),选择取数存储区。

R0: 存储器低 8 位地址。

R1: 存储器高 8 位地址。

Page 18: 第 4 章  汇编语言程序设计知识

MOV A,R3

MOV DPTR,#BRTAB

MOVC A,@A+DPTR

JMP @A+DPTR

BRTAB:DB BR0-BRTAB ; 存放差值

DB BR1-BRTAB

DB BR2-BRTAB

DB BR3-BRTAB

BR0: MOV A,@R0SJMP BRE

BR1: MOVX A,@R0SJMP BRE

BR2: MOV A,R1ANL A,#0FHANL P2,#0F0HORL P2,A MOVX A,@ R0SJMP BRE

BR3: MOV DPL,R0MOV DPH,R1MOVX A,@DPTR

BRE: SJMP $

Page 19: 第 4 章  汇编语言程序设计知识

例 4-5: 使用查表转移指令实现多分支程序设键盘上有 3 个操作键 键值 :01 功能 : 读数据 键值 :02

功能 : 写数据 键值 :03 功能 : 插入 假定键值放在 A 中……

MOV DPTR,#3000H

CLR C

RLC A

JMP @A+DPTR

3000H

3001H

3002H AJMP DS ; 转到读数据程序3003H

3004H AJMP XS ; 转到写数据程序3005H

3006H AJMP CR ; 转到插入程序

Page 20: 第 4 章  汇编语言程序设计知识

例 4-6: 通过堆栈操作实现多分支转移程序。分支程序入口地址存在 BRTAB 表中 , 并假定分支转移序号值在 R3中 MOV DPTR,#BRTAB

MOV A,R3RL AMOV R1,AINC AMOVC A,@A+DPTRPUSH ACC ; 先压低八位地

址MOV A,R1MOVC A,@A+DPTRPUSH ACC ; 再压高八位地址RET

BRTAB: DW BR0 DW BR1

….. DW BR127

Page 21: 第 4 章  汇编语言程序设计知识

K=?

转向 0 分支

K=0

转向 1 分支 转向 n-1 分支 转向 n 分支……

图中,图中, KK 的最大值一般为的最大值一般为 128128 。。

设寄存器 R3中存有分支转移序号 00H~7FH,试编写根据序号转移的程序。

例 4-7 散转程序设计

Page 22: 第 4 章  汇编语言程序设计知识

JMP_128: MOV A, R3

RL A

MOV DPTR, #JMPTAB

JMP @A+DPTR

JMPTAB: AJMP ROUT00 ; 128 个子程序首址AJMP ROUT01

… …

AJMP ROUT7F

说明:说明: 此程序要求转移目的地址此程序要求转移目的地址 ROUT00~ ROUT7F 必须驻留在与指令 AJMP同一个 2KB 存储区内,且程序的最大分支值程序的最大分支值为 128 。。

Page 23: 第 4 章  汇编语言程序设计知识

4.2.3 循环程序设计

Page 24: 第 4 章  汇编语言程序设计知识

【【例例 4-84-8 】】已知内存单元有已知内存单元有 1616 个二进制无符号数,个二进制无符号数,

分别存放在分别存放在 30H30H ~~ 3FH3FH 中,试求它们的累加和,中,试求它们的累加和,

并将其和数存放在并将其和数存放在 R4R4 、、 R5R5 中。中。

编程说明:编程说明:存放存放 1616 个二进制无符号数的首地址为个二进制无符号数的首地址为 33

0H0H ,此循环程序的循环次数为,此循环程序的循环次数为 1616 次,和数放在次,和数放在 RR

44 (高位)、(高位)、 R5R5 (低位)中。程序流程如图。(低位)中。程序流程如图。

Page 25: 第 4 章  汇编语言程序设计知识
Page 26: 第 4 章  汇编语言程序设计知识

参考程序如下 :START: MOV R0 ,#30H

MOV R2 , #10H MOV R4 , #00H MOV R5 , #00H

LOOP: MOV A , R5LOOP: MOV A , R5ADD A , @R0 ADD A , @R0 MOV R5 , A MOV R5 , A MOV A , #00HMOV A , #00HADDC A , R4ADDC A , R4MOV R4 , AMOV R4 , AINC R0INC R0DJNZ R2 , LOOPDJNZ R2 , LOOPENDEND

Page 27: 第 4 章  汇编语言程序设计知识

4.2.4 4.2.4 查表程序设计查表程序设计

【【例例 4-94-9 】】利用查表的方法编写利用查表的方法编写 Y= XY= X22 (X=0,1,2…9 ) (X=0,1,2…9 )

的程序。的程序。

编程说明:设变量编程说明:设变量 XX 的值存放在内存的值存放在内存 30H30H 单元中,单元中,

变量变量 YY 的值存入内存的值存入内存 31H31H 单元。先用远查表指令单元。先用远查表指令 MM

OVC A, @A+DPTR OVC A, @A+DPTR 编写程序(参考程序编写程序(参考程序 11 );再);再

用近查表指令用近查表指令 MOVC A , @A+PC MOVC A , @A+PC 编写程序(见参编写程序(见参

考程序考程序 22 )。)。

Page 28: 第 4 章  汇编语言程序设计知识

参考程序参考程序 11 : :

ORG 1000HORG 1000H

START:START: MOV A , 30HMOV A , 30H

MOV DPTR , #TABLEMOV DPTR , #TABLE

MOVC A , @A+DPTRMOVC A , @A+DPTR

MOV 31H , AMOV 31H , A

TABLE:TABLE: DB 0 , 1 , 4 , 9 , 16DB 0 , 1 , 4 , 9 , 16

DB 25 , 36 , 49 , 64 , 81DB 25 , 36 , 49 , 64 , 81

ENDEND

Page 29: 第 4 章  汇编语言程序设计知识

参考程序参考程序 22 ::

ORG 1000HORG 1000H

START:START: MOV A , 30HMOV A , 30H

ADD A , 02HADD A , 02H ;;思考该指令的作用?思考该指令的作用?

MOVC A , @A+PCMOVC A , @A+PC

MOV 31H , AMOV 31H , A

DB 0 , 1 , 4 , 9 , 16 DB 0 , 1 , 4 , 9 , 16

DB 25 , 36 , 49 , 64 , 81DB 25 , 36 , 49 , 64 , 81

ENDEND

Page 30: 第 4 章  汇编语言程序设计知识

【【例例 4-104-10 】】 将 将 11 位十六进制数,转换成相应位十六进制数,转换成相应 ASCⅡASCⅡ码。用计算求解和查表求解,进行比较。码。用计算求解和查表求解,进行比较。

(( 11 )) 计算求解:计算求解:

编程说明: 设待转换的一位十六进制数存放在编程说明: 设待转换的一位十六进制数存放在 4040

H H 单元中,转换后的单元中,转换后的 ASCⅡASCⅡ 码仍存放在码仍存放在 40H 40H 中。中。

编程思路: 十六进制数编程思路: 十六进制数 00 ~~ 9 9 的的 ASCⅡASCⅡ 为为 4141

HH ~~ 46H46H ,当待转换的数≤,当待转换的数≤ 99 时,加时,加 30H30H ,既是,既是其对应的其对应的 ASCⅡASCⅡ码;当待转换的数码;当待转换的数 >9>9时,加时,加 37H37H 。。程序流程如图所示。程序流程如图所示。

Page 31: 第 4 章  汇编语言程序设计知识
Page 32: 第 4 章  汇编语言程序设计知识

参考程序如下:参考程序如下:ORG 0100 H ORG 0100 H MOV A , 40 H MOV A , 40 H ANL A , # 0F H ANL A , # 0F H CLR CCLR CSUBB A, # 0AH SUBB A, # 0AH ;; A<10?A<10?JC NEXTJC NEXTADD A , #0AHADD A , #0AHADD A , #37HADD A , #37HSJMP SAVESJMP SAVE

NEXT: NEXT: ADD A , #0AHADD A , #0AH ADD A , #30HADD A , #30H

SAVE: MOV 40H , ASAVE: MOV 40H , A ENDEND

Page 33: 第 4 章  汇编语言程序设计知识

(( 22 ) 查表求解:) 查表求解: ORG 0100HORG 0100H

MOV A , 40HMOV A , 40HANL A , #0FHANL A , #0FH

ADD A , 02HADD A , 02H MOVC A , @A+PCMOVC A , @A+PC

MOV 40H , AMOV 40H , A DB ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’DB ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’

DB ‘6’, ‘7’, ‘8’, ‘9’, ‘A’, ‘B’DB ‘6’, ‘7’, ‘8’, ‘9’, ‘A’, ‘B’ DB ‘C’, ‘D’, ‘E’, ‘F’DB ‘C’, ‘D’, ‘E’, ‘F’ ENDEND

Page 34: 第 4 章  汇编语言程序设计知识

4.2.5 4.2.5 子程序设计子程序设计11 、、子程序的调用与返回子程序的调用与返回

MCS-51MCS-51 单片机有两条子程序调用指令:单片机有两条子程序调用指令: ACALL aACALL addr11ddr11 、 、 LCALL addr16LCALL addr16 ;一条子程序返回指令;一条子程序返回指令 RRETET 。 。

22 、、保存与恢复寄存器内容保存与恢复寄存器内容例如:例如: SUB1: PUSH PSWSUB1: PUSH PSW

PUSH ACCPUSH ACC PUSH 06HPUSH 06H

∶∶ (( 此处省略了子程序的内容此处省略了子程序的内容 ))∶∶

POP 06HPOP 06H POP ACCPOP ACC POP PSWPOP PSW

Page 35: 第 4 章  汇编语言程序设计知识

33 、、子程序的参数传递子程序的参数传递

主程序在调用子程序时,经常需要主程序在调用子程序时,经常需要传送一些参数,子程序运行完后也经常传送一些参数,子程序运行完后也经常将一些参数回送给主程序,这叫参数传将一些参数回送给主程序,这叫参数传递。递。

Page 36: 第 4 章  汇编语言程序设计知识

用工作寄存器和累加器传递参数

【【例例 4-11 4-11 】 】 编程计算编程计算 c = ac = a2 2 +b+b22 。。 (a,b=0~9)(a,b=0~9)

编程说明:编程说明:这个问题中,计算某数的平方可以这个问题中,计算某数的平方可以用子程序来实现,两次调用该子程序,并求和用子程序来实现,两次调用该子程序,并求和便得到所需结果。设便得到所需结果。设 aa 、、 b b 分别存于内部分别存于内部 RARA

M M 的的 30H30H 、、 31H31H 单元,结果单元,结果 CC 存于内部存于内部 RARA

MM 的的 40H40H 单元。单元。

Page 37: 第 4 章  汇编语言程序设计知识

参数传递:参数传递:主程序中,将某数存放到累加器主程序中,将某数存放到累加器 AA 中,中,作为子程序的入口参数;子程序中,将所求数的作为子程序的入口参数;子程序中,将所求数的平方值存放在累加器平方值存放在累加器 AA 中,作为出口参数(即主中,作为出口参数(即主程序的返回值)。程序的返回值)。子程序的入口参数:子程序的入口参数: AA 中存放某数的值。中存放某数的值。子程序的出口参数:子程序的出口参数: AA 中存放所求数的平方。子中存放所求数的平方。子程序如下:程序如下:

SQR: SQR: INC AINC A MOVC A , @A+PC MOVC A , @A+PC ;查平方表;查平方表 RETRET

TABLE: TABLE: DB 0 , 1 , 4 , 9 , 16DB 0 , 1 , 4 , 9 , 16 DB 25 , 36 , 49 , 64 , 81DB 25 , 36 , 49 , 64 , 81主程序流程图如图 所示。主程序流程图如图 所示。

Page 38: 第 4 章  汇编语言程序设计知识
Page 39: 第 4 章  汇编语言程序设计知识

主程序如下:主程序如下:

START: START: MOV A , 30HMOV A , 30H

ACALL SQR ACALL SQR ;调查表子程序;调查表子程序

MOV R1 , A MOV R1 , A ;; aa22暂存暂存 R1R1 中中

MOV A , 31H MOV A , 31H

ACALL SQR ACALL SQR ;调查表子程序;调查表子程序

ADD A , R1ADD A , R1

MOV 40H , AMOV 40H , A

ENDEND

Page 40: 第 4 章  汇编语言程序设计知识

例 4-12 :设计 8 位二进制数转换为 BCD 数子程序。二进制数范围: 0~FFH BCD 数范围: 0~255

入口: ( A ) = 二进制数出口: ( R0 ) =十位数和个位数地址指针

BINBCD: MOV B,#100DIV AB ; ( A ) =百位数MOV @R0,AINC R0MOV A,#10XCH A,BDIV AB ; ( A ) =十位数,( B ) = 个位数SWAP AADD A,BMOV @R0,ARET

Page 41: 第 4 章  汇编语言程序设计知识

用 RAM (指针寄存器)传递参数 例 4-13 : (R0) 和 (R1) 指出的 RAM 中的两个三字节无符号整数相加 , 结果送到由 (R0) 指出的 RAM

入口: (R0),(R1) 分别指出加数和被加数低地址出口: (R0) 指向结果的高字节 , 低位放在低地址 , 高位

放在高地址 .

NADD: MOV R7,#03HCLR C

NADD1: MOV A,@R0ADDC A,@R1MOV @R0,AINC R0INC R1DJNZ R7,NADD1DEC R0RET

Page 42: 第 4 章  汇编语言程序设计知识

4 、子程序的嵌套

Page 43: 第 4 章  汇编语言程序设计知识

4.3 软件抗干扰 软件陷阱技术– 未使用的中断向量区

假设系统使用 INT0,T0,T1ORG 0000H

START: LJMP MAINLJMP PGINT0NOP ;NOP ;LJMP ERR ;

陷阱

Page 44: 第 4 章  汇编语言程序设计知识

LJMP PGT0

NOP

NOP

LJMP ERR

LJMP PGT1

NOP

NOP

LJMP ERR

NOP

NOP

JMP ERR

陷阱

陷阱

陷阱

Page 45: 第 4 章  汇编语言程序设计知识

– 未使用的大片 ROM 如果 ERR 在 30H 开始的地址单元 , 可用 00 00 20

00 30,即 :NOPNOPLJMP ERR

– 表格在表格最后安排陷阱程序

– 程序

在跳转指令处 ,正常执行不会继续执行 , 可以安排陷阱程序

Page 46: 第 4 章  汇编语言程序设计知识

看门狗 当程序弹飞到一个临时构成的死循环中 ,软件陷阱就没有作用了 ,要用程序运行监视系统

1.本身能独立工作 ,基本不依赖 CPU

2.CPU 在一个固定时间间隔内和该系统打一次交道(喂一次狗 )

3. 当 CPU陷入死循环时能及时发觉并复位系统

注 :8096 和增强型 8051 系统中已内嵌Watchdog

Page 47: 第 4 章  汇编语言程序设计知识

当系统陷入死循环后 , 只有用比这个死循环更高级的中断子程序才能夺走 CPU 控制权 , 可用一个定时器来做Watchdog,它的溢出中断设为高优先级中断例如 T0 作 Watchdog, 定时为 16ms

初始化 : MOV TMOD,#01H

SETB ET0

SETB PT0MOV TH0,#0B1HMOV TL0,#0E0H

SETB TR0

SETB EA

Watchdog启动后 ,每次间隔小于 16ms 执行一条“MOV TH0,#0E0H”, 可暂时喂饱 .

当程序陷入死循环 ,16ms产生一次 T0 中断 , 从而跳出死循环。

Page 48: 第 4 章  汇编语言程序设计知识

ORG 0000HAJMP MAINORG 000BHLJMP TOP

MAIN: MOV SP,#60HMOV PSW,#00HMOV SCON,#00H ….MOV IE,#00HMOV IP,#00HMOV TMOD,#01HLCALL DOG ;调用 WDOG

….DOG: MOV TH0,#0B1H

MOV TL0,#0E0HSETB TR0RET

TOP:POP ACC ;修改栈指针POP ACCCLR APUSH ACCPUSH ACC ;将返回地址变成 0000h ,实现复

位RETI