2019/12/23 单片机原理及其应用 CH3汇编语言程序设计 伪指令 第三章汇编语言程序设计 汇编语言的结构 程序设计举例 一、MCS-51单片机汇编语言的伪指令 ,1、起始地址伪指今ORG ORG addr16 MC5-51单片机汇编语言程序设计中,常用的伪指令(七条): ·用于规定目标程序段成数据块的起始她址, 设置在程序开始处 ,ORG一定位伪指令 ·例:rg0000h ljmp main 一END一结束汇编伪指令 EQU一赋值伪指令 ·2、汇编结束伪指令END ,DB一定义字节指令 ·告诉汇编程序,对源程序的汇编到此结束。 ,DW一定义数据字指令 一个程序中只出现一次,在程序的最未尾. ·例: >DS一定义存储区指令 end >BT一位定义指令
2019/12/23 1 第三章 汇编语言程序设计 一、MCS-51单片机汇编语言的伪指令 MCS-51单片机汇编语言程序设计中,常用的伪指令(七条): ORG—定位伪指令 END—结束汇编伪指令 EQU—赋值伪指令 DB—定义字节指令 DW—定义数据字指令 DS—定义存储区指令 BIT—位定义指令 • 1、起始地址伪指令 ORG ORG addr16 • 用于规定目标程序段或数据块的起始地址, • 设置在程序开始处。 • 例: Org 0000h • ljmp main • org 0100h • main: mov sp,#30h • . • 2、汇编结束伪指令 END • 告诉汇编程序,对源程序的汇编到此结束。 • 一个程序中只出现一 次,在程序的最末尾。 • 例: . • . • end 1 2 3 4
2019/12/23 ·3.赋值伪指令EQU 4.定义字节数据伪指令DB ·告诉汇编程序,给符号赋值 ·格式:[特号:】DB宇节韵据表 ·格式:符号名称EQU数值或汇编符号 功能:字节数据表可以是多个字节数据、宇符串成表 达式,它表示将字节数据表中的数据从左到右依次存放在指 ·先定义后使用 ·例: 定地址单元 led_lamp equ p1.0 ·列如:ORG1000H counter equ 100 display addr equ 2000h TAB:DB 2BH,0AOH,A',2*4 mov ro,#counter ·表示从1000H单元开始的地方存放数据2BH,0A0H, mov dptr,#display addr 41H(字母A的ASCIE9),08H mov c,led lamp ·6.定义空间伪指令D5 ·5.定义字数据伪指令DW 格试:标号:】DS表达式 格式:符号:】DW字黎据表 功能:从指定的地址开始。保留多少个存储单元作为备 ·功能:与DB类似,但DW定义的数据项为字,包括两 用的空间。 个字节,存放时高位在前,低位在后。 ·如:ORG1000H 例如:ORG1000H ·BUF:D550: DATA:DW 324AH,3CH; ·TA8:DB22H 表示从1000H单元开始的地方存放数据32H,4AH ·表示从1000H开始的地方预留50个(1000H-1031H)存 00H:3CH(3CH以字的形式表示为003CH) 储字节空间
2019/12/23 2 • 3、赋值伪指令 EQU • 告诉汇编程序,给符号赋值。 • 格式: 符号名称 EQU 数值或汇编符号 • 先定义后使用 • 例: • led_lamp equ p1.0 • counter equ 100 • display_addr equ 2000h • . • mov r0, #counter • mov dptr, #display_addr • mov c, led_lamp • 4.定义字节数据伪指令DB • 格式:[符号:] DB 字节数据表 • 功能:字节数据表可以是多个字节数据、字符串或表 达式,它表示将字节数据表中的数据从左到右依次存放在指 定地址单元。 • 例如:ORG 1000H • TAB: DB 2BH, 0A0H, ‘A’, 2*4 ; • 表示从1000H单元开始的地方存放数据2BH,0A0H, 41H(字母A的ASCII码),08H • 5.定义字数据伪指令DW • 格式:[符号:] DW 字数据表 • 功能:与DB类似,但DW定义的数据项为字,包括两 个字节,存放时高位在前,低位在后。 • 例如:ORG 1000H • DATA: DW 324AH, 3CH ; • 表示从1000H单元开始的地方存放数据32H,4AH, 00H ; 3CH(3CH以字的形式表示为003CH) • 6.定义空间伪指令DS • 格式:[标号:] DS 表达式 • 功能:从指定的地址开始,保留多少个存储单元作为备 用的空间。 • 如: ORG 1000H • BUF: DS 50 ; • TAB: DB 22H ; • 表示从1000H开始的地方预留50个(1000H~1031H)存 储字节空间。 5 6 7 8
2019/12/23 二、单片机汇编语言程序设计的基本步骤 三:汇编语言程序的主要结构形式 题意分析、熟悉并了解汇编语言指令的基本格式和主要 特点明确被控对象对软件的要求设计出算法等】 题序程座:最简单、最基本的程序结构,按指令的排列 画出程序流程图。 顺序一条条地执行,直到全部指令执行完毕为止, 分配内存工作区及有关端口地址.分配内存工作区,要根 分支程座:通过转移指令对相应条件的判断,改变程序 据程序区、数据区、暂存区、堆栈区等预计所占空间大小, 对片内外存储区进行合理分配并确定每个区域的首地址,便 的执行方向。 于编程使用。 循环程座:在程序中需要反复的执行的程序段,为了道 编制汇编源程序 免在程序中多次的编写,可以通过利用亲件转移成无条 仿真、调试和优化程序】 件转移指令来控制程序的执行。 固化程序。 10 原顺序结构 分支构 额环结构 入日 入口 1.顺序程序的设计 处理 衡苹程序也款是服序程序,它是最衡单、最基本的程序结构, 修改条件 其特点是按指令的排列佩序一条条地执行,直到全蒂指令执行完中 分支1 分支2 为止。不管多么复杂的程序,总是由若干序程序段所阻成的。 条件满足否? 出口 出口 出口 12
2019/12/23 3 • 题意分析、熟悉并了解汇编语言指令的基本格式和主要 特点、明确被控对象对软件的要求、设计出算法等。 • 画出程序流程图。 • 分配内存工作区及有关端口地址。分配内存工作区,要根 据程序区、数据区、暂存区、堆栈区等预计所占空间大小, 对片内外存储区进行合理分配并确定每个区域的首地址,便 于编程使用。 • 编制汇编源程序。 • 仿真、调试和优化程序。 • 固化程序。 二、单片机汇编语言程序设计的基本步骤 三:汇编语言程序的主要结构形式 • 顺序程序:最简单、最基本的程序结构,按指令的排列 顺序一条条地执行,直到全部指令执行完毕为止。 • 分支程序:通过转移指令对相应条件的判断,改变程序 的执行方向。 • 循环程序:在程序中需要反复的执行的程序段,为了避 免在程序中多次的编写,可以通过利用条件转移或无条 件转移指令来控制程序的执行。 语句 3 语句 2 顺序结构 入口 语句 1 出口 分支结构 入口 条件满足否? 分支 1 出口 Y N 分支 2 循环结构 入口 处理 修改条件 条件满足否? Y 出口 N 简单程序也就是顺序程序,它是最简单、最基本的程序结构, 其特点是按指令的排列顺序一条条地执行,直到全部指令执行完毕 为止。不管多么复杂的程序,总是由若干顺序程序段所组成的。 1.顺序程序的设计 9 10 11 12
2019/12/23 分5 #京世部¥¥¥等 60H 例:设在外RAM的60H单元存有1个学节代网,要求 将其分解成两个4位字段,高4位存入原单元的标4位, 其低4位存入61H单元的低4位,且要求这两个单元的 60H 0RG1000E 61H 高4位均为0,试德制完蔓程序。 10y0,80阳 MOVI A,RO MOV B,A 分折色 ALA,OFO阳 ¥年##¥¥¥¥ 60H STAP MOVX RO,A MOV A.B 00000000¥¥¥¥ 提的 60H 61H sJP t END 13 2.分支程序的设计 一、分文结构与分支程序设计 整精事中禁 a-b(a20) 结构:根语不同的条件,进行相应的处理, 通常用条件装移指令形成草分文结构。 (a<0) 如:判(A)=Z戒Nz,神移 判(cY)=1或0,转移 解:本题关使是判是正兼还是负兼:由ACC.7便知。 ORG 1000H 判(bit)=1或0,转移 BR.ACC.7,MINUS CJNE比枝不湘等转移 SUBB A.B SJMP DONE MINUS:ADD A,B DONE:SJMP END 16
2019/12/23 4 例: 设在外RAM的60H单元存有1个字节代码,要求 将其分解成两个4位字段,高4位存入原单元的低4位, 其低4位存入61H单元的低4位,且要求这两个单元的 高4位均为0,试编制完整程序。 分析: # # # # ¥ ¥ ¥ ¥ 0 0 0 0 # # # # 0 0 0 0 ¥ ¥ ¥ ¥ 60H 60H 61H 解: ORG 1000H MOV R0,#60H MOVX A,@R0 MOV B,A ANL A,#0F0H SWAP A MOVX @R0,A MOV A,B ANL A,#0FH INC R0 MOVX @R0,A SJMP $ END 分析: # # # # ¥ ¥ ¥ ¥ 0 0 0 0 # # # # 0 0 0 0 ¥ ¥ ¥ ¥ 60H 60H 61H 2. 分支程序的设计 一、分支结构与分支程序设计 结构:根据不同的条件,进行相应的处理。 通常用条件转移指令形成简单分支结构。 如: 判(A) = Z 或 NZ ,转移 判(CY)= 1 或 0 ,转移 判(bit)=1 或 0 ,转移 CJNE 比较不相等转移 例2、设a存放在累加器A中,b存放在寄存器B中,要求按 下式 计算Y值,并将结果Y存于累加器A 中,试编写程序。 a-b (a≥0) Y = a+b (a < 0) 解:本题关键是判a是正数,还是负数;由ACC.7便知。 ORG 1000H BR: JB ACC.7,MINUS CLR C SUBB A,B SJMP DONE MINUS: ADD A,B DONE: SJMP $ END 13 14 15 16
2019/12/23 分支程序实例 例4多向分支程序设计(散转指令) 例3:内部R30阳和31日中分别存有2个8位无符号数,编程找出 ,根据R0的值转向7个分支程序 其中的大数存入内部32组单元中。 ·R0<10,转向SUB0: ORG 0040H ·R0<20,转向SUB1: MOV A 30H 开始○ CLR c A,31H ·R0<60,转向SUB5: CY=1.转5到L1 ·R0>60,转向SUB6: K0K1. ADD A,31H MOV 32H,A W3UB03UB了 SJMP FINISH L1:MOV 32H,31H FINISH:SJMP车 17 18 0RG2000H DPTR,#TAB:转移指令表首地址 ·例5:如图所示,设计一段程序实现功能:如果(A】中1的个数为奇数,所 A,R0:取数 有的二极管发光:如果全0,则只让VD0-VD3发光:否则全灭。 MOV B,10 IV AB,A10,商在A中 CL c RLC A 1A-2A JMP @A+DPTR PC-A+DPTR ·TAB:AJMP SUB0,转移指今表 AJMP SUB1 AJMP SUB2 AJMP SUBS AJMP SUB6 19 20
2019/12/23 5 例3:内部RAM30H和31H中分别存有2个8位无符号数,编程找出 其中的大数存入内部32H单元中。 ORG 0040H MOV A, 30H CLR C SUBB A,31H JC L1 ;CY=1,转移到 L1 ADD A,31H MOV 32H,A SJMP FINISH L1:MOV 32H,31H FINISH: SJMP $ 分支程序实例 例4 多向分支程序设计(散转指令) • 根据R0的值转向7个分支程序。 • R0<10,转向SUB0; • R0<20,转向SUB1; • • R0<60,转向SUB5; • R0>60,转向SUB6; K=? 转SUB0 转SUB1 转SUB6 K=0 K=1 . K=6 开始 • ORG 2000H • MOV DPTR,#TAB;转移指令表首地址 • MOV A,R0 ;取数 • MOV B,#10 • DIV AB ;A10,商在A中 • CLR C • RLC A ;A←2A • JMP @A+DPTR ;PC ← A+DPTR • TAB: AJMP SUB0 ;转移指令表 • AJMP SUB1 • AJMP SUB2 • AJMP SUB5 • AJMP SUB6 • 例5:如图所示,设计一段程序实现功能:如果(A)中1的个数为奇数,所 有的二极管发光;如果全0,则只让VD0-VD3发光;否则全灭。 EA/VP 31 X1 19 X2 18 RESET 9 INT0 12 INT1 13 T0 14 T1 15 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P0.0 39 P0.1 38 P0.2 37 P0.3 36 P0.4 35 P0.5 34 P0.6 33 P0.7 32 P2.0 21 P2.1 22 P2.2 23 P2.3 24 P2.4 25 P2.5 26 P2.6 27 P2.7 28 RD 17 WR 16 PSEN 29 ALE/P 30 TXD 11 RXD 10 AT89C51 C2 30pF C3 30pF Y1 6.000MHZ GND VD1 VD2 VD3 VD4 VD5 VD6 VD7 R2 330 R3 330 R4 330 R5 330 R6 330 R7 330 R8 330 R9 330 GND R1 10K + C1 47uF GND VCC VCC VD0 17 18 19 20