270 likes | 509 Views
第 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 ). 程序设计流程.
E N D
第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)
程序设计流程 • 明确要求和要达到的目的 • 确定解决问题的计算方法和步骤 • 画出流程图 • 分配内存地址 • 按流程图编写程序 • 上机汇编、调试、修改及最后确定源程序
2、简单程序(顺序结构) • 大量使用数据传送类指令 • 注意正确选择指令以提高效率 • 编程将20单元内的两个BCD熟变换成ACSII码放在20H, 21H单元内(EX2.ASM)
方法一: 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 将20H单元内两个BCD码变换成相应的ASCII码放在21H:22H中
求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 $
3、分支程序 • 根据程序要求无条件或有条件改变程序执行执行的顺序,选择程序的流向. • 特点:程序中含有转移类指令 • 关键:正确选用转移指令
正确运用转移指令 • 无条件分支程序 • 程序设计者事先设计好的 • LJMP、AJMP 、SJMP • 有条件分支程序 • 根据已经执行的程序对标志位、ACC或内部RAM的某些位的影响结果决定程序的流向 • JZ/JNZ、CJNE、DJNZ、位控制转移类指令
注意 • 使用条件转移指令形成分支前一定安排可供条件转移指令进行判别的条件。 • JC LOOP • 正确选定所用的转移条件及转移目标地址
4、循环程序 • 循环初始化 • 循环次数计数器,工作寄存器设初值等 • 循环体 • 尽量简练;注意地址指针的修改 • 循环控制 • 检查结束条件,及时退出循环
注意循环嵌套 允许外重循环嵌套内重循环 循环体不能交叉 不能从循环程序外部跳入循环程序内部
例 • 例:200名学生参加考试,成绩放在8031的外部RAM的一个连续存储单元,95~100分颁发A级证书,90~94分颁发B级证书,编一程序,统计获A、B级证书的人数。将结果存入内部RAM的两个单元。
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 注意地址指针的分配
数据排序 • 常用气泡法(两两比较法)它先使E100和E99进行比较,若E100>E99,则两数交换,否则不动,然后E99和E98进行比较,按同样的原则,决定是否交换,一直比较下去,最后完成E2和E1的比较及交换。经过N-1次比较后,E1位置必然得到数组中的最大值。犹如一个气泡冒到水顶。如此下去,经过N-1次便完成N个数据的排序。
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 $ 例:把片内RAM中地址30H~39H中的10个无符号数逐一比较,并按从小到大的顺序依次排列在这片单元中
查表程序的设计 • 主要用于: • 复杂代码转换显示 • 数据补偿:传感器补偿 • 复杂函数计算: Y=SIN(X)
查表指令 • 在51中有两条查表指令: MOVC A,@A+DPTR和MOVC A,@A+PC • 使用 MOVC A,@A+PC须注意: • 使用传送指令将数据表格项数送入ACC • ADD A,#DATA指令对A进行修改(DATA为当前PC至数据表头的字节代码数): PC+DATA=表格首地址 • MOVC A,@A+PC 完成查表.
[例1] • MOV A, #3 • ADD A,#01H • MOVC A,@A+PC ;A=09H • RET • DB 00,01,04,09,10H,19H,24H,31H,30H,51H…
[例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 …
散转程序设计 • JMP @A+DPTR • 转移指令表 • 地址偏移量 • 采用”RET”指令进行散转
采用”RET”指令实行散转 • RET执行后,堆栈的内容弹出后并装入PC中,利用这个特点,将转向地址表存入堆栈,然后执行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 [例]采用”RET”指令实行散转
子程序的设计 • 子程序和运算程序是程序设计的两大支柱. • 子程序的概念:完成确定任务,并能为其他程序反复调用的程序段. • 要求子程序在结构上具有通用性和独立性.例如:代码转换,运算程序等.
子程序编写注意的问题 • 子程序调用:ACALL LCALL • 子程序返回:RET • 子程序嵌套注意的问题:嵌套深度与堆栈区大小的问题. • 子程序第一条必须有标号. • 正确传递参数:入口参数和出口参数. • 注意现场的保护和恢复
子程序的参数传递 • 通过寄存器传递 • MAIN: MOV R0,#30H • MOV R7,#0AH • ACALL SUBR • … • SUBR: …
主程序用PUSH将参数压入堆栈,子程序按栈指针来间接访问.主程序用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’ 通过堆栈传递参数