第4章 汇编语言程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

例 4.5程序仅适用于散转表首地址TAB和处理
程序入口地址 PR0, PR1, …, PRN在同一个 2KB范围的存储区内的情形。若超出 2 KB范 围可在分支程序入口处安排一条长跳转指令。

例4.6上例采用长跳转指令程序如下: MOV DPTR, #TAB MOV A, R0 MOV B, #03H ; 长跳转指令占 3 MUL AB XCH A, B ADD A, DPH MOV DPH, A XCH A, B JMP @A+DPTR; TAB: LJMP PR0; LJMP PR1 …… LJMP PRN
格式和主要特点,明确被控对象对软件的要求, 设计出算法等。 (2)画出程序流程图。绘制流程图是单片机程序 编写前最重要的工作,通常我们的程序就是根 据流程图的指向采用适当的指令来编写的。图 4-1就是我们绘制流程图用的工具。
(3)分配内存工作区及有关端口地址。 (4)最后是根据流程图用程序设计语言来编制
(2) 地址偏移量表法 在程序中建立一个地址偏移量表(差值表),
将各个分支程序入口地址和该表的首地址的差 值按顺序排列其中,差值表首地址送DPTR,分 支序号送A中,通过查表指令得到地址差值, 再由散转指令转移到相应的分支程序入口。
例4.7根据R2中的存放的分支序号实现散转。 解:参考程序如下:

源程序如下: X DATA 20H Y DATA 30H ORG 0000H MOV A,X XRL A,Y ;(X)与(Y)进行异或操作 JB ACC.7,NEXT1 ; MOV A,X CJNE A,Y,NEQUAL ;(X)≠(Y),转移到NEQUAL CLR P1.0 (X)=(Y),点亮P1.0连接的LED SJMP FINISH NEQUAL: JC XXY ;(X)<(Y),转移到XXY SJMP XDY ;否则,(X)>(Y),转移到XDY NEXT1: MOV A,X JNB ACC.7,XDY ; XXY: CLR P1.2 SJMP FINISH XDY: CLR P1.1 FINISH: SJMP $ END
2. 三分支程序设计 例4.4 两个有符号数比较(三分支程序)。
内部RAM的20H单元和30H单元各存放了一 个8位有符号数,请比较这两个数的大小,比 较结果显示在实训实验板上: 若(20H)=(30H),则P1.0管脚连接的 LED发光; 若(20H)>(30H),则P1.1管脚连接的 LED发光; 若(20H)<(30H),则P1.2管脚连接的 LED发光

(4)利用RET指令散转 例4.9根据R2中的存放的分支序号实现散转 MOV SP,#30H MOV DPTR, #TAB ; MOV A, R2 ADD A, R2 ; R0内容乘以2 JNC LP1 ; INC DPH ; 加进位位 LP1: MOV R3,A MOVC A,@A+DPTR XCH A,R3 INC A MOVC A,@A+DPTR PUSH ACC MOV A,R3 PUSH ACC RET TAB: DW PRG0 DW PRG1 …. DW PRGN

源程序如下: X DATA 20H ;数据地址赋值伪指令DATA Y DATA 30H ORG 0000H MOV A, X CLR C SUBB A,Y JC L1 CLR P1.0 SJMP FINISH L1:CLRP1.1 FINISH: SJMP $ END
3. 散转程序
散转指令JMP@A+DPTR, 用它可以很容 易地实现散转功能。此指令的特点在于, 转移的 目标地址不是在编程或汇编时预先确定的, 而是 在程序运行过程中动态地确定的。目标地址是以 数据指针DPTR的内容为起始的 256 字节范围内 的指定地址, 即由 DPTR的内容决定分支转移程 序的首地址, 由累加器A的内容来动态选择其中 的某一个分支转移程序。
则程序转移到第i个分支程序的入口PRGi,要
求地址偏移量表的长度加上各分支程序的长度 在同一页(256B)范围内(最后一个处理程 序的 长度不受限制,这种方法只能用于散转 点较少的场合。

(3)转移地址表法 例4.8根据R2中的存放的分支序号实现散转 MOV DPTR, #TAB ; MOV A, R2 ADD A, R2 ; R0内容乘以2 JNC LP1 ; INC DPH ; 加进位位 LP1: MOV R3,A MOVC A,@A+DPTR XCH A,R3 INC A MOVC A,@A+DPTR MOV DPL ,A CLR A JMP @A+DPTR; TAB: DW PRG0 DW PRG1 …. DW PRGN
该程序采用堆栈技术,巧妙地将查表所得到的
分支程序入口地址的低八位和高八位分别压入 堆栈,然后执行RET指令把栈顶内容(分支程 序入口地址)弹入PC实现转移。执行完这段程 序后,堆栈指针SP不受影响,仍恢复原来值。
4.5循环程序设计 循环是强制CPU重复多次地执行一串指令的
基本程序结构。从本质上看,循环程序结构只 是分支程序中的一个特殊形式而已。由于其在 程序设计中经常用到,通常把它单独作为一种 程序结构的形式进行设计。
(1)散转指令表法 例 4.5 根据工作寄存器R0 内容的不同, 使程序
转入相应的分支。 (R0)=0 对应的分支程序标号为PR0; (R0)=1 对应的分支程序标号为PR1;

(R0)=N 对应的分支程序标号为PRN。
程序如下:
LP0:


MOV DPTR, #TAB ; 取表头地址 MOV A, R0 ADD A, R0 ; R0内容乘以2 JNC LP1 ; 无进位转移 INC DPH ; 加进位位 LP1: JMP @A+DPTR; 跳至散转表中相应位 置 TAB: AJMP PR0 AJMP PR1 AJMP PRN
例4.2 将两个半字节数合并成一个一字节数。 设内部RAM 40H#, 41H单元中分别存放着 8
位二进制数, 要求取出两个单元中的低半字节, 并 成一个字节后, 存入 50H单元中。 程序如下: START: MOV R1, #40H ; 设置R1为数据指针

序,称为低级语言。然后再用汇编系统将其翻译成机器语言, 该过程称为汇编;
为了用更接近人的语言编写程序,程序设计师们发明了高级
语言,如:BASIC,FORTRAN,PASCAL,C,JAVA然后再用编译系 统将其翻译成机器语言,该过程称为编译;
机器只能识别机器语言。所以必须用编译系统将高级语言编
MOV DPTR, #TAB ;


MOV A, R2 MOVC A,@A+DPTR JMP @A+DPTR TAB::DB PRG0-TAB DB PRG1-TAB DB PRG2-TAB DB …..
该程序中执行查表指令后(A)=PRGi-TAB 执行散转指令后,有(A)+(DPTR)=PRGi、
1.两分支程序设计 例4.3 两个无符号数比较(两分支)。内部RAM的
20H单元和30H单元各存放了一个8位无符号数,请比 较这两个数的大小,比较结果显示在实训的实验板上: 若(20H)≥(30H),则P1.0管脚连接的LED发光; 若(20H)<(30H),则P1.1管脚连接的LED发光。
第4章 汇编语言程序设计

程序设计语言有机器语言(Machine Language)、汇编语言(Assembly Language) 和高级语言(High-Level Language)3种。
程序设计概述——设计语言
最早人们只能用机器语言(二进制)编写程序;
为了方面方便记忆人们开始用助记符形式的汇编语言编写程
汇编程序。实际应用中,还要对程序仿真、调 试和固化。
4. 3顺序结构程序设计

顺序结构是最简单、最基本的程序结 构,其特点是按指令的排列顺序一条条地执 行,直到全部指令执行完毕为止。
例 4.1: 单字节压缩BCD码转换成二进制码子
程序。 解: 设两个BCD码d1d0 表示的两位十进制 数压缩存于R2, 其中R2 高 4 位存十位, 低 4 位存个位, 要把其转换成纯二进制码的算法为: (d1d0)BCD=d1×10+d0。 实现该算法所编 制的参考子程序如下:
1.循环程序结构

(a) (b) 图4-7 循环结构形式
循环程序的基本结构如图4-7所示,由下述四
个主要部分组成。 (1)初始化部分 初始化是为循环程序所做的准备工作,它是 保证循环程序的正确执行所必需的。在进入 循环体之前,需给用于循环过程的工作单元 设置初值,如循环控制计数初值的设置、地 址指针的起始地址的设置、为变量预置初值 等,都属于循环程序初始化部分。
入口: 待转换的BCD码存于R2。 出口: 转换结果(8 位无符号二进制整数)仍存R2。 ORG 0000H MOV A, R2 ; (A) ← (d1d0)BCD ANL A, #0F0H ; 取高位BCD码d1 SWAP A ; (A)=0d1H MOV B, #0AH ; (B) ←10 MUL AB ; d1×10 MOV R3 , A ; R3暂存乘积结果 MOV A, R2 ; (A) ← (d1d0)BCD ANL A, #0FH ; 取低位BCD码d0 ADD A, R3 ; d1×10+d0 MOV R2, A ; 保存转换结果 RET ; 子程序返回
在散转程序中需注意: ①A中的变址值必须进行修正,若为AJMP要做乘2处
理,LJMP要做乘3处理,当修正后有进位时,应将 进位加到DPH上,这样才能与分支序号对应 ②分支处理程序的入口地址必须和AJMP指令处于同 一个2KB区域 ③256B范围内最多可以安排128条AJMP指令,即最 多可以实现128个分支程序的转移。 当分支范围较大,分支数目较多时,无法满足第二 条要求,要采用长转移指令LJMP指令,则分支程序 可以在64KB范围内分布,但是由于转移指令表中各 条LJMP指令的地址依次相差3个字节,可以知道最 多能实现85个分支程序的转移。
写的源程序编译成机器语言,用汇编系统将用汇编语言编写 的源程序汇编成机器语言;
由低级或高级语言构成的程序称为源程序,由机器语言构成
的程序称作目标程序;
源程序
低级语言 高级语言
汇编 编译
目标程序
机器语言 机器语言
பைடு நூலகம்
4.2 汇编程序设计方法 1.汇编程序设计的一般步骤
(1)题意分析。熟悉并了解汇编语言指令的基本
(2)处理部分 它是循环结构程序的核心部分,用于完成实际
的处理工作,是需反复循环执行的部分,故又 称为循环体。这部分的程序内容,取决于实际 需处理问题的本身。
(3)循环控制部分 这是控制循环程序的循环与结束部分,通过
MOV A, @R1 ; ANL A, #0FH ; SWAP A ; INC R1 ; XCH A, @R1 ; ANL A, # 0FH ; ORL A, @R1 ; MOV 50H, A ; RET
4.4 分支程序设计

在编写分支程序时, 关键是如何判断 分支的条件。 在MCS—51 单片机指令系统 中, 有JZ(JNZ)、 CJNE、 JC(JNC)及 JB(JNB)等丰富的控制转移指令, 它们是 分支结构程序设计的基础, 可以完成各种各 样的条件判断、 分支。
相关文档
最新文档