1 / 16

MCS-51 单片机原理及应用教程

MCS-51 单片机原理及应用教程. 清华大学出版社 刘迎春 主编. 第 4 章 单片机的程序设计. u 伪指令 u 汇编语言源程序的编辑与汇编 u 汇编语言程序设计. 4.1 伪 指 令. 有一些指令,如指定目标程序或数据存放的地址、给一些指定的标号赋值、表示源程序结束等指令,并不产生目标程序 ( 机器码 ) ,也不影响程序的执行,仅仅产生供汇编用的某些命令,用来对汇编过程进行某种控制或操作,这类指令称为 伪指令 。. 4.1.1 定义起始地址伪指令. 格式: ORG addr16

cahil
Download Presentation

MCS-51 单片机原理及应用教程

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. MCS-51 单片机原理及应用教程 清华大学出版社 刘迎春 主编

  2. 第4章 单片机的程序设计 u伪指令 u汇编语言源程序的编辑与汇编 u汇编语言程序设计

  3. 4.1 伪 指 令 有一些指令,如指定目标程序或数据存放的地址、给一些指定的标号赋值、表示源程序结束等指令,并不产生目标程序(机器码),也不影响程序的执行,仅仅产生供汇编用的某些命令,用来对汇编过程进行某种控制或操作,这类指令称为伪指令。 4.1.1 定义起始地址伪指令 格式:ORG addr16 功能:规定程序块或数据块存放的起始地址。addr16表示一个16位的程序存储器的空间地址,一般为一个确定的地址,也可以是事先定义的标号。例如: ORG 2000H START: MOV A, 30H …

  4. 4.1.2 定义汇编结束伪指令 格式:END 功能:表示汇编结束 4.1.3 标号赋值伪指令 格式:标号 EQU [表达式] 功能:将表达式的值赋给本语句中的标号。又称为等值指令。 4.1.4 定义字节伪指令 格式:标号: DB [字节表] 功能:从标号指定的地址单元开始,在程序存储器中定义字节数据。

  5. 4.1.5 定义字伪指令 格式:标号: DW [字表] 功能:从标号指定的地址单元开始,在程序存储器中存储字数据。 4.1.6 预留存储区伪指令 格式:标号: DS 表达式 功能:从标号指定的地址单元开始,定义一个存储区,以备源程序使用。存储区内预留的存储单元数由表达式的值决定。 例如: ORG 3030H TIMER: DS 10H ┇

  6. 4.2 汇编语言源程序的编辑与汇编 4.2.1 源程序的编辑 编写完成的源程序应以“.ASM”的扩展名保存,以备汇编程序调用。 4.2.2 源程序的汇编 4.3 汇编语言程序设计

  7. 4.3.1 顺序程序 例1 已知X、Y、Z分别为片内RAM 30H、31H、32H单元的内容,设X>Y,试编程完成下式的算术运算:S=(X-Y)*Z, 并将计算结果S存入片内RAM 34H(高字节)、35H(低字节)单元中。 由于X>Y,所以X-Y>0,不需要借位;(X-Y)*Z的结果最多占用两个字节。实现该要求的程序流程图如图4.2所示。

  8. 程序清单如下: ORG 0030H START: MOV A, 30H ;(A)←X SUBB A, 31H ;(A)←(A)-X MOV B, 32H ;(B)←Z MUL AB MOV 34H, B ;(34H)←A*B的高字节 MOV 35H, A ;(35H)←A*B的低字节 SJMP $

  9. 例2 编写双字节无符号数乘法程序。被乘数高字节放在R2中,低字节存放在R3中,乘数高字节放在R6中,低字节放在R7中。乘积在R2、R3、R4、R5中。 MUL AB ADD A, R4 ;累加部分积 MOV R4, A MOV A, R3 ADDC A, B MOV R3, A CLR A RLC A XCH A, R2 ;R2×R6 MOV B, R6 MUL AB ADD A, R3 ;累加部分积 MOV R3, A MOV A, R2 ADDC A, B MOV R2, A 程序段如下: MOV A, R3 ;R3×R7 MOV B, R7 MUL AB MOV R4, B ;暂存部分积 MOV R5, A MOV A, R3 MOV B, R6 ;R3×R6 MUL AB ADD A, R4 ;累加部分积 MOV R4, A CLR A ADDC A, B MOV R3, A MOV A, R2 ; R2×R7 MOV B, R7

  10. 4.3.2 分支程序 例1在内部RAM单元的30H和31H中各有一无符号数,试比较其大小,大数存入40H单元,小数存入41H单元,若相等则存入42H单元。程序流程框图如图4.3所示。

  11. 程序如下: MOV A, 30H CJNE A, 31H, K1 MOV 42H, A AJMP WAIT K1: JNC K2 MOV 41H, A MOV 40H, 31H AJMP WAIT K2: MOV 40H, A MOV 41H, 31H WAIT: AJMP $

  12. 4.3.3 循环程序 循环程序的流程如图4.4所示。

  13. 例2 在内部RAM30H开始的连续单元中,存放着20个无符号数,编写一段程序,使这20个数按照由大到小的顺序依次排列。 MOV R0, #30H MOV R7, #19 ;设置外循环计数器 OUTSIDE: MOV R6, 00H ;设置内循环计数器 PUSH 00H ;0组R0进栈 MOV A, @R0 ;取内循环的第一个数 INSIDE: INC R0 ;修改内循环间址指针 MOV B, @R0 CJNE A, B, $+3 ;比较A与@R0的大小 JNC NEXTCH ;大于等于不交换 XCH A,R0 ;小于交换 NEXTCH: DJNZ R6, INSIDE ;判内循环是否结束 POP 00H ;内循环结束,R0出栈 MOV @R0, A ;存内循环的最大值 INC R0 ;修改外循环指针 DJNZ R7, OUTSIDE ;判外循环是否结束 SJMP $

  14. 4.3.4 子程序 2. 子程序举例 例1将单字节16进制整数转换成单字节BCD码整数的子程序。 入口条件:待转换的单字节16进制整数在累加器A中。 出口状态:转换后的BCD码整数(十位和个位)仍在累加器A中,百位在R3中。 CHBCD: PUSH PSW ;保护现场 PUSH B MOV B, #100 DIV AB ;(A)←BCD码的百位 MOV R3, A ; (R3)←BCD码的百位 MOV A, #10 ;余数继续分离十位和个位 XCH A, B DIV AB ;(A)←BCD码的十位 SWAP A ORL A, B ;将十位和个位拼装成BCD码 POP B ;恢复现场 POP PSW RET

  15. 例3将4位二进制数转换成ASCII码。 入口条件:待转换的4位二进制数存入R2中。 出口状态:转换后的ASCII码存R2中。 ASCB: PUSH PSW ;保护现场 PUSH A MOV A, R2 ANL A, #0FH ;取出四位二进制数 PUSH A ;存入堆栈 CLR C SUBB A, #0AH POP A ;弹回A中 JC LOOP ;该数小于10,则转LOOP ADD A, #07H ;否则加07H LOOP: ADD A, #30H ;加30H MOV R2, A ;转换后的ASCII码存入R2 POP A ;恢复现场 POP PSW RET

  16. 4.4 思考练习题 (1)简述汇编语言的特点。 (2)什么是伪指令?简述常用伪指令的功能。 (3)按照执行的方式,程序可分为哪几类? (4)在编写子程序时,应注意哪些问题? (5)编写一段程序,将外部RAM中2000H~2020H单元的内容送入内部RAM的30H~50H单元中。 (6)编写程序,求出片内40H单元内容中所有“0”的个数,结果存入50H。 (7)在内部RAM单元30H开始的5个单元中,存放着5个压缩BCD码,编写一段程序,将它们转换成ASCII码,并存放到40H开始的单元中。 (8)编程求出内部RAM中从30H开始的连续20个单元中的内容的平均值,并存入60H单元中。 (9)编程完成以下功能:检测内部RAM单元30H开始的32个数,若为正数或0,则值不变;若为负数,则取补后送回。 (10)在内部RAM单元中,从30H开始连续存放着20个8位无符号数,编程排列其顺序,使它们从20H单元开始,按照从大到小的顺序依次存放。

More Related