550 likes | 685 Views
第四章 程序设计举例. 4.1 汇编语言源程序的编辑与汇编 4.2 程序设计. 4.1 汇编语言源程序的编辑与汇编 4.1.1 源程序编辑 微机上完成(各种工具软件) 例如: MASM 、 Keil C51 4.1.2 源程序的汇编 手工汇编 机器汇编. 4.1.3 伪指令 1. 汇编起始命令 格式: [ 标号: ] ORG 16 位地址 功能: 规定该指令后程序的汇编地址。 2. 汇编结束命令 格式: [ 标号: ] END 功能: 表示源程序结束。. 3. 赋值命令
E N D
第四章 程序设计举例 4.1 汇编语言源程序的编辑与汇编 4.2 程序设计
4.1 汇编语言源程序的编辑与汇编 4.1.1 源程序编辑 微机上完成(各种工具软件) 例如:MASM、Keil C51 4.1.2 源程序的汇编 手工汇编 机器汇编
4.1.3 伪指令 1. 汇编起始命令 格式:[标号:] ORG 16位地址 功能:规定该指令后程序的汇编地址。 2. 汇编结束命令 格式:[标号:] END 功能:表示源程序结束。
3. 赋值命令 格式:字符名称 EQU 数或汇编符号 功能:将一个数或特定的汇编符号赋予规 定的字符名。 EQU定义的字符名必须先定义后使用。 4. 数据地址赋值命令 格式:字符名称 DATA 表达式 功能:将数据地址或代码地址赋予规定的 字符名称。
与EQU的差别: (1)EQU定义的字符名必须先定义后使用,而DATA定义的字符名可以后定义先使用。 (2)用EQU可将一个汇编符号赋给一个字符名,而DATA只能把数据赋给字符名。 (3)DATA语句可将一表达式的值赋给字符名称,其表达式应是可求值的。
5. 定义字节命令 格式:[标号:] DB 8位二进制数表 功能:从指定的地址单位开始,定义若干个8 位内存单元的内容。 6. 定义字命令 格式:[标号:] DW 16位数表 功能:从指定地址开始定义若干16位数据。
7. 定义存储空间命令 格式:[标号:] DS 表达式 功能:从指定地址开始保留若干字节地址空间 作备用。 注意:DB、DW、DS伪指令只对程序存储器起作 用,不能对数据存储器进行赋值或其它 初始化工作。 8. 位地址符号命令 格式:字符名 BIT 位地址 功能:把BIT之后的位地址赋给字符名。
4.2 编程的步骤、方法和技巧 4.2.1 编程步骤 1 分析问题 2 确定算法 3 画程序流程图 4 编写程序
89C51汇编语言编写的源程序行(一条语句)包括4个部分:89C51汇编语言编写的源程序行(一条语句)包括4个部分: [标号:] [操作码] [操作数] ;注释 操作数字段中的专门符号: $ 用来表示程序计数器的当前值
4.2.2 程序设计 根据单片机的特点和实际问题的要求进行程序 设计。 一. 查表程序设计 MCS-51指令系统给用户提供了两条查表指令: MOVC A, @A+DPTR MOVC A, @A+PC
例4.1:用程序实现C = a2 + b2 设a、b、c分别存入片内RAM中的DA、DB、DC三 个单元。 • 方法一: 子程序: 功能:求给定值的平方值。 入口参数:给定值存放在A累加器中。 出口参数:所求的平方值存放在A累加器中。
SQR1: INC A MOVC A,@A+PC RET TAB: DB 0, 1, 4, 9,16 DB 25,36,49,64,81
主程序: START1: MOV A,DAH ACALL SQR1 MOV R1,A ;a2 (R1) MOV A,DBH ACALL SQR1 ;b2 (A) ADD A,R1 ;a2+b2 (A) MOV DCH,A SJMP $
方法二: 子程序: SQR2:PUSH DPH PUSH DPL MOV DPTR,#TAB MOVC A,@A+DPTR POP DPL POP DPH RET TAB: DB 0, 1, 4, 9,16,25 DB 36,49,64,81
例4.2:输入为1个ASCII码命令字符,按其输入的命令字符,转去执行对应的处理程序。例4.2:输入为1个ASCII码命令字符,按其输入的命令字符,转去执行对应的处理程序。 设命令字符为‘A’,‘D’,‘E’,‘L’,‘M’,‘X’,‘Z’,七种,对应的处理程序入口地址为XA,XD,XE,XL,XM,XX,XZ。
DB ‘M’ DW XM DB ‘X’ DW XX DB ‘Z’ DW XZ DB 0 1).建表: TAB5:DB ‘A’ DW XA DB ‘D’ DW XD DB ‘E’ DW XE DB ‘L’ DW XL
2)程序:设命令字符在A中 LTB5: MOV DPTR,#TAB5 MOV B,A LOP5: CLR A MOVC A,@A+DPTR JZ LEND;判断表格是否结束? INC DPTR CJNE A,B,LNF5;判断字符是否相等? CLR A;字符相等,取出相应的处理 程序入口 DPTR 。
MOVC A,@A+DPTR MOV B,A ;取出处理程序入口高位地址 (B) INC DPTR CLR A MOVC A,@A+DPTR ;取出处理程序入口低位地位 (A) MOV DPL,A MOV DPH,B CLR A JMP @A+DPTR ;转处理程序。
LNF5:INC DPTR ;修改地址指针 INC DPTR SJMP LOP5 LEND: . . .
二、散转程序设计 MCS-51指令系统提供间接转移指令 JMP @A+DPTR 实现散转功能。 例4.3:128种分支转移程序。
1)利用转移指令表: 程序:设R3中存放转移目的地址的序号00H~7FH。 JMP1: MOV A, R3 RL A ;序号×2 (A) MOV DPTR, #JMPTAB JMP @A+DPTR ;表首址+序号×2 JMPTAB: AJMP ROUT00 AJMP ROUT01 . . AJMP ROUT7F
2)利用转向地址表: 程序:1》128 < 分支数N < 256; 2》R3中存放转移地址的序号。 JMP2: MOV DPTR,#TBL9 MOV A,R3 ADD A,R3 ;(R3)×2 (A) JNC NADD INC DPH ;(R3)×2>256,翻页
NADD: MOV R2,A MOVC A,@A+DPTR XCH A,R2 ;取出转移地址高8位 (R2) INC A MOVC A,@A+DPTR ;取出转移地址低8位 (A) MOV DPL,A MOV DPH,R2 CLR A JMP @A+DPTR
TBL9: DW PRG0 DW PRG1 . . DW PRGn
3)利用RET指令实现散转程序: 程序:1> 分支数 n>255; 2> 转移地址的序号 (R3R2)中。 JMP3: MOV DPTR,#TBL10 MOV A,R2 ;序号×2 CLR C RLC A XCH A,R3 RLC A ADD A,DPH ;序号×2 的高位 +(DPH) MOV DPH,A ; (DPH)
MOV A,R3 ;序号×2的低位 (A) MOVC A,@A+DPTR ;取转向地址高位 (R3) XCH A,R3 INC DPTR MOVC A,@A+DPTR ;取转向地址低位 (A) PUSH A MOV A,R3 PUSH A RET ;把转向地址 (PC)
TBL10: DW PRG0 DW PRG1 . . DW PRGn
三、代码转换 例4.4: 将累加器中的8位无符号二进制数转换成三位BCD码形式。百位数存放在HUND变量单元,十位数和个位数存入相邻的变量单元TENONE中。 程序清单: HUND DATA 20H TENONE DATA 21H BINBCD: MOV B,#100 DIV AB ;A/100,商为百位 MOV HUND,A ;保存百位 MOV A,B ;取余数 MOV B,#10
DIV AB ;余数/10,商为十位 SWAP A ;十位数存到A的高位 ADD A,B ;十位数加个位数 MOV TENONE,A ;保存 RET
例4.5: 二进制码装换为ASCII码 由ASCII码表可知: 二进制码转换为ASCII码的方法是 1. ASCII码=4位二进制数(<10)+30H 2. ASCII码=4位二进制数(>=10)+37H 程序如下:
BINASC:MOV A, R2 ;取数 ANL A,#0FH ;屏蔽高4位 PUSH A CLR C SUBB A,#0AH POP A JC LOOP ;<10,转 ADD A,#07H LOOP:ADD A,#30H MOV R2,A RET
例4.6:多字节二进制数转换为BCD数。 1>转换方法:若将16位二进制数转换为十进制数时, (N)D= a15×215 + a14 ×214 +….+ a0 ×20 =(…(((a15 ×2)+a14) ×2+a13) ×2+…) ×2+a0 2>框图:
开始 清BCD数单元 置二进制数的位数 置二进制数低位地址,置二进制字节数 二进制数左移 N 字节数到? Y BCD数×2+进位位 十进制数调整 N 字节数到? Y N 位数到? Y 图4-1 多字节二翻十子程序框图 结束
3)程序: BTOD2:MOV R1, DADR ;取BCD数个位地址 (R1) MOV R2, BYTE ;取二进制字节数 INC R2 ;获取十进制字节数 (R2) CLR A BBO: MOV @R1,A ;清BCD单元 INC R1 DJNZ R2,BBO MOV A,BYTE ;计算二进制数的位数 (R3) MOV B,#08H MUL AB MOV R3,A
BB3:MOV R0,BADR;取二进制数的低位地址 (R0) MOV R2,BYTE CLR C BB1:MOV A,@R0 ;二进制数(多字节)左移一位 RLC A ;逐位移入CY中 MOV @R0,A INC R0 DJNZ R2,BB1 MOV R2,BYTE INC R2 MOV R1,DADR
BB2:MOV A,@R1 ;BCD数×2+进位 ADDC A,@R1 DA A MOV @R1,A INC R1 DJNZ R2,BB2 DJNZ R3,BB3 RET
四、算术类程序 例4.7: 多字节无符号数加法 入口: (R0)=被加数低位地址指针 (R1)=加数低位地址指针 (R2)=字节数 出口: (R0)=和的高位地址指针
程序: ADDBIN: CLR C LOOP1: MOV A,@R0 ;取被加数 ADDC A,@R1 ;两数相加 MOV @R0,A INC R0 INC R1
DJNZ R2,LOOP1 ;字节未完转 JNC LOOP2 ;无进位转 MOV @R0,#01H ;最高有进位 RET LOOP@: DEC R0 ;无进位,指针回指 RET
例4.8:多字节无符号数减法 入口: (R0)=被减数低位字节地址指针 (R1)=减数低位字节地址指针 (R2)=字节数 出口: (R0)=差的地字节 (R3)=差值的字节数 07H =存放符号位
程序: SUBBIN: PUSH PSW CLR C ;清标志位 CLR 07H MOV R3,#00H LOOP3: MOV A,@R0 SUBB A,@R1 ;取数做减法 MOV R0,A INC R0 INC R1 INC R3
DJNZ R2,LOOP3;未减完转 JNB CY,LOOP4 ;有无借位 SETB 07H ;差为负,标志为1 LOOP4:POP PSW ;恢复CY标志 RET
例4.9: 双字节无符号数乘法子程序 设 被乘数 a,b => R7R6 乘 数 c,d => R5R4 乘 积 4字节 => 片内 RAM @R0,@(R0+1), @(R0+2),@(R0+3) 1)方法:与十进制乘法运算方法相同,把运算变 成字节运算。 2)框图:
进位 R1 被乘数低8位送A adL+bdH R3 乘数低8位送B 被乘数高8位送A adH+cy R2 b×d 乘数高8位送B 被乘数低8位送A bdL @R0 乘数高8位送B a×c bdH R3 c×b acL+adH+bcH @(R0+2) 乘数低8位送A bcL+adL+bdH @(R0+1) 被乘数高8位送B adH+bcH+cy R2 acH+cy @(R0+3) a×d 有进位? N 返回 Y 图4-2 双精度无符号数乘法子程序
3)程序: MUL: MOV A,R6 ;b (A) MOV B,R4 ;d (B) MUL AB ;b×d MOV @R0,A ;bdL @R0 MOV R3,B ;bdH (R3) MOV A,R4 ;a×d (B,A) MOV B,R7 MUL AB ADD A,R3 MOV R3,A ;bdH + adL (R3) MOV A,B
ADDC A,#00H ;adH + Cy (R2) MOV R2,A MOV A,R6 ;c×b (B,A) MOV B,R5 MUL AB ADD A,R3 ;bdH + adL + bcL @(R0+1) INC R0 MOV @R0,A MOV R1,#00H MOV A,R2 ;adH + bcH + Cy (R2) ADDC A,B MOV R2,A
JNC LAST ;判断是否有进位? INC R1 ;有进位,进位 (R1) LAST:MOV A,R7 ;若无进位,a×c (B,A) MOV B,R5 MUL AB ADD A,R2 ;adH + bcH + acL @(R0+2) INC R0 MOV @R0,A MOV A,B ;acH + Cy @(R0+3) ADDC A,R1 INC R0 MOV @R0,A RET
例 4.10 :无符号二进制数除法 设:被除数 4字节 => R2R3R4R5 除 数 2字节 => R6R7 商 2字节 => R4R5 余 数 2字节 => R2R3 1)方法:除法运算分解成减法和移位操作来 实现。 2)框图:
Y (R2R3)>?(R6R7) N 16B 0CY 1F0 R2R3R4R5CY左移一位 CF0 (R2R3)-(R6R7)AR1 Y F0=?1 N Y C=?1 N (AR1)(R2R3 ) (R5+1)R5(商1) (B)-1=?0 N Y 0F0 返回 图4-3 无符号二进制数除法
3)程序: NDIV1:MOV A,R3 ;判断是否产生溢出? CLR C SUBB A,R7 MOV A,R2 SUBB A,R6 JNC NDVE1 ;(R2R3)>(R6R7),产生溢出,退出 MOV B,#16 ;( R2R3)<(R6R7),无溢出,计算 NDVL1:CLR C ; 被除数左移一位 MOV A,R5 ; R5·0=0,商“0”. RLC A