1 / 19

3.4 汇编语言程序设计举例

3.4 汇编语言程序设计举例. 1 . 知识目标 学会几种典型的汇编语言程序设计方法; 读懂程序流程图,掌握简单程序的编写。 2 . 能力目标 通过直观教学和教师的具体讲解,培养学生的逻辑思维和抽象思维能力;培养学生归纳总结问题的能力。 3 . 情感目标 通过对专业入门知识的生动形象的教学,使学生对本课程的产生浓厚兴趣,激发学生的学习热情。. 3.4 汇编语言程序设计举例. 在汇编语言程序中 , 有四种常见的程序结构 : 顺序程序 、 分支程序 、 循环程序和子程序 。 一、顺序结构程序

Download Presentation

3.4 汇编语言程序设计举例

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. 3.4 汇编语言程序设计举例 1.知识目标 学会几种典型的汇编语言程序设计方法;读懂程序流程图,掌握简单程序的编写。 2.能力目标 通过直观教学和教师的具体讲解,培养学生的逻辑思维和抽象思维能力;培养学生归纳总结问题的能力。 3.情感目标 通过对专业入门知识的生动形象的教学,使学生对本课程的产生浓厚兴趣,激发学生的学习热情。

  2. 3.4 汇编语言程序设计举例 在汇编语言程序中,有四种常见的程序结构:顺序程序、分支程序、循环程序和子程序。 一、顺序结构程序 顺序程序是最简单、应用最普遍的程序结构,程序执行按照指令的顺序逐条执行。 例1 双字节加法程序 设: 被加数存放在内部RAM的30H(高字节)、31H(低字节)单元中,加数存放在内部RAM的32H、33H单元中,运算结果存放在30H、31H中,进位位存放在位寻址区的00H位中。

  3. 分析:由于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 ;源程序结束

  4. 例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单元

  5. 例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

  6. 例4 双字节乘法程序 设两个乘数分别放在R0R1和R2R3中,乘积放入R4R5R6R7中。 分析:双字节乘法实质上是相应字节相乘后对应字节相加,其计算过程如下:

  7. 双字节乘法程序段如下: 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

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

  9. 二、分支结构程序结构

  10. 例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

  11. 三、循环结构程序 把能够完成循环操作的程序称为循环结构程序。 循环程序的基本结构有两种:一种是“先执行,后判断”,即“直到型”循环。这种结构的循环至少执行一次循环体。另一种是“先判断,后循环”,即“当型”循环。这种结构的循环先判断条件,如果满足循环结束条件,则直接跳出循环,一次也不执行循环体,即循环次数为零。如果能确保至少执行一次循环,则采用以上任何一种循环结构都可以,否则采用后一种循环结构为宜。

  12. 例2 编程统计累加器A中“1”的个数。 分析:首先判断累加器A 是否为0,若A = 0,则程序结束;否则,先清CY,再将A 带进位循环左移一位,判断进位位CY 是否为1,为1 则计数,不为1 则继续循环。判断A 是否为0,重复这一过程,直至A = 0。程序流程图如图所示。

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

  14. 四、子程序设计 程序设计过程中,在不同的程序中或同一程序的不同位置可反复调用的独立程序段,称为子程序;程序设计方法称之为子程序设计。调用子程序的程序称为主程序。主程序和子程序之间的调用关系如图所示。

  15. 例1 假设在内部RAM 41H~4AH和51H~5AH单元分别存放10个无符号字节数,求两组无符号字节数据的最大值之差。 解:设计一个子程,实现从一组字节数据中找出最大值,结果保存到累加器A中。用R0存放数据区首地址,R7存放数据个数,通过循环比较,找出数据区中的最大数。查找算法的子程序流程如图所示。

  16. 程序清单如下: ORG 0100H MAIN: MOV R7,#0AH ;循环计数器R7置初值 MOV R0,#41H ;设置数据区地址指针 ACALL MAX ;调用查找子程序 MOV 20H,A ;保存最大值 MOV R7,#0AH ;设置循环计数器R7 MOV R0,#51H ;设置数据区地址指针

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

  18. 任务演示 任务T3:算术、逻辑运算模拟系统软件设计。

More Related