190 likes | 312 Views
3.4 汇编语言程序设计举例. 1 . 知识目标 学会几种典型的汇编语言程序设计方法; 读懂程序流程图,掌握简单程序的编写。 2 . 能力目标 通过直观教学和教师的具体讲解,培养学生的逻辑思维和抽象思维能力;培养学生归纳总结问题的能力。 3 . 情感目标 通过对专业入门知识的生动形象的教学,使学生对本课程的产生浓厚兴趣,激发学生的学习热情。. 3.4 汇编语言程序设计举例. 在汇编语言程序中 , 有四种常见的程序结构 : 顺序程序 、 分支程序 、 循环程序和子程序 。 一、顺序结构程序
E N D
3.4 汇编语言程序设计举例 1.知识目标 学会几种典型的汇编语言程序设计方法;读懂程序流程图,掌握简单程序的编写。 2.能力目标 通过直观教学和教师的具体讲解,培养学生的逻辑思维和抽象思维能力;培养学生归纳总结问题的能力。 3.情感目标 通过对专业入门知识的生动形象的教学,使学生对本课程的产生浓厚兴趣,激发学生的学习热情。
3.4 汇编语言程序设计举例 在汇编语言程序中,有四种常见的程序结构:顺序程序、分支程序、循环程序和子程序。 一、顺序结构程序 顺序程序是最简单、应用最普遍的程序结构,程序执行按照指令的顺序逐条执行。 例1 双字节加法程序 设: 被加数存放在内部RAM的30H(高字节)、31H(低字节)单元中,加数存放在内部RAM的32H、33H单元中,运算结果存放在30H、31H中,进位位存放在位寻址区的00H位中。
分析:由于MCS-51指令系统中只有单字节加法指令,因此多字节加法必须从低位字节开始分字节相加。其中最低字节使用ADD指令,其余字节使用带进位加法指令ADDC。 双字节加法程序如下: ORG 0100H;程序存放在0100H开始的单元 START: MOV R0, # 31H;将被加数低字节地址送R0 MOV R1, # 33H;将加数低字节地址送R1 MOV A,@ R0;将被加数低字节内容送A ADD A,@ R1;低字节数相加 MOV @ R0,A ;低字节数之和存入31H 单元 DEC R0;R0指向被加数高字节 DEC R1;R1指向加数高字节 MOV A,@ R0;被加数高字节送A ADDC A,@R1;高字节数相加 MOV @ R0,A;高字节数之和存入30H 单元 MOV 00H,C;进位送00H 位保存 SJMP $ ;动态停机 END ;源程序结束
例2 将内部RAM 1AH单元中一压缩BCD数转换成二进制数。 分析:该题的关键是如何取出压缩BCD数的十位数和个位数。 实现转换的程序段如下: MOV A,1AH ;将BCD数送累加器A SWAP A ;交换BCD数的个位数和十位数 ANL A, # 0FH ;取出BCD数的十位数 MOV B, # 0AH ;立即数10送寄存器B MUL AB ;BCD数的十位数乘以10 ANL 1AH, # 0FH ;取出BCD数的个位数 ADD A,1AH ;十位数×10+个位数 MOV 40H,A ;转换结果送40H单元
例3 编程实现如图所示的逻辑功能。其中20H、2FH、2AH是位 地址。 分析:逻辑电路的功能是P1.0= 程序如下: MOV C,20H ;20H 位送CY ANL C,2FH ;CY 逻辑与2FH 位 CPL C ;CY 取反 ORL C,2AH ;CY 逻辑或2AH 位 MOV P1.0,C ;结果送P1.0
例4 双字节乘法程序 设两个乘数分别放在R0R1和R2R3中,乘积放入R4R5R6R7中。 分析:双字节乘法实质上是相应字节相乘后对应字节相加,其计算过程如下:
双字节乘法程序段如下: START:MOV A,R1 MOV B,R3 MUL AB ;R1× R3 MOV R7,A MOV R6,B ;R1× R3存入R6R7中 MOV A,R0 MOV B,R3 MUL AB ;R0× R3 ADD A,R6 MOV R6,A ;R0× R3低字节送R6 MOV A,B ;R0× R3高字节送A ADDC A,# 0H ;加CY MOV R5,A ;R0× R3存入R5R6中 MOV A,R1 MOV B,R2
MUL AB ;R1× R2 ADD A,R6 MOV R6,A;R1× R2低字节累加进入R6 MOV A,B ;R1× R2高字节送A ADDC A,R5 MOV R5,A ;R1× R2累加存入R5R6 CLR A ADDC A,# 0H MOV R4,A ;(R1× R2)高+ (R0× R3)高产生的进位存入R4 MOV A,R0 MOV B,R2 MUL AB ;R0× R2 ADD A,R5 MOV R5,A ;R0× R2低字节送R5 MOV A,B ;R0× R2高字节送A ADDC A,R4 MOV R4,A ;R0× R2存入R4R5
例1 比较内部RAM 30H和31H单元中无符号数的大小,使得30H单元存放大数,31H单元存放小数。 分析:先清进位位,然后两数作带借位减法,根据借位标志判断两 数大小。程序流程图如右图所示。 程序: START: CLR C MOV A,30H SUBB A,31H JNC DONE; 若无借位,即(30H)≥(31H)时转DONE MOV A,30H XCH A,31H; 有借位,即(30H)<(31H),交换(30H)与(31H) MOV 30H,A DONE: SJMP DONE
三、循环结构程序 把能够完成循环操作的程序称为循环结构程序。 循环程序的基本结构有两种:一种是“先执行,后判断”,即“直到型”循环。这种结构的循环至少执行一次循环体。另一种是“先判断,后循环”,即“当型”循环。这种结构的循环先判断条件,如果满足循环结束条件,则直接跳出循环,一次也不执行循环体,即循环次数为零。如果能确保至少执行一次循环,则采用以上任何一种循环结构都可以,否则采用后一种循环结构为宜。
例2 编程统计累加器A中“1”的个数。 分析:首先判断累加器A 是否为0,若A = 0,则程序结束;否则,先清CY,再将A 带进位循环左移一位,判断进位位CY 是否为1,为1 则计数,不为1 则继续循环。判断A 是否为0,重复这一过程,直至A = 0。程序流程图如图所示。
程序: MOV R1, # 0 ;计数器R1清0 PUSH ACC ;保护ACC LOOP1: JZ DONE ;若A = 0,程序结束 CLR C ;进位位清0 RLC A ;累加器A带进位循环左移一位 JNC LOOP1 ;CY = 0,则继续循环 INC R1 ;CY = 1,则计数器R1加1 SJMP LOOP1 DONE: POP ACC ;恢复ACC SJMP $ END
四、子程序设计 程序设计过程中,在不同的程序中或同一程序的不同位置可反复调用的独立程序段,称为子程序;程序设计方法称之为子程序设计。调用子程序的程序称为主程序。主程序和子程序之间的调用关系如图所示。
例1 假设在内部RAM 41H~4AH和51H~5AH单元分别存放10个无符号字节数,求两组无符号字节数据的最大值之差。 解:设计一个子程,实现从一组字节数据中找出最大值,结果保存到累加器A中。用R0存放数据区首地址,R7存放数据个数,通过循环比较,找出数据区中的最大数。查找算法的子程序流程如图所示。
程序清单如下: ORG 0100H MAIN: MOV R7,#0AH ;循环计数器R7置初值 MOV R0,#41H ;设置数据区地址指针 ACALL MAX ;调用查找子程序 MOV 20H,A ;保存最大值 MOV R7,#0AH ;设置循环计数器R7 MOV R0,#51H ;设置数据区地址指针
ACALL MAX ;调用查找子程序 CJNE A,20H,NEXT ;比较两数大小 NEXT: JNC RESULT XCH A,20H ;交换两数 CLR C RESULT:SUBB A,20H ;计算两数之差 SJMP $ ORG 0200H ;子程序 MAX: CLR A ;累加器清0 LOOP: MOV B,@R0 CJNE A,B,NEXT ;比较两数大小 NEXT: JNC CONT ;若CY=0,则A≥B,转移 MOV A,@R0;CY=1,则A<B,保存较大数到累加器A CONT:INC R0 ;修改数据指针R0 DJNZ R7,LOOP RET END
任务演示 任务T3:算术、逻辑运算模拟系统软件设计。