第 3 章汇编语言程序设计

27
第 3 第第第第第第第第第 第第第第第第第第第 第第第第第第第第第第 第第第第第第第第第

description

第 3 章汇编语言程序设计. 汇编语言的基本知识 常用汇编程序设计方法 汇编语言的基本知识. 1 、汇编语言的基本知识. 汇编语言的格式 LABLE : OPCODE , OPRAND ;OMMENT 汇编语言的构成 指令性语句 指示性语句:伪指令 程序设计流程. 伪指令. ORG : ORG 2000H END EQU : AAA EQU 20H MOV A , 20H ( MOV A , AAA ) DB 、 DW BIT : A1 BIT 00H ( MOV C , A1 ). 程序设计流程. - PowerPoint PPT Presentation

Transcript of 第 3 章汇编语言程序设计

Page 1: 第 3 章汇编语言程序设计

第 3 章汇编语言程序设计 汇编语言的基本知识 常用汇编程序设计方法 汇编语言的基本知识

Page 2: 第 3 章汇编语言程序设计

1 、汇编语言的基本知识

汇编语言的格式LABLE : OPCODE , OPRAND ;OMMENT

汇编语言的构成指令性语句指示性语句:伪指令

程序设计流程

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

伪指令 ORG : ORG 2000H END EQU : AAA EQU 20H

MOV A , 20H ( MOV A , AAA ) DB 、 DW BIT : A1 BIT 00H ( MOV C , A1 )

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

程序设计流程 明确要求和要达到的目的 确定解决问题的计算方法和步骤 画出流程图 分配内存地址 按流程图编写程序 上机汇编、调试、修改及最后确定源程序

Page 5: 第 3 章汇编语言程序设计

2 、简单程序(顺序结构) 大量使用数据传送类指令 注意正确选择指令以提高效率 编程将 20 单元内的两个 BCD 熟变换成 AC

SII 码放在 20H, 21H 单元内 (EX2.ASM)

Page 6: 第 3 章汇编语言程序设计

将 20H 单元内两个 BCD 码变换成相应的 ASCII 码放在 21H:22H 中方法一: Org 0h LJMP 2000h ORG 2000H MOV R0,#22H MOV @R0,#00 MOV A,20H XCHD A,@R0 ORL 22H,#30H SWAP A ORL A,#30H MOV 21H,A SJMP $ END

;15BYTE ,11T

方法二: MOV A,20H MOV B,#10H DIV AB ORL B,#30H MOV 22H,B ORL A,#30H MOV 21H,A SJMP $ END

;15BYTE 14T

Page 7: 第 3 章汇编语言程序设计

求 16 位二进制补码 ( 负数 ) 的绝对值 MOV A , 20H CPL A ADD A, #01H ;或 INC A MOV 20H , A MOV A , 21H CPL A ADDC A , #0 ANL A , #7FH MOV 21H , A SJMP $

Page 8: 第 3 章汇编语言程序设计

3 、分支程序 根据程序要求无条件或有条件改变程序执

行执行的顺序 , 选择程序的流向 . 特点 : 程序中含有转移类指令 关键 : 正确选用转移指令

Page 9: 第 3 章汇编语言程序设计

正确运用转移指令 无条件分支程序

程序设计者事先设计好的LJMP 、 AJMP 、 SJMP

有条件分支程序根据已经执行的程序对标志位、 ACC 或内部 R

AM 的某些位的影响结果决定程序的流向JZ/JNZ 、 CJNE 、 DJNZ 、位控制转移类指令

Page 10: 第 3 章汇编语言程序设计

注意使用条件转移指令形成分支前一定安排可供条件转移指令进行判别的条件。JC LOOP

正确选定所用的转移条件及转移目标地址

Page 11: 第 3 章汇编语言程序设计

4 、循环程序 循环初始化

循环次数计数器,工作寄存器设初值等 循环体

尽量简练;注意地址指针的修改 循环控制

检查结束条件,及时退出循环

Page 12: 第 3 章汇编语言程序设计

注意循环嵌套

允许外重循环嵌套内重循环循环体不能交叉不能从循环程序外部跳入循环程序内部

Page 13: 第 3 章汇编语言程序设计

例 例: 200 名学生参加考试,成绩放在 8031

的外部 RAM 的一个连续存储单元, 95~100 分颁发 A 级证书, 90~94 分颁发 B 级证书,编一程序,统计获 A 、 B 级证书的人数。将结果存入内部 RAM 的两个单元。

Page 14: 第 3 章汇编语言程序设计

注意地址指针的分配 ORG 0030H EG XDATA 1000H GA DATA 20H GB DATA 21H MOV GA , #00 MOV GB , #00 MOV DPTR , #EG MOV R2 , #200 LOOP : MOVX

A , @DPTR CJNE A,#95, LOOP1

LOOP1: JNC NEXT1 CJNE A,#90,LOOP2 LOOP2: JC NEXT INC GB SJMP NEXT NEXT1: INC GA NEXT: INC DPTR DJNZ R2,LOOP SJMP $ END

Page 15: 第 3 章汇编语言程序设计

数据排序 常用气泡法(两两比较法)它先使 E100 和

E99 进行比较,若 E100>E99, 则两数交换 ,否则不动 , 然后 E99 和 E98 进行比较 , 按同样的原则 , 决定是否交换 , 一直比较下去 ,最后完成 E2 和 E1 的比较及交换。经过 N-1 次比较后, E1 位置必然得到数组中的最大值。犹如一个气泡冒到水顶。如此下去,经过 N-1 次便完成 N 个数据的排序。

Page 16: 第 3 章汇编语言程序设计

例 : 把片内 RAM 中地址 30H~39H 中的 10 个无符号数逐一比较,并按从小到大的顺序依次排列在这片单元中

ORG 0000H START: CLR 00H ;00H 位

作为是否有数据交换的标志 CLR C MOV R7, #0AH MOV R0, #30H MOV A, @R0 LOOP: INC r0 MOV R2, A SUBB A, @R0 ; 比较大小

MOV A,R2 JC NEXT SETB 00H ; 有数据交换 XCH A, @R0 ; 数据交换 DEC R0 XCH A, @R0 INC R0 NEXT: MOV A, @R0 DJNZ R7,LOOP JB 00H, START SJMP $

Page 17: 第 3 章汇编语言程序设计

查表程序的设计

主要用于 :复杂代码转换显示数据补偿:传感器补偿复杂函数计算: Y=SIN(X)

Page 18: 第 3 章汇编语言程序设计

查表指令 在 51 中有两条查表指令 :

MOVC A,@A+DPTR 和 MOVC A,@A+PC

使用 MOVC A,@A+PC须注意 :1. 使用传送指令将数据表格项数送入 ACC2. ADD A,#DATA 指令对 A 进行修改 (DATA 为当前 PC至数据表头的字节代码数 ):

PC+DATA= 表格首地址1. MOVC A,@A+PC 完成查表 .

Page 19: 第 3 章汇编语言程序设计

[ 例 1]

MOV A, #3 ADD A,#01H MOVC A,@A+PC ; A=09H RET DB 00,01,04,09,10H,19H,24H,31H,30H,51

H…

Page 20: 第 3 章汇编语言程序设计

[ 例 2] 设一巡回报警系统对 16路输入进行控制。要求根据R2 中的测量路数 ,找出每路的最大允许值保存于 R3 R4 中。

MOV A,R2 ; 以 R2=1 为例 ADD A,R2 ;A=R2*2 MOV R3,A ADD A,#6 ; 下一个 MOVC A,@A+PC 指令 PC距离表头 TAB3 为 6 MOVC A,@A+PC ;A=37H XCH A,R3 ADD A,#3 ; 下一个 MOVC A,@A+PC 指令 PC距离表头 TAB3 为 3 MOVC A,@A+PC ;A=21H MOV R4,A RET TAB3:DW 1520,3721,4256 ; 表格最大长度 256 DW …

Page 21: 第 3 章汇编语言程序设计

散转程序设计 JMP @A+DPTR 转移指令表 地址偏移量 采用” RET” 指令进行散转

Page 22: 第 3 章汇编语言程序设计

采用” RET” 指令实行散转 RET 执行后 ,堆栈的内容弹出后并装入 PC

中 ,利用这个特点 , 将转向地址表存入堆栈 ,然后执行 RET 指令 ,即可转向相应的操作程序 .

Page 23: 第 3 章汇编语言程序设计

[ 例 ]采用” RET” 指令实行散转 MOV DPTR,#TAB MOV R3,A; 设 A 中存放表内偏移量 MOVC A,@A+DPTR XCH A,R3 INC A MOVC A,@A+DPTR

PUSH A ; 先压低地址 MOV A,R3 PUSH A ;再压高地址 RET TAB:DW:OPR0,OPR1,

OPR2,…,OPRN 

Page 24: 第 3 章汇编语言程序设计

子程序的设计 子程序和运算程序是程序设计的两大支柱 .子程序的概念:完成确定任务 , 并能为其他

程序反复调用的程序段 .要求子程序在结构上具有通用性和独立性 . 例

如 : 代码转换 , 运算程序等 .

Page 25: 第 3 章汇编语言程序设计

子程序编写注意的问题

子程序调用 :ACALL LCALL子程序返回 :RET子程序嵌套注意的问题 : 嵌套深度与堆栈区

大小的问题 .子程序第一条必须有标号 . 正确传递参数 : 入口参数和出口参数 . 注意现场的保护和恢复

Page 26: 第 3 章汇编语言程序设计

子程序的参数传递 通过寄存器传递 MAIN: MOV R0,#30H MOV R7,#0AH ACALL SUBR … SUBR: …

Page 27: 第 3 章汇编语言程序设计

通过堆栈传递参数 主程序用 PUSH 将参

数压入堆栈 ,子程序按栈指针来间接访问 .

例如子程序为: HASC: MOV R0,SP DEC R0 ;错开返回 PC 值 DEC R0 ;找到参数位置

XCH A,@R0 ;取回参数 ANL A,#0FH ADD A,#2 ; 配合@A+PC

MOVC A,@A+PC XCH A,@R0 RET DB ‘01234565789’ DB ‘ABCDEF’