《汇编语言及应用程序设计优秀课件.ppt》由会员分享,可在线阅读,更多相关《汇编语言及应用程序设计优秀课件.ppt(62页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、汇编语言及应用程序设计汇编语言及应用程序设计第1页,本讲稿共62页 9.1 伪伪 指指 令令 伪指令是对汇编过程 起控制作用,但本身并没有对应的机器代码的指令。一、一、汇编起始指令汇编起始指令 ORG 指令格式为:ORG nn 该指令的作用是指明后面的程序或数据块的起始地址,它 总是出现在每段源程序或数据块的开始。式中,nn为 16 位地 址,汇编时nn确定了此语句后面第一条指令或第一个数据的地 址,此后的源程序或数据块就依次连续存放在以后的地址内,直 到遇到另一个ORG指令为止。第2页,本讲稿共62页例:ORG 2000H MOV SP,60H MOV R0,2FH MOV R2,0FFH
2、ORG伪指令说明其后面程序的目标代码在存储器 中存放的起始地址是2000H,即 存储器地址 目标程序 2000H 75 81 60 2003H 78 2F 2005H 7A FF注意:一般要求ORG定义空间地址由小到大,且 地址不能重叠。第3页,本讲稿共62页 二、二、定义字节指令定义字节指令DB 指令格式:标号:DB 项或项表 其中:项或项表是指一个字节,数或字符串,或以引 括起来的ASCII码字符串(一个字符用ASCII 码表示,就相当于一个字节)。功能:把项或项表的数值(字符则用它的ASCII码)存入从标号开始的连续单元中。第4页,本讲稿共62页例:ORG 1000H SEG1:DB 5
3、3H,74H,78H,1,2 SEG2: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 第5页,本讲稿共62页 三、三、定义字指令定义字指令DW 指令格式:标号:DW 项或项表 其中:DW的基本含义与DB相同,但DB一般用于定 8位数据(一个字节),而DW则定义16位数 据,即一个字(规定为两个字节,即一个字为 16位二进制数)。注
4、意:在执行汇编程序时,机器会自动按高位字节在 前,低位字节在后的格式排列(与程序中的地 址规定一致),DW伪指令常用来建立地址表。第6页,本讲稿共62页 四、四、预留存储区预留存储区DS 指令格式:标号:DS 表达式 功能:由标号指定单元开始,定义一个存储区,以备 源程序使用,存储区预留的存储单元数由表达 式的值决定。例如:ORG 3C40H TEMP:DS 10 即由3C40H地址开始保留连续的10个存储单元的存储区。第7页,本讲稿共62页 五、五、标号指令标号指令EQU 指令格式:标号:EQU nn或表达式 功能:将语句操作数的值赋予本语句的标号,故又称为等值指令。注意:由 EQU等值的字
5、符名称必须先赋值后使 用,且在同一程序中,用EQU伪指令对 标号赋值后,该标号的值在整个程序中 不能改变。第8页,本讲稿共62页例:PA8155 EQU 8001H 即给标号PA8155赋值为8001H。使用等值指令可给程序的编制、调试、修改 带来方便,如果在程序中要多次使用到某一地址,由 EQU指令将其赋值给一个字符名称,一旦需要对其 进行变动,只要改变EQU命令后面的数字即可,而 不需要对程序中涉及到该地址的所有指令逐句进 行修改。第9页,本讲稿共62页 六、六、源程序结束源程序结束END 指令格式:标号:END 表达式 功能:是一个结束语句,告诉汇编程序段已结束 注意:该语句必须放在整个
6、程序(包括伪指令)之后,若END语句出现在代码块中间,则 汇编语言将不汇编END后面的语句。第10页,本讲稿共62页9.2 汇编语言源程序的汇编过程汇编语言源程序的汇编过程自动编排目标程序中的指令存放地址把源程序翻译成机器码分析源程序语法,若出错,给出错误信息输出目标程序及源程序文件列表第11页,本讲稿共62页 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 查表程序设计 第12页,本讲稿共62页9.3.1 简单程序设
7、计简单程序设计 例 1 两个无符号双字节数相加。设被加数存放于内部RAM的40H(高位 字节),41H(低位字节),加数存放于50H(高位字节),51H(低位字节),和数存入 40H和41H单元中。第13页,本讲稿共62页程序如下:START:CLR C ;将Cy清零 MOV R0,41H ;将被加数地址送数据指针R0 MOV R1,51H ;将加数地址送数据指针R1AD1:MOV A,R0 ;被加数低字节的内容送入A ADD A,R1 ;两个低字节相加 MOV R0,A ;低字节的和存入被加数低字 DEC R0 ;指向被加数高位字节 DEC R1 ;指向加数高位字节 MOV A,R0 ;被加
8、数高位字节送入A ADDC A,R1 ;两个高位字节带Cy相加 MOV R0,A ;高位字节的和送被加数高位字 RET 第14页,本讲稿共62页 例 2 将两个半字节数合并成一个一字节数。设内部RAM 40H#,41H单元中分别存放着 8 位二进制数,要求取出两个单元中的低半字节,并成一个字节后,存入50H单元中。第15页,本讲稿共62页程序如下:START:MOV R1,40H ;设置R1为数据指针MOV A,R1 ;取出第一个单元中的内容ANL A,0FH ;取第一个数的低半字节SWAP A ;移至高半字节INC R1 ;修改数据指针XCH A,R1 ;取第二个单元中的内容ANL A,0F
9、H ;取第二个数的低半字节ORL A,R1 ;拼字MOV 50H,A ;存放结果RET 第16页,本讲稿共62页9.3.2 分支程序设计分支程序设计图 9.1 分支结构框图(a)单分支流程;(b)多分支流程 第17页,本讲稿共62页例 3 x,y均为8位二进制数,设 x存入R0,y存入R1,求解:y=syn(x)图 9.2 第18页,本讲稿共62页程序如下:START:CJNE R0,00H,SUL1;R0中的数与00比较不等转移 MOV R1,00H;相等,R1 0 SJMP SUL2 SUL1:JC NEG ;两数不等,若(R0)0,则 R101H SJMP SUL2 NEG:MOV R1
10、,0FFH;(R0)0,则 R10FFH SUL2:RET 第19页,本讲稿共62页 例 4 比较两个无符号数的大小。设外部 RAM 的存储单元 ST1和 ST2中存放两个不带符号的二进制数,找出其中的大数存入外部 RAM 中的 ST3单元中。图 9.3 第20页,本讲稿共62页程序如下: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 A,DP
11、TR ;取第二个数 CLR C 第21页,本讲稿共62页SUBB A,R2;两数比较JNC BIG2;若第二个数大,则转XCH A,R2;第一个数大BIG1:MOV DPTR,ST3 MOVX DPTR,A;存大数RETBIG2:MOVX A,DPTR;第二个数大SJMP BIG1RET 第22页,本讲稿共62页9.3.3 运算程序设计运算程序设计一、一、加、加、减法程序减法程序 例5 将40H开始存放的10个字节的数与50H开始存放的10 个字节的数相减(假设被减数大于减数)。设被减数指针为 R0,减数指针为 R1,差数放回被减数单元,R5 存放字节个数,则程序如下:第23页,本讲稿共62页
12、 SUB:MOV R0,40HMOV R1,50HMOV R5,10CLR CSUB1:MOV A,R0SUBB A,R1MOV R0,AINC R0INC R1DJNZ R5,SUB1RET 第24页,本讲稿共62页 二、二、乘法运算程序乘法运算程序 在计算机中,常将乘法采用移位和加法来实现。例6 将(R2R3)和(R6R7)中双字节无符号数相乘,结果存入 R4R5R6R7。此乘法可以采用部分积右移的方法来实现,其程序框图如图 4.6 所示,程序如下:NMUL:MOV R4,0 ;初始化 MOV R5,0 CLR C MOV R0,16第25页,本讲稿共62页NMUL1:MOV A,R4 ;
13、CyR4R5R6R7右移一位 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 MOV R7,A JNC NMUL2;C为移出乘数的最低位 MOV A,R5;(R4R5)+(R6F7)(R4R5)第26页,本讲稿共62页 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第2
14、7页,本讲稿共62页 RRC A MOV R6,A MOV A,R7 RRC A MOV R7,A RET 第28页,本讲稿共62页图9.4 NMUL程序框图第29页,本讲稿共62页 三、三、除法运算程序除法运算程序 除法是乘法的逆运算,用移位、相减的方法来完成。首先比较被除数的高位字与除数,如被除数高位大于除数,则商为1,并从被除数中减去除数,形成一个部分余数;否则商位为 0,不执行减法。然后把新的部分余数左移一位,并与除数再次进行比较。循环此步骤,直到被除数的所有位都处理完为止,一般商的字长为 n,则需循环n次。一般计算机中,被除数均为双倍位,即如果除数和商为双字节,则被除数为四字节。如果
15、在除法中发生商大于规定字节,称为溢出。在进行除法前,应该检查是否会产生溢出。一般可在进行除法前,先比较被除数的高位与除数,如被除数高位大于除数,则溢出,置溢出标志,不执行除法。第30页,本讲稿共62页图图 9.5除法除法程序程序的流的流程程 第31页,本讲稿共62页 例 7 将(R4R5R6R7)除以(R2R3),商放在(R6R7)中,余数放在(R4R5)中。NDIV:MOV A,R5 ;判商是否产生溢出 CLR C SUBB A,R3 MOV A,R4 SUBB A,R2 JNC NDIV1 ;溢出,转溢出处理 MOV B,16;无溢出,执行除法 第32页,本讲稿共62页 NDIV2:CLR
16、 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 第33页,本讲稿共62页 MOV F0,C;保护移出的最高位 CLR C SUBB A,R3;部分余数与除数比较 MOV R1,A MOV A,R4 SUBB A,R2 JB F0,NDIV3;移出的高位为 1,肯定够减 JC NDIV4;否则,(Cy)=0才够减 NDIV3:MOV R4,A;回送减法结果 MOV A,R1 MOV R5,A INC R7;商上1 第34
17、页,本讲稿共62页 NDIV4:DJNZ B,NDIV2;循环次数减 1,若不为零则循环 CLR F0 ;正常执行无溢出 F0=0 RET NDIV1:SETB F0 ;溢出F0=1 RET 第35页,本讲稿共62页9.3.4 循环程序设计循环程序设计一、一、单重循环单重循环 图 9.6 第36页,本讲稿共62页 循环程序一般由四个主要部分组成:(1)初始化部分:为循环程序做准备,如规定循环次数、给各变量和地址指针预置初值。(2)处理部分:为反复执行的程序段,是循环程序的实体,也是循环程序的主体。(3)循环控制部分:这部分的作用是修改循环变量和控制变量,并判断循环是否结束,直到符合结束条件时,
18、跳出循环为止。(4)结束部分:这部分主要是对循环程序的结果进行分析、处理和存放。第37页,本讲稿共62页 例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;修改地址指针 DJNZ R2,LOOP ;修改计数器并判断 MOV SUM,A;存和 RET
19、 第38页,本讲稿共62页 二、二、多重循环多重循环 多重循环程序,即在一个循环体中又包含了其它的循环程序,使用多重循环时,必须注意:(1)循环嵌套,必须层次分明,不允许产生内外层循环交叉。(2)外循环可以一层层向内循环进入,结束时由里往外一层 层退出。(3)内循环可以直接转入外循环,实现一个循环由多个条件控制 的循环结构方式。第39页,本讲稿共62页 例9 在外部 RAM中,BLOCK开始的单元中有一无符号数据块,其个数为 LEN个字节。试将这些无符号数按递减次序重新排列,并存入原存储区。ORG 1000H START:MOV DPTR,BLOCK;置地址指针 MOV P2,DPH ;P2作
20、地址指针高字节 MOV R7,LEN ;置外循环计数初值 DEC R7 ;比较与交换 n-1次 第40页,本讲稿共62页 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 ;相等不交换 第41页,本讲稿共62页 NEXT:JC NOCHA;Cy=1,则前者大于后者,不必交换 SETB F0;否则,置交换标志 M
21、OVX R0,A;XCH A,B;两数交换,大者在前,小者在后 MOVX R1,A ;NOCHA:INC R0 INC R1;修改指针 DJNZ R6,LOOP1 ;内循环未完,则继续 JNB F0,EXIT ;若从未交换,则结束 DJNZ R7,LOOP0;外循环未完,则继续 EXIT:RET 第42页,本讲稿共62页图 9.7第43页,本讲稿共62页9.3.5 代码转换程序设计代码转换程序设计例10 4位二进制数转化为ASCII代码分析:从ASCII编码表可知,若4位二进制数小于10,则此二进制数加上30H即变成相应的ASCII码;若大于10(包括等于10),则应加37H方可。入口:转换前
22、4位二进制数存R2出口:转换后的ASCII码存R2第44页,本讲稿共62页源程序如下:ORG 2000HASCB1:MOV A,R2 ;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 ;返回主程序第45页,本讲稿共62页 例 11 设 4 位BCD码依次存放在内存 RAM中 40H43H单元的低4 位,高 4 位都为 0,要求将其转换为二
23、进制数,结果存入 R2R3 中。分析:一个十进制数可表示为:Dn10n+Dn-110n-1+D0100 =(Dn10+Dn-1)10+Dn-2)10+)+D0 当n=3时,上式可表示为:(D310+D2)10+D1)10+D0 第46页,本讲稿共62页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 第4
24、7页,本讲稿共62页 MULAB ADD A,R2 MOVR2,A ;R210+(R310)高 8 位送R2 INCR0 ;取下一个 BCD数 MOVA,R3 ADDA,R0 MOVR3,A MOVA,R2 ADDC A,0;加低字节来的进位 MOVR2,A DJNZ R1,LOOP RET 第48页,本讲稿共62页9.3.6 逻辑操作程序设计逻辑操作程序设计一一.逻辑逻辑“与与”函数的程序模拟函数的程序模拟例12:某控制用的计算机在执行初始化程序后,需要接收到:(1)准备就绪信号为逻辑“1”;(2)主回路工作正常信号为逻辑“1”;(3)启动开关闭信号为逻辑“1”;方可执行主程序,否则进行循环
25、检测,等待条件的满足。第49页,本讲稿共62页 设该三个信号由P1口的P1.2、P1.4、P1.6位输入,分别称作D2、D4、D6,则当D2=D4=D6=1时,逻辑函数f=D2.D4.D6=1,方执行主程序,否则踏步等待。实现这一要求的流程如图9.8所示:图9.8 逻辑“与”模拟流程图第50页,本讲稿共62页“与”函数f=D2.D4.D6的模拟程序片断如下:AND1:MOV A,P1;取状态字:D7 D0 ANL A,#54H;送屏蔽字:01010100 CJNE A,#54H,AND1;比较跳转,若f=1,执行主程序 MAIN 否则f=0,循环检测第51页,本讲稿共62页二二.逻辑逻辑“或或
26、”函数的程序模拟函数的程序模拟例13:在报警程序中,只要主电路工作异常,或者过压,或者过流,或者过载,都应当及时发出声光报警信号。设过压、过流、过载信号分别由P1口的P1.0、P1.3、P1.6输入分别称作D0、D3、D6,则当D0=D3=D6=0时,逻辑函数f=D0+D3+D6=0,连续循环检测,否则发出报警信号。第52页,本讲稿共62页“或”函数f=D0+D3+D6的模拟程序片断如下:OR10:MOV A,P1;取状态字:D7 D0 ANL A,#49H;送屏蔽字:01001001 JZ A,OR10;比较跳转,若f=1,发出报警信号 DONE:否则f=0,循环检测第53页,本讲稿共62页
27、三三.任意逻辑函数的程序模拟任意逻辑函数的程序模拟步骤:先把给定逻辑函数化为最小化“与-或”表达式然后画出实现该函数程序模拟的流程图编写模拟程序 第54页,本讲稿共62页例14 求其模拟程序。设变量均由P1口输入,连接如下:将最小化F2最小化为:以原变量化简:以反变量化简:第55页,本讲稿共62页图9.9 F2函数程序模拟流程图 F2函数程序模拟流程图如图9.9所示:第56页,本讲稿共62页编写源程序片断如下:以原变量编程:F2 MOV A,P1;取状态字 ANL A,#09H;送屏蔽字 XRL A,#08H;比较 JZ BRAN1;F2=1去BRAN1 MOV A,P1;ANL A,#0AH
28、;XRL A,#08H;JZ BRAN1;F2=1去BRAN1 MOV A,P1;ANL A,#0CH;XRL A,#04H;JZ BRAN1;F2=1去BRAN1第57页,本讲稿共62页以反变量编程:MOV A,P1;ANL A,#0BH;XRL A,#0BHP;JZ BRAN2;转BRAN2 MOV A,P1;ANL A,#0CH;XRL A,#00H;JZ BRAN2;转BRAN2第58页,本讲稿共62页9.3.7 查表程序设计查表程序设计 查表程序是一种常用程序,它广泛使用于LED显示控制、打印机打印控制、数据补偿、数值计算、转换等功能程序中,这类程序具有简单、执行速度快等特点。所谓查
29、表法,就是预先将满足一定精度要求的表示变量与函数值之间关系的一张表求出,然后把这张表存于单片机的程序存储器中,这时自变量值为单元地址,相应的函数值为该地址单元中的内容。查表,就是根据变量 X在表格中查找对应的函数值 Y,使 Y=f(X)。第59页,本讲稿共62页MCS-51指令系统中,有两条查表指令:MOVC A,A+PC MOVC A,A+DPTR 第60页,本讲稿共62页 例 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 第61页,本讲稿共62页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。第62页,本讲稿共62页
限制150内