汇编语言及应用程序设计.ppt

上传人:小飞机 文档编号:6586389 上传时间:2023-11-15 格式:PPT 页数:62 大小:598KB
返回 下载 相关 举报
汇编语言及应用程序设计.ppt_第1页
第1页 / 共62页
汇编语言及应用程序设计.ppt_第2页
第2页 / 共62页
汇编语言及应用程序设计.ppt_第3页
第3页 / 共62页
汇编语言及应用程序设计.ppt_第4页
第4页 / 共62页
汇编语言及应用程序设计.ppt_第5页
第5页 / 共62页
点击查看更多>>
资源描述

《汇编语言及应用程序设计.ppt》由会员分享,可在线阅读,更多相关《汇编语言及应用程序设计.ppt(62页珍藏版)》请在三一办公上搜索。

1、,第9章 汇编语言及应用程序设计,9.1 伪指令 9.2 汇编语言源程序的汇编过程 9.3 MCS-51汇编语言使用程序举例,9.1 伪 指 令 伪指令是对汇编过程 起控制作用,但本身并没有对应的机器代码的指令。,一、汇编起始指令 ORG 指令格式为:ORG nn 该指令的作用是指明后面的程序或数据块的起始地址,它 总是出现在每段源程序或数据块的开始。式中,nn为 16 位地 址,汇编时nn确定了此语句后面第一条指令或第一个数据的地 址,此后的源程序或数据块就依次连续存放在以后的地址内,直 到遇到另一个ORG指令为止。,例:ORG 2000H MOV SP,60H MOV R0,2FH MOV

2、 R2,0FFH ORG伪指令说明其后面程序的目标代码在存储器 中存放的起始地址是2000H,即 存储器地址 目标程序 2000H 75 81 60 2003H 78 2F 2005H 7A FF注意:一般要求ORG定义空间地址由小到大,且 地址不能重叠。,二、定义字节指令DB 指令格式:标号:DB 项或项表 其中:项或项表是指一个字节,数或字符串,或以引 括起来的ASCII码字符串(一个字符用ASCII 码表示,就相当于一个字节)。功能:把项或项表的数值(字符则用它的ASCII码)存入从标号开始的连续单元中。,例:ORG 1000H SEG1:DB 53H,74H,78H,1,2 SEG2:

3、DB 23H,DAY END则:(1000H)=53H(1001H)=74H(1002H)=78H(1003H)=31H 数字1的ASCII码(1004H)=32H 数字2的ASCII码(1005H)=23H(1006H)=34H(1007H)=41H DAY的ASCII码(1008H)=59H,三、定义字指令DW 指令格式:标号:DW 项或项表 其中:DW的基本含义与DB相同,但DB一般用于定 8位数据(一个字节),而DW则定义16位数 据,即一个字(规定为两个字节,即一个字为 16位二进制数)。注意:在执行汇编程序时,机器会自动按高位字节在 前,低位字节在后的格式排列(与程序中的地 址规定

4、一致),DW伪指令常用来建立地址表。,四、预留存储区DS 指令格式:标号:DS 表达式 功能:由标号指定单元开始,定义一个存储区,以备 源程序使用,存储区预留的存储单元数由表达 式的值决定。例如:ORG 3C40H TEMP:DS 10 即由3C40H地址开始保留连续的10个存储单元的存储区。,五、标号指令EQU 指令格式:标号:EQU nn或表达式 功能:将语句操作数的值赋予本语句的标号,故又称为等值指令。注意:由 EQU等值的字符名称必须先赋值后使 用,且在同一程序中,用EQU伪指令对 标号赋值后,该标号的值在整个程序中 不能改变。,例:PA8155 EQU 8001H 即给标号PA815

5、5赋值为8001H。使用等值指令可给程序的编制、调试、修改 带来方便,如果在程序中要多次使用到某一地址,由 EQU指令将其赋值给一个字符名称,一旦需要对其 进行变动,只要改变EQU命令后面的数字即可,而 不需要对程序中涉及到该地址的所有指令逐句进 行修改。,六、源程序结束END 指令格式:标号:END 表达式 功能:是一个结束语句,告诉汇编程序段已结束 注意:该语句必须放在整个程序(包括伪指令)之后,若END语句出现在代码块中间,则 汇编语言将不汇编END后面的语句。,9.2 汇编语言源程序的汇编过程,自动编排目标程序中的指令存放地址把源程序翻译成机器码分析源程序语法,若出错,给出错误信息输出

6、目标程序及源程序文件列表,9.3 MCS-51汇编语言使用程序举例,9.3.1 简单程序设计 9.3.2 分支程序设计9.3.3 运算程序设计9.3.4 循环程序设计9.3.5 代码转换程序设计9.3.6 逻辑操作程序设计9.3.7 查表程序设计,9.3.1 简单程序设计,例 1 两个无符号双字节数相加。设被加数存放于内部RAM的40H(高位 字节),41H(低位字节),加数存放于50H(高位字节),51H(低位字节),和数存入 40H和41H单元中。,程序如下:START:CLR C;将Cy清零 MOV R0,41H;将被加数地址送数据指针R0 MOV R1,51H;将加数地址送数据指针R1

7、AD1:MOV A,R0;被加数低字节的内容送入A ADD A,R1;两个低字节相加 MOV R0,A;低字节的和存入被加数低字 DEC R0;指向被加数高位字节 DEC R1;指向加数高位字节 MOV A,R0;被加数高位字节送入A ADDC A,R1;两个高位字节带Cy相加 MOV R0,A;高位字节的和送被加数高位字 RET,例 2 将两个半字节数合并成一个一字节数。设内部RAM 40H#,41H单元中分别存放着 8 位二进制数,要求取出两个单元中的低半字节,并成一个字节后,存入50H单元中。,程序如下:START:MOV R1,40H;设置R1为数据指针MOV A,R1;取出第一个单元

8、中的内容ANL A,0FH;取第一个数的低半字节SWAP A;移至高半字节INC R1;修改数据指针XCH A,R1;取第二个单元中的内容ANL A,0FH;取第二个数的低半字节ORL A,R1;拼字MOV 50H,A;存放结果RET,9.3.2 分支程序设计,图 9.1 分支结构框图(a)单分支流程;(b)多分支流程,例 3 x,y均为8位二进制数,设 x存入R0,y存入R1,求解:y=syn(x),图 9.2,程序如下:START:CJNE R0,00H,SUL1;R0中的数与00比较不等转移 MOV R1,00H;相等,R1 0 SJMP SUL2 SUL1:JC NEG;两数不等,若(

9、R0)0,则 R101H SJMP SUL2 NEG:MOV R1,0FFH;(R0)0,则 R10FFH SUL2:RET,例 4 比较两个无符号数的大小。设外部 RAM 的存储单元 ST1和 ST2中存放两个不带符号的二进制数,找出其中的大数存入外部 RAM 中的 ST3单元中。,图 9.3,程序如下:ORG 1000H ST1 EQU 2000H ST2 EQU 2100H ST3 EQU 2200H START:CLR C;清零Cy MOV DPTR,ST1;第一个数的指针 MOVX A,DPTR;取第一个数 MOV R2,A;保存 MOV DPTR,ST2;第二个数的指针 MOVX

10、A,DPTR;取第二个数 CLR C,SUBB A,R2;两数比较JNC BIG2;若第二个数大,则转XCH A,R2;第一个数大BIG1:MOV DPTR,ST3 MOVX DPTR,A;存大数RETBIG2:MOVX A,DPTR;第二个数大SJMP BIG1RET,9.3.3 运算程序设计,一、加、减法程序,例5 将40H开始存放的10个字节的数与50H开始存放的10 个字节的数相减(假设被减数大于减数)。设被减数指针为 R0,减数指针为 R1,差数放回被减数单元,R5 存放字节个数,则程序如下:,SUB:MOV R0,40HMOV R1,50HMOV R5,10CLR CSUB1:MO

11、V A,R0SUBB A,R1MOV R0,AINC R0INC R1DJNZ R5,SUB1RET,二、乘法运算程序 在计算机中,常将乘法采用移位和加法来实现。例6 将(R2R3)和(R6R7)中双字节无符号数相乘,结果存入 R4R5R6R7。此乘法可以采用部分积右移的方法来实现,其程序框图如图 4.6 所示,程序如下:,NMUL:MOV R4,0;初始化 MOV R5,0 CLR C MOV R0,16,NMUL1:MOV A,R4;CyR4R5R6R7右移一位 RRC A MOV R4,A MOV A,R5 RRC A MOV R5,A MOV A,R6 RRC A MOV R6,A M

12、OV A,R7 RRC MOV R7,A JNC NMUL2;C为移出乘数的最低位 MOV A,R5;(R4R5)+(R6F7)(R4R5),ADD A,R3 MOV R5,A MOV A,R4 ADDC A,R2 MOV R4,A NMUL2:DJNZR0,NMUL1;循环16位 MOV A,R4;最后结果再移一位 RRC A MOV R4,A MOV A,R5 RRC A MOV R5,A MOV A,R6,RRC A MOV R6,A MOV A,R7 RRC A MOV R7,A RET,图9.4 NMUL程序框图,三、除法运算程序 除法是乘法的逆运算,用移位、相减的方法来完成。首先比

13、较被除数的高位字与除数,如被除数高位大于除数,则商为1,并从被除数中减去除数,形成一个部分余数;否则商位为 0,不执行减法。然后把新的部分余数左移一位,并与除数再次进行比较。循环此步骤,直到被除数的所有位都处理完为止,一般商的字长为 n,则需循环n次。一般计算机中,被除数均为双倍位,即如果除数和商为双字节,则被除数为四字节。如果在除法中发生商大于规定字节,称为溢出。在进行除法前,应该检查是否会产生溢出。一般可在进行除法前,先比较被除数的高位与除数,如被除数高位大于除数,则溢出,置溢出标志,不执行除法。,图 9.5除法程序的流程,例 7 将(R4R5R6R7)除以(R2R3),商放在(R6R7)

14、中,余数放在(R4R5)中。,NDIV:MOV A,R5;判商是否产生溢出 CLR C SUBB A,R3 MOV A,R4 SUBB A,R2 JNC NDIV1;溢出,转溢出处理 MOV B,16;无溢出,执行除法,NDIV2:CLR C;被除数左移一位,低位送 0 MOV A,R7 RLC A MOV R7,A MOV A,R6 RLC A MOV R6,A MOV A,R5 RLC A MOV R5,A XCH A,R4 RLC A XCH A,R4,MOV F0,C;保护移出的最高位 CLR C SUBB A,R3;部分余数与除数比较 MOV R1,A MOV A,R4 SUBB A

15、,R2 JB F0,NDIV3;移出的高位为 1,肯定够减 JC NDIV4;否则,(Cy)=0才够减 NDIV3:MOV R4,A;回送减法结果 MOV A,R1 MOV R5,A INC R7;商上1,NDIV4:DJNZ B,NDIV2;循环次数减 1,若不为零则循环 CLR F0;正常执行无溢出 F0=0 RET NDIV1:SETB F0;溢出F0=1 RET,9.3.4 循环程序设计,一、单重循环,图 9.6,循环程序一般由四个主要部分组成:(1)初始化部分:为循环程序做准备,如规定循环次数、给各变量和地址指针预置初值。(2)处理部分:为反复执行的程序段,是循环程序的实体,也是循环

16、程序的主体。(3)循环控制部分:这部分的作用是修改循环变量和控制变量,并判断循环是否结束,直到符合结束条件时,跳出循环为止。(4)结束部分:这部分主要是对循环程序的结果进行分析、处理和存放。,例8 设在内部RAM的BLOCK单元开始处有长度为 LEN个的无符号数据块,试编一个求和程序,并将和存入内部 RAM的 SUM单元(设和不超过 8 位)。,BLOCK EQU 20H LEN EQU 30HSUM EQU 40HSTART:CLR A;清累加器A MOV R2,LEN;数据块长度送R2 MOV R1,BLOCK;数据块首址送R1 LOOP:ADD A,R1;循环加法 INC R1;修改地址

17、指针 DJNZ R2,LOOP;修改计数器并判断 MOV SUM,A;存和 RET,二、多重循环,多重循环程序,即在一个循环体中又包含了其它的循环程序,使用多重循环时,必须注意:(1)循环嵌套,必须层次分明,不允许产生内外层循环交叉。(2)外循环可以一层层向内循环进入,结束时由里往外一层 层退出。(3)内循环可以直接转入外循环,实现一个循环由多个条件控制 的循环结构方式。,例9 在外部 RAM中,BLOCK开始的单元中有一无符号数据块,其个数为 LEN个字节。试将这些无符号数按递减次序重新排列,并存入原存储区。,ORG 1000H START:MOV DPTR,BLOCK;置地址指针 MOV

18、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;相邻两数比较,不等转 SJMP NOCHA;相等不交换,NEXT:JC NOCHA;Cy=1,则前者大于后者,不必交换 SETB F0;否则,置交换标志 MOVX R0,A;XCH A,B;两数交换,大

19、者在前,小者在后 MOVX R1,A;NOCHA:INC R0 INC R1;修改指针 DJNZ R6,LOOP1;内循环未完,则继续 JNB F0,EXIT;若从未交换,则结束 DJNZ R7,LOOP0;外循环未完,则继续 EXIT:RET,图 9.7,9.3.5 代码转换程序设计,例10 4位二进制数转化为ASCII代码分析:从ASCII编码表可知,若4位二进制数小于10,则此二进制数加上30H即变成相应的ASCII码;若大于10(包括等于10),则应加37H方可。入口:转换前4位二进制数存R2出口:转换后的ASCII码存R2,源程序如下:ORG 2000HASCB1:MOV A,R2;

20、ANL A,#0FH;取出四位二进制数 PUSH A;压入堆栈 CLR C SUBB A,#0AH;POP A;弹回A中 JC LOOP;该数小于10去LOOP ADD A,#07H;否则加07HLOOP:ADD A,#30H;加30H MOV R2,A;转换之ASCII码送R2中 RET;返回主程序,例 11 设 4 位BCD码依次存放在内存 RAM中 40H43H单元的低4 位,高 4 位都为 0,要求将其转换为二进制数,结果存入 R2R3 中。分析:一个十进制数可表示为:Dn10n+Dn-110n-1+D0100=(Dn10+Dn-1)10+Dn-2)10+)+D0 当n=3时,上式可表

21、示为:(D310+D2)10+D1)10+D0,BCDHEX:MOV R0,40H;R0指向最高位地址MOV R1,03;计数值送R1MOV R2,0;存放结果的高位清零MOV A,R0MOV R3,A LOOP:MOV A,R3MOV B,10MULABMOV R3,A;(R3)10 的低 8 位送R3MOV A,BXCHA,R2;(R3)10的高 8 位暂存R2MOVB,10,MULAB ADD A,R2 MOVR2,A;R210+(R310)高 8 位送R2 INCR0;取下一个 BCD数 MOVA,R3 ADDA,R0 MOVR3,A MOVA,R2 ADDC A,0;加低字节来的进位

22、 MOVR2,A DJNZ R1,LOOP RET,9.3.6 逻辑操作程序设计,一.逻辑“与”函数的程序模拟例12:某控制用的计算机在执行初始化程序后,需要接收到:(1)准备就绪信号为逻辑“1”;(2)主回路工作正常信号为逻辑“1”;(3)启动开关闭信号为逻辑“1”;方可执行主程序,否则进行循环检测,等待条件的满足。,设该三个信号由P1口的P1.2、P1.4、P1.6位输入,分别称作D2、D4、D6,则当D2=D4=D6=1时,逻辑函数f=D2.D4.D6=1,方执行主程序,否则踏步等待。实现这一要求的流程如图9.8所示:,图9.8 逻辑“与”模拟流程图,“与”函数的模拟程序片断如下:AND

23、1:MOV A,P1;取状态字:D7 D0 ANL A,#54H;送屏蔽字:01010100 CJNE A,#54H,AND1;比较跳转,若f=1,执行主程序 MAIN 否则f=0,循环检测,二.逻辑“或”函数的程序模拟例13:在报警程序中,只要主电路工作异常,或者过压,或者过流,或者过载,都应当及时发出声光报警信号。设过压、过流、过载信号分别由P1口的P1.0、P1.3、P1.6输入分别称作D0、D3、D6,则当D0=D3=D6=0时,逻辑函数f=D0+D3+D6=0,连续循环检测,否则发出报警信号。,“或”函数f=D0+D3+D6的模拟程序片断如下:OR10:MOV A,P1;取状态字:D

24、7 D0 ANL A,#49H;送屏蔽字:01001001 JZ A,OR10;比较跳转,若f=1,发出报警信号 DONE:否则f=0,循环检测,三.任意逻辑函数的程序模拟步骤:先把给定逻辑函数化为最小化“与-或”表达式然后画出实现该函数程序模拟的流程图编写模拟程序,例14 求其模拟程序。设变量均由P1口输入,连接如下:将最小化F2最小化为:以原变量化简:以反变量化简:,图9.9 F2函数程序模拟流程图,F2函数程序模拟流程图如图9.9所示:,编写源程序片断如下:以原变量编程:F2 MOV A,P1;取状态字 ANL A,#09H;送屏蔽字 XRL A,#08H;比较 JZ BRAN1;F2=

25、1去BRAN1 MOV A,P1;ANL A,#0AH;XRL A,#08H;JZ BRAN1;F2=1去BRAN1 MOV A,P1;ANL A,#0CH;XRL A,#04H;JZ BRAN1;F2=1去BRAN1,以反变量编程:MOV A,P1;ANL A,#0BH;XRL A,#0BHP;JZ BRAN2;转BRAN2 MOV A,P1;ANL A,#0CH;XRL A,#00H;JZ BRAN2;转BRAN2,9.3.7 查表程序设计,查表程序是一种常用程序,它广泛使用于LED显示控制、打印机打印控制、数据补偿、数值计算、转换等功能程序中,这类程序具有简单、执行速度快等特点。所谓查表

26、法,就是预先将满足一定精度要求的表示变量与函数值之间关系的一张表求出,然后把这张表存于单片机的程序存储器中,这时自变量值为单元地址,相应的函数值为该地址单元中的内容。查表,就是根据变量 X在表格中查找对应的函数值 Y,使 Y=f(X)。,MCS-51指令系统中,有两条查表指令:MOVC A,A+PC MOVC A,A+DPTR,例 15 一个十六进制数存放在内部 RAM 的 HEX单元的低 4 位中,将其转换成ASCII码并送回 HEX单元。十六进制09的ASCII码为30H39H,AF的ASCII码为41H46H,ASCII码表格的首地址为ASCTAB。编程如下:,ORG 1000H 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。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号