1 / 55

第四章 程序设计举例

第四章 程序设计举例. 4.1 汇编语言源程序的编辑与汇编 4.2 程序设计. 4.1 汇编语言源程序的编辑与汇编 4.1.1 源程序编辑 微机上完成(各种工具软件) 例如: MASM 、 Keil C51 4.1.2 源程序的汇编 手工汇编 机器汇编. 4.1.3 伪指令 1. 汇编起始命令 格式: [ 标号: ] ORG 16 位地址 功能: 规定该指令后程序的汇编地址。 2. 汇编结束命令 格式: [ 标号: ] END 功能: 表示源程序结束。. 3. 赋值命令

vanya
Download Presentation

第四章 程序设计举例

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章 程序设计举例 4.1 汇编语言源程序的编辑与汇编 4.2 程序设计

  2. 4.1 汇编语言源程序的编辑与汇编 4.1.1 源程序编辑 微机上完成(各种工具软件) 例如:MASM、Keil C51 4.1.2 源程序的汇编 手工汇编 机器汇编

  3. 4.1.3 伪指令 1. 汇编起始命令 格式:[标号:] ORG 16位地址 功能:规定该指令后程序的汇编地址。 2. 汇编结束命令 格式:[标号:] END 功能:表示源程序结束。

  4. 3. 赋值命令 格式:字符名称 EQU 数或汇编符号 功能:将一个数或特定的汇编符号赋予规 定的字符名。 EQU定义的字符名必须先定义后使用。 4. 数据地址赋值命令 格式:字符名称 DATA 表达式 功能:将数据地址或代码地址赋予规定的 字符名称。

  5. 与EQU的差别: (1)EQU定义的字符名必须先定义后使用,而DATA定义的字符名可以后定义先使用。 (2)用EQU可将一个汇编符号赋给一个字符名,而DATA只能把数据赋给字符名。 (3)DATA语句可将一表达式的值赋给字符名称,其表达式应是可求值的。

  6. 5. 定义字节命令 格式:[标号:] DB 8位二进制数表 功能:从指定的地址单位开始,定义若干个8 位内存单元的内容。 6. 定义字命令 格式:[标号:] DW 16位数表 功能:从指定地址开始定义若干16位数据。

  7. 7. 定义存储空间命令 格式:[标号:] DS 表达式 功能:从指定地址开始保留若干字节地址空间 作备用。 注意:DB、DW、DS伪指令只对程序存储器起作 用,不能对数据存储器进行赋值或其它 初始化工作。 8. 位地址符号命令 格式:字符名 BIT 位地址 功能:把BIT之后的位地址赋给字符名。

  8. 4.2 编程的步骤、方法和技巧 4.2.1 编程步骤 1 分析问题 2 确定算法 3 画程序流程图 4 编写程序

  9. 89C51汇编语言编写的源程序行(一条语句)包括4个部分:89C51汇编语言编写的源程序行(一条语句)包括4个部分: [标号:] [操作码] [操作数] ;注释 操作数字段中的专门符号: $ 用来表示程序计数器的当前值

  10. 4.2.2 程序设计 根据单片机的特点和实际问题的要求进行程序 设计。 一. 查表程序设计 MCS-51指令系统给用户提供了两条查表指令: MOVC A, @A+DPTR MOVC A, @A+PC

  11. 例4.1:用程序实现C = a2 + b2 设a、b、c分别存入片内RAM中的DA、DB、DC三 个单元。 • 方法一: 子程序: 功能:求给定值的平方值。 入口参数:给定值存放在A累加器中。 出口参数:所求的平方值存放在A累加器中。

  12. SQR1: INC A MOVC A,@A+PC RET TAB: DB 0, 1, 4, 9,16 DB 25,36,49,64,81

  13. 主程序: 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 $

  14. 方法二: 子程序: 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

  15. 例4.2:输入为1个ASCII码命令字符,按其输入的命令字符,转去执行对应的处理程序。例4.2:输入为1个ASCII码命令字符,按其输入的命令字符,转去执行对应的处理程序。 设命令字符为‘A’,‘D’,‘E’,‘L’,‘M’,‘X’,‘Z’,七种,对应的处理程序入口地址为XA,XD,XE,XL,XM,XX,XZ。

  16. 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

  17. 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 。

  18. 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 ;转处理程序。

  19. LNF5:INC DPTR ;修改地址指针 INC DPTR SJMP LOP5 LEND: . . .

  20. 二、散转程序设计 MCS-51指令系统提供间接转移指令 JMP @A+DPTR 实现散转功能。 例4.3:128种分支转移程序。

  21. 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

  22. 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,翻页

  23. 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

  24. TBL9: DW PRG0 DW PRG1 . . DW PRGn

  25. 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)

  26. 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)

  27. TBL10: DW PRG0 DW PRG1 . . DW PRGn

  28. 三、代码转换 例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

  29. DIV AB ;余数/10,商为十位 SWAP A ;十位数存到A的高位 ADD A,B ;十位数加个位数 MOV TENONE,A ;保存 RET

  30. 例4.5: 二进制码装换为ASCII码 由ASCII码表可知: 二进制码转换为ASCII码的方法是 1. ASCII码=4位二进制数(<10)+30H 2. ASCII码=4位二进制数(>=10)+37H 程序如下:

  31. 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

  32. 例4.6:多字节二进制数转换为BCD数。 1>转换方法:若将16位二进制数转换为十进制数时, (N)D= a15×215 + a14 ×214 +….+ a0 ×20 =(…(((a15 ×2)+a14) ×2+a13) ×2+…) ×2+a0 2>框图:

  33. 开始 清BCD数单元 置二进制数的位数 置二进制数低位地址,置二进制字节数 二进制数左移 N 字节数到? Y BCD数×2+进位位 十进制数调整 N 字节数到? Y N 位数到? Y 图4-1 多字节二翻十子程序框图 结束

  34. 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

  35. 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

  36. BB2:MOV A,@R1 ;BCD数×2+进位 ADDC A,@R1 DA A MOV @R1,A INC R1 DJNZ R2,BB2 DJNZ R3,BB3 RET

  37. 四、算术类程序 例4.7: 多字节无符号数加法 入口: (R0)=被加数低位地址指针 (R1)=加数低位地址指针 (R2)=字节数 出口: (R0)=和的高位地址指针

  38. 程序: ADDBIN: CLR C LOOP1: MOV A,@R0 ;取被加数 ADDC A,@R1 ;两数相加 MOV @R0,A INC R0 INC R1

  39. DJNZ R2,LOOP1 ;字节未完转 JNC LOOP2 ;无进位转 MOV @R0,#01H ;最高有进位 RET LOOP@: DEC R0 ;无进位,指针回指 RET

  40. 例4.8:多字节无符号数减法 入口: (R0)=被减数低位字节地址指针 (R1)=减数低位字节地址指针 (R2)=字节数 出口: (R0)=差的地字节 (R3)=差值的字节数 07H =存放符号位

  41. 程序: 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

  42. DJNZ R2,LOOP3;未减完转 JNB CY,LOOP4 ;有无借位 SETB 07H ;差为负,标志为1 LOOP4:POP PSW ;恢复CY标志 RET

  43. 例4.9: 双字节无符号数乘法子程序 设 被乘数 a,b => R7R6 乘 数 c,d => R5R4 乘 积 4字节 => 片内 RAM @R0,@(R0+1), @(R0+2),@(R0+3) 1)方法:与十进制乘法运算方法相同,把运算变 成字节运算。 2)框图:

  44. 进位 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 双精度无符号数乘法子程序

  45. 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

  46. 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

  47. 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

  48. 例 4.10 :无符号二进制数除法 设:被除数 4字节 => R2R3R4R5 除 数 2字节 => R6R7 商 2字节 => R4R5 余 数 2字节 => R2R3 1)方法:除法运算分解成减法和移位操作来 实现。 2)框图:

  49. Y (R2R3)>?(R6R7) N 16B 0CY 1F0 R2R3R4R5CY左移一位 CF0 (R2R3)-(R6R7)AR1 Y F0=?1 N Y C=?1 N (AR1)(R2R3 ) (R5+1)R5(商1) (B)-1=?0 N Y 0F0 返回 图4-3 无符号二进制数除法

  50. 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

More Related