




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 3.5 MCS-51系列单片机系列单片机 -汇编程序设计汇编程序设计 1、汇编语言程序设计步骤汇编语言程序设计步骤 2、顺序程序顺序程序 3、分支程序分支程序 4、循环程序循环程序 5、子程序子程序主要内容主要内容1、汇编语言程序设计步骤、汇编语言程序设计步骤1分析问题分析问题2确定算法确定算法3设计程序流程图设计程序流程图4分配内存单元分配内存单元5编写汇编语言源程序编写汇编语言源程序6调试程序调试程序画流程图 画流程图是指用各种图形、符号、指向线等来说明程序设计的过程。国际通用的图形和符号说明如下: 椭圆框:起止框,在程序的开始和结束时使用。矩形框:处理框,表示要进行的各种操作。菱形框:
2、判断框,表示条件判断,以决定程序的流向。指向线:流程线,表示程序执行的流向。圆 圈:连接符,表示不同页之间的流程连接。各种几何图形符号如下图所示。2、顺序程序、顺序程序 顺序程序是一种最简单,最基本的程序。特点:程序按编写的顺序依次往下执行每一条指令,直到最后一条。 【例1】 将30H单元内的两位BCD码拆开并转换成ASCII码,存入RAM 两个单元中。程序流程如图1所示。结束取数据低4位转换成ASCII码存ASCII码取数据高4位转换成ASCII码存ASCII码开始图1 拆字程序流程图ORG 0100HMOV A,30H;取值;取值ANL A,#0FH ;取低;取低4位位ADD A,#30H
3、 ;转换成;转换成ASCII码码MOV 32H,A;保存结果;保存结果MOV A,30H;取值;取值SWAPA;高;高4位与低位与低4位互换位互换ANL A,#0FH ;取低;取低4位(原来的高位(原来的高4位)位)ADD A,#30H ;转换成;转换成ASCII码码MOV 31H,A;保存结果;保存结果 SJMP$ 3、分支程序、分支程序1分支程序的基本形式分支程序有三种基本形式,如图3所示。分支程序的设计要点如下:(1)先建立可供条件转移指令测试的条件。 (2)选用合适的条件转移指令。(3)在转移的目的地址处设定标号。在MCS-51指令系统中条件转移指令有?判A转移指令JZ、JNZ;判位转
4、移指令JB、JNB、JBC、JC、JNC;比较转移指令CJNE;散转指令:JMP A+DPTR条件满足?AYN(a)条件满足?ABNY(b)(c)A0A1AnK=0 K=1 K=nK=?图3 分支程序结构流程图【例例2】比较两个无符号数的大小。比较两个无符号数的大小。 设设外部外部 RAM 的存储单元的存储单元 ST1和和 ST2中存放两中存放两个不带符号的二进制数个不带符号的二进制数, 找出其中的大数存入外部找出其中的大数存入外部 RAM 中的中的 ST3单元中。单元中。 2分支程序设计举例分支程序设计举例程序如下:程序如下: ORG 1000H ST1 EQU 2000H ST2 EQU
5、2100H ST3 EQU 2200H START: MOV DPTR, ST1 ; 第一个数的指针第一个数的指针 MOVX A, DPTR ; 取第一个数取第一个数 MOV R2, A ; 保存保存 MOV DPTR, ST2 ; 第二个数的指针第二个数的指针 MOVX A, DPTR ; 取第二个数取第二个数 CLR C SUBB A, R2; 两数比较两数比较JNC BIG1 ; 若第二个数大若第二个数大, 则转则转XCH A, R2; 第一个数大第一个数大BIG0: MOV DPTR, ST3 MOVX DPTR, A ; 存大数存大数RETBIG1: MOVX A, DPTR; 第二
6、个数大第二个数大SJMP BIG0RET 3双向分支程序设计举例双向分支程序设计举例【例例3】 设设X存在存在30H单元中,根据下式单元中,根据下式 X+2 X0Y = 100 X=0 X X0Y= 100 X=0 X X0求出求出Y值,并将值,并将Y值放回原处。值放回原处。解:程序流程解:程序流程如图如图8所示所示。A=0?YYNNYNA为负数?取数,A(R1)开始结束A XA64HAX+2存数,(R1)A(30H)设置地址指针R1、计数器R0初值R1R1+1;R0R0-1R0=0?图8 例5的程序流程图参考源程序如下:参考源程序如下:ORG 0100H MOV R0,#10 ;循环初值循环
7、初值 MOV R1,#30H ;R1作为地址指针作为地址指针 START:MOV A,R1 ;取数;取数 JBACC.7,NEG ;若为负数,转;若为负数,转NEG JZZER0 ;若为零,转;若为零,转ZER0 ADDA,#02H ;若为正数,求;若为正数,求X+2 AJMP SAVE ;转到;转到SAVE,保存数据,保存数据 ZER0:MOV A,# 64H ;数据为零,;数据为零,Y=100 AJMP SAVE;转到;转到SAVE,保存数据,保存数据 NEG: DECA CPLA;求;求 X SAVE:MOV R1,A ;保存数据;保存数据 INC R1;地址指针指向下一个地址;地址指针
8、指向下一个地址 DJNZR0,START;数据未处理完,继;数据未处理完,继续处理续处理 SJMP;暂停;暂停终止循环控制可以采用计数的方法,即用一个寄存器终止循环控制可以采用计数的方法,即用一个寄存器作为循环次数计数器,每次循环后计数加作为循环次数计数器,每次循环后计数加1或减或减1,达,达到终止值后退出循环。到终止值后退出循环。P81 例例 4.7 已知单片机使用的晶振为已知单片机使用的晶振为12MHz,要求设计一个软件延时程序,延时时间为要求设计一个软件延时程序,延时时间为1ms. DELAY: MOV R0, #10 DL2: MOV R1, #24 DL1: NOP NOP DJNZ
9、 R1, DL1 DJNZ R0, DL2 RET;1个机器周期个机器周期;1个机器周期个机器周期;1个机器周期个机器周期;1个机器周期个机器周期;2个机器周期个机器周期;2个机器周期个机器周期;2个机器周期个机器周期12练习:练习: 50ms延时程序。延时程序。若晶振频率为若晶振频率为12MHz,则一个机器周期为,则一个机器周期为1s。执行一条。执行一条DJNZ指令需要指令需要2个机器周期,即个机器周期,即 2s。采用循环计数法实现延时,循。采用循环计数法实现延时,循环次数可以通过计算获得。环次数可以通过计算获得。 DEL:MOV R7,#200 ;1 sDEL1:MOV R6,#123 ;
10、1 s NOP ;1 sDEL2:DJNZ R6,DEL2 ;2s,计(,计(2123)s DJNZ R7,DEL1 ;2s, 共计共计 (21232 2)200+1 s,即,即50.001ms 5、子程序1子程序子程序概念概念 所谓调用子程序,暂停主程序的执行,而转所谓调用子程序,暂停主程序的执行,而转到子程序的入口地址去执行子程序。到子程序的入口地址去执行子程序。如图如图10所示所示。调用子程序应注意:调用子程序应注意:(1)子程序占用的存储单元和寄存器(保护现场)。)子程序占用的存储单元和寄存器(保护现场)。 (2)参数的传递)参数的传递(寄存器、存储单元、堆栈寄存器、存储单元、堆栈)。
11、(3)嵌套调用与递归调用。)嵌套调用与递归调用。如图如图11所示所示。RETLCALL SUB图10 子程序的调用与返回 LCALL ARETRETLCALL B 图11 子程序的嵌套调用与返回避免重复编程简化程序的逻辑结构缩短程序长度,节省存储单元便于调试、增强可移植性好处:好处:子程序编写注意的问题 子程序调用子程序调用: ACALL、 LCALL 子程序返回子程序返回: RET 子程序第一条必须有标号子程序第一条必须有标号. 注意现场的保护和恢复注意现场的保护和恢复 正确传递参数正确传递参数: 入口参数和出口参数入口参数和出口参数.64k范围内2k范围内2子程序设计举例子程序设计举例【例
12、例6】 将例将例5改为子程序结构。改为子程序结构。解:数据块中的十个数都需要进行符号判解:数据块中的十个数都需要进行符号判断并作相应处理,可把一部分工作交给断并作相应处理,可把一部分工作交给子程序完成,主程序只负责读取数据、子程序完成,主程序只负责读取数据、调用判断处理子程序、保存数据、循环调用判断处理子程序、保存数据、循环控制工作。控制工作。ORG0100HMOV R0,#10MOV R1,#30HSTART:MOV A,R1;取数;取数ACALL DISPOSE ;调用判断、处理子程序;调用判断、处理子程序SAVE: MOV R1,A;保存数据;保存数据INCR1;修改地址指针,指向下一个
13、地址;修改地址指针,指向下一个地址DJNZR0,START ;数据未处理完,继续处理;数据未处理完,继续处理SJMP ;暂停;暂停ORG0200HDISPOSE:JB ACC.7,NEG ;若为负数,转;若为负数,转NEG JZZER0;若为零,转;若为零,转ZER0ADDA,#02H;若为正数,求;若为正数,求X+2AJMP BACK;转到;转到SAVE,保存数据,保存数据ZER0:MOV A,#64H;数据为零,;数据为零,Y=100 AJMP BACK;转到;转到SAVE,保存数据,保存数据NEG:DECACPLA;求;求 X BACK:RET 1、200名学生参加考试,成绩放在外部RA
14、M从EG单元开始的一个连续存储单元中,95100分颁发A级证书,9094分颁发B级证书,编一程序,统计获编一程序,统计获A、B级级证书的人数证书的人数。将结果分别存入内部RAM的GA,GB两个单元中。练习:练习: MOV GA,#00 MOV GB,#00 MOV DPTR,#EG MOV R2,#200LOOP:MOVX A,DPTR CJNE A,#95, LOOP1 LOOP1: JNC NEXT1 CJNE A,#90,LOOP2LOOP2: JC NEXT INC GB SJMP NEXTNEXT1: INC GANEXT: INC DPTR DJNZ R2,LOOP SJMP $2
15、、将片外RAM中2000H开始的16个数据依次传入片内30H始的16个单元内。 MOV R0, #30H MOV DPTR, #2000H MOV R7, #10HLOOP: MOVX A, DPTR MOV R0, A INC R0 INC DPTR DJNZ R7, LOOP查表程序的设计MOVC A , A+DPTRMOVC A , A+PC主要用于主要用于: 复杂代码转换显示复杂代码转换显示 数据补偿:传感器补偿数据补偿:传感器补偿 复杂函数计算:复杂函数计算: Y=SIN(X)用DB、DW建立表格首地址送DPTR关键字送A查表:MOVC A,A+DPTR 使用 MOVC A,A+PC
16、须注意:1. 使用传送指令将关键字送入ACC2. ADD A, #DATA指令对A进行修改3. MOVC A,A+PC 完成查表.DATA=表格首地址表格首地址-MOVC指令指令地址地址-1【例例7】 : MOV A, X ADD A,#01H MOVC A,A+PC RET DB 00,01,04,09,10H,19H,24H,31H,30HDATA=表格首地址表格首地址-指令地址指令地址-1即:即:MOVC与与DB之间的字节数之间的字节数 【例例8】 一个十六进制数存放在内部 RAM 的 HEX单元的低 4 位中, 将其转换成ASCII码并送回 HEX单元。 十六进制 09的ASCII码为
17、 30H39H, AF的ASCII码为41H46H, ASCII码表格的首地址为ASCTAB。编程如下: ORG 0000H HEXASC: MOV A, HEX ANL A, 0FH ADD A, 3; 修改指针 MOVC A, A+PC MOV HEX, A RET ASCTAB: DB 30H, 31H, 32H, 33H, 34H DB 35H, 36H, 37H, 38H, 39H DB 41H, 42H, 43H, 44H, 45H DB 46H 在这个程序中, 查表指令MOVC A, A+PC到表格首地址有两条指令, 占用 3 个字节地址空间, 故修改指针应加 3。 【例例9】编
18、写程序,实现编写程序,实现c=a2+b2 。设。设a,b,c分别存于内部分别存于内部RAM的的30H,31H,32H三个单元中。程序段如下:三个单元中。程序段如下: START:MOV A,30H ;取;取a ACALL SQR ;调用查平方表;调用查平方表 MOV R1,A ;a2 暂存于暂存于R1中中 MOV A,31H ;取;取b ACALL SQR ;调用查平方表;调用查平方表 ADD A,R1 ;a2+b2 存于存于A中中 MOV 32H,A ;存结果;存结果 SJMP $ SQR :MOV DPTR,#TAB ;子程序;子程序 MOVC A,A+DPTR ; RET TAB :DB
19、 0,1,4,9,16 ,25,36,49,64,81 【例例10】 : 将HEX单元存放的两个十六进制数分别转换成ASCII码, 并存入ASC和ASC+1 单元。 解: 由于伪指令DB在汇编后, 使字节以ASCII码形式存放, 所以采用查表子程序的方式来实现十六进制数到ASCII码的转换。 转换子程序为HASC, 调用时传递参数采用堆栈来完成。 程序清单如下: ORG 0000H PUSH HEX ; 第一个十六进制数入栈 ACALL HASC ; 调查表转换子程序 POP ASC ; 低 4 位转换值保存 MOV A, HEX ; 十六进制数送A SWAP A ; 高 4 位低 4 位交换
20、 PUSH A ; 第二个十六进制数入栈 ACALL HASC ; 调查表转换子程序 POP ASC+1 ; 高 4 位转换值保存HERE: AJMP HERE ; 结束源程序HASC: DEC SP ; DEC SP ; 修改SP到参数位置 POP A ; 弹出十六进制数到A ANL A, 0FH ; 取A低 4 位 ADD A, 07H ; 为查表进行地址调整 MOVC A, A+PC ; 查表转换 PUSH A ; 转换结果入栈 INC SP ; INC SP ; 恢复返回地址 RET ASCTAB: DB 0 1 2 3 4 5 67 DB 89 A BCDE F END1、 在内存首
21、地址为TABLE开始的十个单元中存放自然数09的平方值,任一数X在FIRST单元中,要求查表求出X的平方值,将结果放SECOBND单元。 练习:练习:2、设HWL单元中有一变量X,请编写一段程序,完成如下功能,结果Y存入GPL单元中。若X0,则Y1若X0,则Y0若X0,则Y13、将片外RAM中1000H开始的8个数据依次传入片内50H始的8个单元内。第二部分第二部分 算术逻辑处理程序算术逻辑处理程序主要内容主要内容一、加减法程序一、加减法程序二、多字节乘法程序二、多字节乘法程序三、码型转换三、码型转换 (1) (1) 十六进制数与十六进制数与ASCIIASCII码间的转换码间的转换(2) BC
22、D(2) BCD码与二进制数之间的转换码与二进制数之间的转换一、一、 加、加、 减法程序减法程序 例例 1 将40H开始存放的 10 个字节的数与 50H开始存放的10 个字节的数相减(假设被减数大于减数)。 设被减数指针为 R0, 减数指针为 R1, 差数放回被减数单元, R5 存放字节个数, 则程序如下: SUB: MOV R0, 40H ;地址指针MOV R1, 50HMOV R5, 10 ;循环计数初值CLR CSUB1: MOV A, R0SUBB A, R1MOV R0, AINC R0INC R1DJNZ R5, SUB1RET 二、多字节数乘法运算二、多字节数乘法运算例例2 双
23、字节无符号数的乘法。双字节无符号数的乘法。P.92设双字节的无符号被乘数存放在设双字节的无符号被乘数存放在R3、R2中,乘数中,乘数存放在存放在R5、R4中。中。 例例 3 假定被乘数在(R4R3)中, 乘数放在R2中, 乘积放在R7R6和R5中。 MCS - 51 中有 8 位数的乘法指令MUL, 用它来实现多字节乘法时, 可表示为 (R4R3)(R2) =(R4)28+(R3)(R2)=(R4)(R2)28+(R3)(R2)其中(R4)(R2)和(R3)(R2)都是可直接用MUL指令来实现, 而乘以28意味着左移 8 位。由此可编写如下程序: NMUL1: MOV A, R2 MOV B,
24、 R3 MUL AB ; (R3)(R2) MOV R5, A ; 积的低位送积的低位送R5 MOV R6, B ; 积的高位送积的高位送R6 MOV A, R2 MOV B, R4 MUL AB ; (R4)(R2) ADD A, R6 ; (R3)(R2)的高位加)的高位加(R4)(R2)的低位的低位MOV R6, AMOV A, B ADDC A, 00H ; (R4)(R2)的高位加)的高位加Cy MOV R7, A ; 结果送结果送R7 RET 例例4 在外部 RAM中, BLOCK开始的单元中有一无符号数据块, 其个数为 LEN个字节。试将这些无符号数按递减次序重新排列, 并存入原
25、存储区。 ORG 1000H START: MOV DPTR, BLOCK; 置地址指针 MOV P2, DPH ; P2作地址指针高字节 MOV R7, LEN ; 置外循环计数初值 DEC R7 ; 比较与交换 n-1次 LOOP0: CLR F0 ; 交换标志清 0 MOV R0, DPL; MOV R1, DPL ; 置相邻两数地址指针低字节 INC R1 MOV R6, R7 ; 置内循环计数器初值置内循环计数器初值 LOOP1: MOVX A, R0 ; 取数 MOV B, A ; 暂存 MOVX A, R1 ; 取下一个数 CJNE A, B, NEXT; 相邻两数比较, 不等转
26、 SJMP NOCHA ; 相等不交换 NEXT: JC NOCHA; Cy =1, 则前者大于后者, 不必交换 SETB F0 ; 否则, 置交换标志 MOVX R0, A ; XCH A, B ; 两数交换, 大者在前, 小者在后 MOVX R1, A ; NOCHA: INC R0 INC R1; 修改指针 DJNZ R6, LOOP1 ; 内循环未完, 则继续 JNB F0, EXIT ; 若从未交换, 则结束 DJNZ R7, LOOP0; 外循环未完, 则继续 EXIT: RET 1、十六进制数与、十六进制数与ASCII码间的转换码间的转换 十六进制数与十六进制数与ASCII码的对
27、应关系如表所示。当十码的对应关系如表所示。当十六进制数在六进制数在09之间时,其对应的之间时,其对应的ASCII码值为该十六进制码值为该十六进制数加数加30H;当十六进制数在;当十六进制数在AF之间时,其对应的之间时,其对应的ASCII码码值为该十六进制数加值为该十六进制数加37H。三、码型转换三、码型转换 例例5 将将1位十六进制数转换成相应的位十六进制数转换成相应的ASCII码。码。 设十六进制数存放在设十六进制数存放在R0中,转换后的中,转换后的ASCII 码存放码存放于于R2中。实现程序如下:中。实现程序如下:HASC:MOV A,R0 ;取;取4位二进制数位二进制数 ANL A,#0
28、FH ;屏蔽掉高;屏蔽掉高4位位 PUSH ACC ;4位二进制数入栈位二进制数入栈 CLR C ;清进(借)位位;清进(借)位位 SUBB A,#0AH ;用借位位的状态判断该数在用借位位的状态判断该数在09还是还是AF之之间间 POP ACC ;弹出原;弹出原4位二进制数位二进制数 JC LOOP ;借位位为;借位位为1,跳转至,跳转至LOOP ADD A,#07H ;借位位为借位位为0,该数在,该数在AF之间,加之间,加37H LOOP:ADD A,#30H ;该数在;该数在09之间,加之间,加30H MOV R2,A ;ASCII码存于码存于R2 RET 例例6 将多位十六进制数转换成
29、将多位十六进制数转换成ASCII码。码。 设地址指针设地址指针R0指向十六进制数低位,指向十六进制数低位,R2中中存放字节数,转换后地址指针存放字节数,转换后地址指针R0指向指向十六进制十六进制数数的高位。的高位。R1指向要存放的指向要存放的ASCII码的码的高高位地位地址。实现程序如下:址。实现程序如下:HTASC:MOV A,R0 ;取低;取低4位二进制数位二进制数 ANL A,#0FH ; ADD A,#15 ;偏移量修正;偏移量修正 MOVC A,A+PC ;查表;查表 MOV R1,A ;存;存ASCII码码 INC R1 ; MOV A ,R0 ;取十六进制高;取十六进制高4位位
30、SWAP A ANL A,#0FH ; ADD A,#06H ;偏移值修正;偏移值修正 MOVC A,A+PC ; MOV R1,A INC R0 ;指向下一单元;指向下一单元 INC R1 ; DJNZ R2,HTASC ;字节数字节数存于存于R2 RETASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H2、BCD码与二进制数之间的转换码与二进制数之间的转换 在计算机中,十进制数要用在计算机中,十进制数要用BCD码来表示。通常,码来表示。通常,用四位二进制数表示一位用四位二进制数表示一位BC
31、D码,用码,用1个字节表示个字节表示2位位BCD码(称为压缩型码(称为压缩型BCD码)。码)。例例7 单字节压缩单字节压缩BCD码转换成二进制码子码转换成二进制码子程序程序设两个BCD码d1d0表示的两位十进制数压缩存于R2,其中R2高4位存十位,低4位存个位,要把其转换成纯二进制码的算法为:( d1d0)BCD=d1*10+d0,转换后的结果存于R2BCD2B:MOV A,R2ANL A,#0F0H ;取高位;取高位BCD码码d1SWAP AMOV B,#0AHMUL AB ;d1*10MOV R3,AMOV A,R2ANL A,#0FH ; 取低位取低位BCD码码d0ADD A,R3; d
32、1*10+d0MOV R2,ARET例例8 双字节压缩双字节压缩BCD码转换成二进制码子程序码转换成二进制码子程序该转换的算法为该转换的算法为: (d3d2d1d0)BCD=(d3*10+d2)*100+(d1*10+d0)ORG 0000HLJMP MAINORG 0100HMAIN:MOV SP,#30HMOV R5,#45HMOV R4,#67HACALL BCD4BSJMP$BCD4B:MOVA,R5MOVR2,AACALL BCD2BMOVB,#64HMUL ABMOVR6,AXCH A,BMOVR5,AMOVA,R4MOVR2,AACALL BCD2BADD A,R6MOV R4,
33、AMOV A,R5ADDC A,#00HMOV R5,ARETBCD2B:MOVA,R2ANLA,#0F0HSWAPAMOVB,#0AHMULABMOVR3,AMOVA,R2ANLA,#0FHADDA,R3MOVR2,ARETEND 练习1、编写一段程序,把外部、编写一段程序,把外部RAM中中1000H1030H的内容传送到内部的内容传送到内部RAM的的30H60H中。中。2、编写程序,实现双字节无符号数加法运算,要求、编写程序,实现双字节无符号数加法运算,要求 (R1R0)+(R7R6)(61H60H)。)。3、编写子程序,将、编写子程序,将R1中的中的2个十六进制数转换为个十六进制数转换为
34、ASCII码后存放在码后存放在R3和和R4中。中。4、在内部、在内部RAM 的的21H单元开始存有一组单字节不单元开始存有一组单字节不带符号数,数据长度为带符号数,数据长度为30H,要求找出最大数存,要求找出最大数存入入BIG单元。单元。3.5 MCS-51系列单片机汇编程序设计系列单片机汇编程序设计(书上例题书上例题)3.5.1 运算程序【例例3-24】多字节无符号数加法多字节无符号数加法 设从片内RAM30H单元和40H单元有两个16字节数,把它们相加,结果放于30H单元开始的位置处(设结果不溢出)。 处理过程: 用R0作指针指向30H单元,用R1作指针指向40H单元,用R2为循环变量,初
35、值为16,在循环体中用ADDC指令把R0指针指向的单元与R1指针指向的单元相加,加得的结果放回R0指向的单元,改变R0、R1指针指向下一个单元,循环16次,在第一次循环前应先将CY清零。程序流程图和程序如下:程序:ORG 1000HMOV R0,#30HMOV R1,#40HMOV R2,#16CLR CLOOP:MOV A,R0ADDC A,R1MOV R0,AINC R0INC R1DJNZ R2,LOOPEND开始#30R0#40HR1#16R6R0+R1R0R0+1R0R1+1R1R2-1R2R2=0?结束否是【例例3-26】两字节无符号数乘法两字节无符号数乘法设被乘数的高字节放在R7
36、中,低字节放于R6中;乘数的高字节放于R5中,低字节放于R4中。乘得的积有4个字节,按由低字节到高字节的次序存于片内RAM中以ADDR为首址的区域中。 由于MCS-51单片机只有一条单字节无符号数乘法指令MUL,而且要求参加运算的两个字节须放于累加器A和B寄存器中,而乘得的结果高字节放于B寄存器中,低字节放于累加器A中。因而两字节乘法须用四次乘法指令来实现,即R6R4、R7R4、R6R5和R7R5,设R6R4的结果为B1A1,R7R4结果为B2A1,R6R5的结果为B3A3,R7R5的结果为B4A4,乘得的结果须按下面的关系加起来。R7R6R5R4B1A1B2A2B3A3B4A4C2C1C4C
37、3+即乘积的最低字节C1只由A1这部分得到,乘积的第二字节C2由B1、A2和A3相加得到,乘积的第三字节C3由B2、B3、A4以及C2部分的进位相加得到,乘积的第四字节C4由B4和低字节的进位相加得到。由于在计算机内部不能同时实现多个数相加,因而我们用累加的方法来计算C2、C3和C4部分,用R3寄存器来累加C2部分,用R2寄存器来累加C3部分,用R1寄存器来累加C4部分,另外用R0作指针来依次存放C1、C2、C3、C4入存储器。程序如下:ORG 0100HMOV R0,#ADDRMUL1:MOV A,R6MOV B,R4MUL AB ;R6R4,结果的低字节直接存入积的第一字节单元MOV R0
38、,A ;结果的高字节存入R3中暂存起来MOV R3,BMUL2:MOV A,R7MOV B,R4MUL AB ;R7R4,结果的低字节与R3相加后,再存入R3中ADD A,R3MOV R3,AMOV A,B ;结果的高字节加上进位位后存入R2中暂存起来ADDC A,#00MOV R2,AMUL3:MOV A,R6MOV B,R5MUL AB ;R6R5,结果的低字节与R3相加存入积的第二字节单元ADD A,R3INC R0MOV R0,AMOV A,R2ADDC A,B ;结果的高字节加R2再加进位位后,再存入R2中MOV R2,AMOV A,#00ADDC A,#00 ;相加的进位位存入R1
39、中MOV R1,AMUL4:MOV A,R7MOV B,R5MUL AB ;R7R5,结果的低字节与R2相加存入积的第三字节单元ADD A,R2INC R0MOV R0,AMOV A,BADDC A,R1 ;结果的高字节加R1再加进位位后存入积的第四字节单元INC R0MOV R0,AEND【例例3-27】多字节求补运算多字节求补运算 设在片内RAM 30H单元开始有一个8字节数据,对该数据求补,结果放回原位置。 在MCS-51系统中没有求补指令,只有通过取反未位加1得到。而当未位加1时,可能向高字节产生进位。因而在处理时,最低字节采用取反加1,其余字节采用取反加进位,通过循环来实现。程序:O
40、RG 0100HMOV R2,#08HMOV R0,#30HMOV A,R0CPL AADD A,#01MOV R0,ADEC R2LOOP:INC R0MOV A,R0CPL AADDC A,#00MOV R0,ADJNZ R2,LOOPEND3.5.2 数据的拼拆和转换数据的拼拆和转换【例例3-28】设在设在30H和31H单元中各有一个8位数据:(30H)=x7x6xx4xx2x1x0 (3lH)=y7y6yy4yy2y1y0现在要从30H单元中取出低5位,并从31H单元中取出低3位完成拼装,拼装结果送40H单元保存,并且规定:(40H)=y2y1y0 x4xx2x1x0 利用逻辑指令AN
41、L、ORL、RL等来完成数据的拼拆,处理过程:将30H单元的内容高3位屏蔽;31H单元内容的低5位屏蔽,高低四位交换,左移一位;然后与30H单元的内容相或,拼装后放到40H单元。程序如下:ORG 0100HMOV A,30H ANL A,#00011111BMOV 30H,AMOV A,31HANL A,#00000111B SWAP ARL A ORL A,40HMOV 40H,AEND【例例3-29】设片内设片内RAM的20H单元的内容为:(20H)=x7x6xx4xx2x1x0 把该单元内容反序后放回20H单元,即为:(20H)=x0 x1x2x3x4x5x6x7 可以通过先把原内容右移
42、一位,低位移入CF中,然后左移一位,CF中的内容移入,通过8次处理即可,由于8次过程相同,可以通过循环完成,移位过程当中必须通过累加器来处理。设20H单元原来的内容先通过R3暂存,结果先通过R4暂存,R2作循环变量。程序如下:ORG 0200HMOV R3,20HMOV R4,#0MOV R2,#8LOOP: MOV A,R3RRC AMOV R3,AMOV A,R4RLC AMOV R4,ADJNZ R2,LOOPMOV 20H,R4END 另外,由于片内RAM的20H单元在位寻址区,这一问题还可以通过位处理方式来实现,这种方法留给读者自己完成。【例例3-29】一位十六进制数转换成一位十六进
43、制数转换成ASC1I码。 一位十六进制数有十六个符号09、A、B、C、D、E、F。其中,09的ASCII码为30H39H,AF的ASCII码为41H46H,转换时,只要判断十六进制数是在09之间还是在AF之间,如在09之间,加30H,如在AF之间,加37H,就可得到ASCII码。设十六进制数放于R2中,转换的结果放于R2中。程序如下:ORG 0200HMOV A,R2 CLR CSUBB A,#0AH ;减去0AH,判断在09之间,还是在AF之间MOV A,R2JC ADD30 ;如在09之间,直接加30HADD A,#07H ;如在AF之间,先加07H,再加30HADD30:ADD A,#3
44、0HMOV R2,AEND【例3-30】一位十六进制数转换8段式数码管显示码。 一位十六进制数09、A、B、C、D、E、F的8段式数码管的共阴极显示码为3FH、06H、5BH、4FH、66H、6DH、7DH、07H、7FH、67H、77H、7CH、39H、5EH、79H、71H。由于数与显示码没有规律,不能通过运算得到,只能通过查表方式得到。 设数放在R2中,查得的显示码也放于R2中,用MOVC A,A+DPTR查表。程序如下:ORG 0200HCONVERT:MOV DPTR,#TAB ;DPTR指向表首址MOV A,R2 ;转换的数放于MOVC A,A+DPTR ;查表指令转换MOV R2
45、,ARETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,67H,77H,7CH,39H,5EH,79H,71H ;显示码表 在这个例子中,编码是一个字节,只通过一次查表指令就可实现转换,如编码是两个字节,则需要用两次查表指令才能查得编码,第一次取得低位,第二次取得高位。【例例3-31】在一温度控制系统中,温度0100C每一个温度值都已经通过温度传感器测得一个两字节的标准电压值。现在R2中给出一个0100C的温度值,取得它的标准电压值放于R3、R4中,低字节放在R3中,高字节放在R4中。 通过用MOVC A,A+DPTR查表,两个字节分两次取得,由DPTR指向表首,由放于R2中的温度值得到所查的电压值相对于表首位置的位移量放于累加器A中,由于每一个电压值为两个字节,位移量须用R2中的温度值乘以2得到。第一次取得低字节,第二次位移量加1后查表取得高字节,分别放于R3、R4中。程序如下:ORG 0300HCHECK: MOV DPTR,#TAB ;指向表首MOV A,R2 ;温度值送ARL A ;乘2得位移量MOV R1,A ;位移量暂存于R1中MOVC A,A+DPTRMOV R3,A ;第一次查得内
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 三年级上册数学教案-3.1认识长方形和正方形-苏教版
- 《图形与测量》(教案)2024-2025学年数学六年级下册北师大版
- 2025年关于毕业学位论文原创的协议
- 五年级上册数学教案-第5单元 积的近似值∣苏教版
- 2024年家用电热电力器具及类似产品项目项目投资申请报告代可行性研究报告
- 2025年度个人房屋租赁合同模板(含租赁登记)
- 2025年度医院聘用制医院电梯管理员劳动合同协议
- 2025年度不锈钢雨棚户外装饰与照明一体化合同
- 二零二五年度商业地产租赁合同终止执行通知范本
- 2025年度企业知识产权保护委托书合同范文
- 3.1产业转移对区域发展的影响(第1课时) 【知识精研】高二地理课件(湘教版2019选择性必修2)
- 2025年医院实习协议书样本
- 2025年湖南工程职业技术学院高职单招职业技能测试近5年常考版参考题库含答案解析
- 2024年云南中烟工业有限责任公司招聘笔试真题
- 2024年山东轻工职业学院高职单招语文历年参考题库含答案解析
- 2024年哈尔滨电力职业技术学院高职单招语文历年参考题库含答案解析
- 2024年金钥匙科技知识竞赛试题及答案
- 三一重工全面预算管理
- 小公司财务报销制度及报销流程
- 《环境感知技术》2024年课程标准(含课程思政设计)
- 矿山用电安全培训课件
评论
0/150
提交评论