C51汇编语言程序设计.ppt
第第4章章 80C51汇编语言汇编语言程序设计程序设计4.1 4.1 概述概述汇编语言程序设计的步骤汇编语言程序设计的步骤 分析问题分析问题 确定算法确定算法 画出程序流程图画出程序流程图 分配内存单元分配内存单元 编写汇编语言源程序编写汇编语言源程序 汇编语言程序的调试汇编语言程序的调试4.1 4.1 概述概述汇编语言编程的注意事项汇编语言编程的注意事项 编写程序时应尽量使程序简短及缩短运行时间;编写程序时应尽量使程序简短及缩短运行时间;应尽量采用循环结构和子程序;应尽量采用循环结构和子程序;尽量少用无条件转移指令;尽量少用无条件转移指令;在设计程序时,还要考虑程序与数据的存放地在设计程序时,还要考虑程序与数据的存放地 址;址;对于通用子程序,要考虑保护现场;对于通用子程序,要考虑保护现场;对于中断处理,除了保护处理程序中用到的寄存对于中断处理,除了保护处理程序中用到的寄存 器外,还要保护程序状态字;器外,还要保护程序状态字;充分利用累加器。充分利用累加器。4.2 4.2 基本结构程序设计基本结构程序设计 程序设计的基本结构有:顺序结构、分支结构和循环结构。程序设计的基本结构有:顺序结构、分支结构和循环结构。4.2.1 顺序结构程序顺序结构程序例例4-2 将将30H单元的单元的2个个BCD码拆开并分别存入到码拆开并分别存入到31H和和32H 单元中。单元中。解:方法一:先把解:方法一:先把30H中低中低4位位BCD码交换出来,存入码交换出来,存入31H 中,再把高中,再把高4位位BCD码交换到低码交换到低4位存入位存入32H中。中。4.2 4.2 基本结构程序设计基本结构程序设计方法一:方法一:ORG 0000H LJMP MAIN ORG 0030HMAIN:MOV R0,#32H MOV R0,#00H MOV A,30H XCHD A,R0 SWAP A MOV 31H,A SJMP$END 见见42 a方法二:方法二:ORG 0000H LJMP START ORG 0030HSTART:MOV A,30H ANL A,#0FH MOV 31H,A MOV A,30H ANL A,#0F0H SWAP A MOV 32H,A SJMP$END 见见 42 b4.2 4.2 基本结构程序设计基本结构程序设计4.2.2 分支结构分支结构例例-两个单字节无符号数比较大小。两个单字节无符号数比较大小。设两个单字节无符号数分别存在内部设两个单字节无符号数分别存在内部 RAM 30H 和和31H 单元中,找出其中的大单元中,找出其中的大 数存入数存入32H 单元中。单元中。解:两个单字节无符号数比较大小的方解:两个单字节无符号数比较大小的方法通常是做减法,然后根据是否产生借位法通常是做减法,然后根据是否产生借位判断大小。还有一点要注意:累加器判断大小。还有一点要注意:累加器 在在减法运算前装的是被减数,减法运算后装减法运算前装的是被减数,减法运算后装的是差。思路框图如图的是差。思路框图如图-所示。所示。4.2 4.2 基本结构程序设计基本结构程序设计 ORG 0000H LJMP START ORG 0030HSTART:MOV R0,#30H MOV A,R0 INC R0 CLR C SUBB A,R0 JC BIG2 ADD A,R0 SJMP NEXT BIG2:MOV A,R0NEXT:INC R0 MOV R0,A SJMP$END4.2 4.2 基本结构程序设计基本结构程序设计例:例:4-5编程实现函数编程实现函数,已知已知(30H)=x,(31H)=y 。1 x 0 0 x0 1 x 0 解:算法:先判解:算法:先判x0,再判另外的两种情况。,再判另外的两种情况。程序框图程序框图:程序程序:ORG 0050H MOV A,30H JNZ LOP1 ;x0转移转移 MOV 31H,#00H SJMP NEXT LOP1:JB ACC.7,LOP2 ;x 0转移转移 MOV 31H,#01H SJMP NEXTLOP2:MOV 31H,#0FFHNEXT:SJMP$ENDy4.2 4.2 基本结构程序设计基本结构程序设计例:例:4-6例:某单片机应用系统中有例:某单片机应用系统中有8个按键,扫描后得到的键个按键,扫描后得到的键号,存放在号,存放在R2中,中,8个按键的处理程序的入口分别为个按键的处理程序的入口分别为KEY0、KEY1、.KEY7,请编写程序。,请编写程序。解:根据已知条件得到以下框图:解:根据已知条件得到以下框图:难点:无专用的多分支指令。难点:无专用的多分支指令。解决方法:用散转指令和转移指令配合使用。解决方法:用散转指令和转移指令配合使用。4.2 4.2 基本结构程序设计基本结构程序设计程序程序1:用:用AJMP 和和JMP 程序程序 KEY:MOV DPTR,#TAB;转移表的首址转移表的首址 MOV A,R2 RL A JMP A+DPTR TAB:AJMP KEY0 AJMP KEY1 AJMP KEY2 AJMP KEY3 AJMP KEY4 AJMP KEY5 AJMP KEY6 AJMP KEY7 KEY0:RETKEY1:RET KEY7:RET4.2 4.2 基本结构程序设计基本结构程序设计程序程序2:用:用LJMP 和和JMP 程序程序 KEY:MOV DPTR,#TAB;转移表的首址转移表的首址 MOV A,R2 RL A ADD A,R2 JMP A+DPTR TAB:LJMP KEY0 LJMP KEY1 LJMP KEY2 LJMP KEY3 LJMP KEY4 LJMP KEY5 LJMP KEY6 LJMP KEY7 KEY0:RETKEY1:RET KEY7:RET4.2 4.2 基本结构程序设计基本结构程序设计4.2.3 循环结构程序循环结构程序例:对内部例:对内部RAM 30H3FH清零,请编程。清零,请编程。解:解:ORG 0000H LJMP START ORG 0050HSTART:MOV R0,#30H ;R0指向指向30H MOV R7,#16 ;设定循环次数设定循环次数 LOP:MOV R0,#00H INC R0 DJNZ R7,LOP SJMP$END4.2 4.2 基本结构程序设计基本结构程序设计例:例:4-10 设计一个延时设计一个延时50ms的程序的程序 DEL :MOV R7,#200 DEL1:MOV R6,#123 NOP DEL2:DJNZ R6,DEL2 DJNZ R7,DEL1 RET 4.2 4.2 基本结构程序设计基本结构程序设计4.3 子程序设计子程序设计例:例:4-9已知已知(30H)=x,(31H)=y,(32H)=f,实现函数实现函数 f小于小于255DL:MOV DPTR,#TAB MOVC A,A+DPTR RETTAB:DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H DB 64H,79H,90H,0A9H END ORG 0000H AJMP START ORG 0050HSTART:MOV A,30H LCALL DL MOV 32H,A MOV A,31H LCALL DL ADD A,32H MOV 32H,A SJMP$4.2 4.2 基本结构程序设计基本结构程序设计4.2 4.2 基本结构程序设计基本结构程序设计