《片机第三章汇编语言程序设计课件》由会员分享,可在线阅读,更多相关《片机第三章汇编语言程序设计课件(35页珍藏版)》请在金锄头文库上搜索。
1、第三章汇编语言程序设计第一节汇编语言程序的格式第二节伪指令第三节汇编语言程序的编写步骤及基本结构第四节程序设计举例本章要点 本章介绍汇编语言程序的书写格式、编写步骤以及程序的基本结构。通过一些具体范例,了解与掌握编程方法并从中掌握程序设计的基本技巧。第一节汇编语言程序的格式汇编语言编写的程序由语句组成,每一语句占一行填写一条指令。每行分4段,分别为标号、操作码、操作数和注释。ORG2000HADDR: MOVA,00H;累加器清零MOV41H,A;41H、42H清零MOV42H,AMOVR2,0AH;设定累加次数MOVR1,30H;设定数据首地址LOOP:MOVA,R1;取数ADDA,41H;
2、累加到41HJNCNEXT;是否有进位INC42H;有进位42H加1NEXT: MOV41H,A;将和存入41HINCR1DJNZR2,LOOPLJMP$END标号:代表该行指令所在的地址,结尾应加一冒号操作码:助记符或伪指令的符号。操作数:操作所需要的数据或数据的存储位置来源注释:对语句的说明,也可不加注释返回本章首页第二节伪指令伪指令不执行任何操作,汇编时也不生成目标程序。它仅仅提供对汇编的要求。汇编成机器语言后,伪指令就不存在了。以下为常用的伪指令:1.ORG(Origin)::指明汇编起始点地址。2.END:指明源程序至此结束。3.EQU(Epual):赋值伪指令,可对地址标号进行赋值
3、。4.DB(Define Byte):定义从指定标号地址开始所存放的字节数据,多字节时各字节间用逗号隔开。 5.DW(Define Word):定义从指定的标号地址开始,所存放的字数据。跟DB一样,输入几个字时各字间要用逗号隔开。 6.DS(Define Storage):定义存储区,表示从标号所指的存储单元开始,保留的内存单元数量,以供程序使用。返回本章首页第三节汇编语言程序的编写步骤及基本结构一、顺序结构:顺序结构是指程序按指令顺序逐条执行的一种结构。也是程序结构中最简单的一种结构。 二、分支结构: 指程序中具有转移指令,可根据转移条件决定是转移还是继续执行下一条指令。几种分支结构程序的框
4、图三、循环结构 循环结构由四个环节组成。1.初初始始化化部部分分:对循环体中参加操作的有关参数、地址等赋以初始值,并指定循环结束条件。2.循循环环体体部部分分:指每次循环都需要重复执行的程序段。3.修修改改初初始始值值:每次循环结束都要对初始值进行修改,特别是判断结束条件的参数,每经一次循环后都要作相应的修改,以便决定是否结束循环。4.结结束束判判断断部部分分:检查结束条件是否满足,若条件满足停止循环,否则返回继续执行循环体。 循环结构框图 图中每执行一次循环体后,都要检查结束条件是否满足,若条件满足停止循环,否则返回继续执行循环体。右边两图区别是先检查循环是否结束后修改初值,还是先修改初值后
5、检查循环是否结束。顺序结构的程序举例顺序结构的程序举例 例3-1将地址为2000H、2001H、2002H的片外数据存储单元的内容,分别传送到2002H、2003H、2004H存储单元中去。ORG0000HLJMP1000HORG1000HMOVDPTR,#2002HMOVXA,DPTRMOVDPTR,#2004HMOVXDPTR,AMOVDPTR,#2001HMOVXA,DPTR MOVDPTR,#2003HMOVXDPTR,AMOVDPTR,#2000HMOVXA,DPTRMOVDPTR,#2002HMOVXDPTR,ASJMP$分支结构的程序举例分支结构的程序举例例3-2有甲乙两数存于4
6、1H和42H存储单元,运算符号的ASCII码存于40H单元,编写一根据40H的符号,对甲乙两数进行相应运算的程序;井将运算结果存于43H单元。 ORG 0000H LJMP 0100H ORG 0100 MOV A,40H CJNE A,#2BH,MINUS PLUS: MOV A,41H ADD A,42H MOV 43H,A SJMP CLOSE MINUS:CJNE A,#2DH,ERRCLRC MOVA,41H SUBB A,42H MOV43H,A SJMP CLOSE ERR: MOV43H,#0FFH CLOSE:SJMP $ 循环结构的程序举例循环结构的程序举例 例3-3 有一
7、组数据,存放在30H为首地址的内存单元,数据长度为32个。试将每一个数分别取出加1,再存人以40H为首地址的内存单元。 ORG0000H0000 020100 LJMP0100H0100 ORG0100H0100 784FMOVR0,#4FH0102 795FMOVR1,#5FH0104 7F20MOVR7,#20H0106 E6LOOP:MOVA,R00107 04INCA0108 F7MOVR1,A0109 18DECR0010A 19DECR1010B DFF9DJNZR7,LOOP010D 80FESJMP$END 循环结构程序举例循环结构程序举例例3-4 编制一延时子程序,使执行这一
8、段程序延时2s。 0100 7D64 MOV R5,#64H 0102 7E64 LOOP1: MOVR6,#64H 0104,7F62 LOOP2: MOV R7,#62H 0106 DFFE LOOP3: DJNZ R7,LOOP3 0108 DEFA DJNZR6,LOOP2 010A DDF6 DJNZ R5,LOOPl 010C 22 RET 以上程序执行的时间近似为2秒,如要准确计算还需考虑执行对R5、R6、R7的赋值指令所需的时间、RET返回指令的时间等等。返回本章首页第四节程序设计举例一、多字节加法程一、多字节加法程序序例3-5两个10字节数,分别从存储单元0801H、和090
9、1H开始存放,先存低字节后存高字节,求其和并存于乙数原来所在的单元。多字节加法的程序多字节加法的程序0100ORG0100H0100900801 MOVDPTR,#0801H;甲数据地址010375A009 MOVP2,#09H;乙数据地址高字节01067901 MOVR1,#01H;乙数据地址低字节01087F0A MOVR7,#0AH;数据字节数010AC3CLRC010BE0LOOP:MOVXA,DPTR;取甲数010CFCMOVR4,A;暂存R4010DE3MOVXA,R1;取乙数010E3CADDCA,R4;两数相加并加上一次进位位010FF3MOVXR1,A;和存于原乙数的地址01
10、1009INCR1;修改地址指针0111A3INCDPTR0112DFF7DJNZR7,LOOP;继续相加0114E4CLRA01153400ADDCA,#00H0117F3MOVXR1,A;存最高字节进位位011880FESJMP$;结束二、数制变换二、数制变换 例3-6 将30H中的十六进制数转换为BCD码,并存于40H、41H。主程序:入口条件为待转换的十六进制数存R10100 ORG 0100H0100 A930 MOV R1,30H0102 122000 LCALL SUB0105 8A40 MOV 40H,R20107 8B41 MOV 41H,R30109 80FE SJMP $
11、 END子程序:出口条件为转换所得子程序:出口条件为转换所得BCD码存码存R2、R32000 ORG 2000H2000E9SUB;MOVA,R1;取十六进制数200175F064MOVB,#64H200484DIVAB;除以1002005FAMOVR2,A;商为百位数存R22006740AMOVA,#0AH2008C5F0XCHA,B;除100余数作为下一次的被除数200A84DIVAB;余数再除以10200BC4SWAP A200C45F0ORLA,B;十位个位合并200EFBMOVR3,A;十位个位合并存R3200F22RET 三三、求求最最大大值值或或最最小值小值 1.无无符符号号数数
12、求求最最大大值值与最小值与最小值例3-7在以2042H为首地址的存储单元中,连续存放一组单字节无符号数,数据个数存于2041H单元,从中找出最大数并存于2040H。无符号数求最大值或最小值的程序无符号数求最大值或最小值的程序0100 ORG 0100H0100 902041 MOVDPTR,#2041H0103 E0MOVX A,DPTR0104 FFMOV R7,A0105 753000 MOV30H,#00H0107 A3 LOOP:INC DPTR0108 E0 MOVX A,DPIR0109 B53002CJNEA,30H,HERE010C 8004SJMP TOSMA010E 400
13、2 HERE:JCTOSMA0110 F530MOV30H,A ;大于30H取代原有值0112 DFF3 TOSMA:DJNZ R7,LOOP ;小于30H,继续比较0114 902040MOV DPTR,#2040H0117 E530MOV A,30H0119 F0MOVXDPTR,A011A 80FESJMP $END 2.2.带带符符号号数数求求最大值或最小值最大值或最小值例3-8组单字节带符号数据存放在以2042H为首地址的连续单元中,数据长度存放在2041H单元,找出的最大值存于2040H单元。带符号数求最大值与最小值的程序带符号数求最大值与最小值的程序0100 ORG 0100H0
14、100 90204l MOV DPTR,#2041H0103 EO MOVX A,DPTR0104 FF MOV R7,A0105 7900 MOV R1,#80H;开始R1存最小值-1280107 A3 LOOP: INC DPTR0108 E0 MOVX A,DPIR0109 FA MOV R2,A010A C3 CLR C010B 99 SUBB A,R1010C 20E705 JB ACC.7,MINUS010F 20D209 PLUS:JBOV,SMA0112 8005 SJMP BIG带符号数求最大值与最小值的程序带符号数求最大值与最小值的程序( (续续) )0114 20D202
15、 MINUS:JB OV,BIG0117 8002 SJMP SMA0119 EA BIG:MOV A,R2011A F9 MOV R1,A011B DFEA SMA:DJNZ R7,LOOP011D 902040 MOV DPTR,#2040H0120 E9 MOV A,R10121 F0 MOVX DPTR,A0122 80FE SJMP $ END比较条件两数相减后标志状态X为正数,Y为正数 XY X-Y为正 OV=0 XY X-Y为正 OV=0 XY X-Y为正 OV=0 XY X-Y为负 OV=1 XY X为负数且Y为正数,X不可能大于Y XY X-Y为正 OV=1XYX-Y为负OV
16、=0带符号数的比较带符号数的比较 四、搜索四、搜索 例3-9有一批数据存放在以2043H为首地址的连续单元中,数据长度置于2042H存储单元,编制检索程序,使之能从该批数据中寻找是否有等于字母T的ASCII码的数据。字母T的ASCII码存放在2041H单元。ORG 0100HO100 902041MOV DPTR,#2041H0103 E0 MOVX A,DPTR;取关键字0104 F5F0MOV B,A0106 A3INCDPTR0167 E0MOVXA,DPTR0108 FFMOV R7,A0109 A3LOOP:INC DPTR010A E0MOVXA,DPTR010B 35F005 C
17、JNEA,B,LOOPl010E 753000MOV 30H,#00H;找到字母T0111 80FE SJMP$0113 DFF4LOOP1: DJNZR7,LOOP0115 7530FFMOV30H,#0FFH;找不到字母T0118 80FESJMP$END检索程序举例检索程序举例 五、排序五、排序 例3-10一组无符号的二进制数,存于以30H为首地址的连续单元中,数据长度存于21H单元,试设计一程序,使该组数据按从大到小的顺序排列。ORG 0100H0100 E521 MOVA,21H0102 l4DEC A0103 FFMOVR7,A ;定外循环次数0104 FEMOVR6,A ;定内循
18、环次数0105 8F22MOV23H,R60107 752230MOV 22H,#30H;首地址存22H010A A822 NEXT:MOV R0,22H010C E6 MOV A,R0010D F9 MOV R1,A ;设首地址内容存R1010E 08 LOOP:INC R0010F C3 CLR C0110 96SUBB A,R00111 5003JNC TOSMA0113 E6MOV A,R00114 C9XCH A,R10115 F6 MOV R0,A;若大于R1,双方易位排序程序举例排序程序举例0116 E9 TOSMA: MOV A,R10117 DEF5DJNZ R6,LOOP0
19、119 A822MOV R0,22H01lB E9 MOV A,R10llC F6 MOV R0,A;存本轮最大值011D 0522INC22H;首地址加1011F 1523DEC 23H;比较次数减10121 AE23MOV R6,23H0123 DFE5 DJNZ R7,NEXT0125 80FE SJMP $续上续上0300 ORG0300HEXBEQU 00H0300 AE21MOV R6,21H;取数据长度0302 1ELOOP0:DECR60303 EEMOVA,R60304 FFMOVR7,A;定循环次数0305 C200CLREXB0307 7830MOVR0,#30H0309
20、 E6LOOP1:MOVA,R0;取数030A F5F0MOV B,A03OC 08INCR0030D C3CLRC030E 96SUBBA,R0;比较排序程序举例排序程序举例 (下沉法下沉法) )030F 4008 JC LOOP2;不交换0311 D200 SETB EXB ;交换0313 E5F0 MOV A,B0315 C6 XCH A,R00316 18 DEC R00317 F6 MOV R0,A0318 08 INC R00319 DFEELOOP2: DJNZ R7,LOOP1;结束判断031B 2000E4 JB EXB,LOOP0 ;是否无交换了031E 80FEFINIS
21、H: SJMP $ 下沉法下沉法续续六、查表六、查表 当某一变量x与函数y的关系无规律可循时,可以将变量x作为序号,函数y值作为元素,列出一份序号与元素的关系表。然后利用查表法从序号求得元素。 1.序号小于序号小于256256的查表程序的查表程序例3-11 设在寄存器R1存了两个BCD码,将它们转换为共阴数码管的七段码,存入21H和22H。 序号小于序号小于256256查表程序查表程序 TRAN: MOVDPTR,#TABLE ;取表头地址 MOVA, R1 ANLA, #0FH ;取BCD码低4位 MOVCA,A+DPTR ;换成七段码 MOV21H, A MOVA, R1 SWAPA ;转
22、换高4位位置 ANLA, #0FH ;取BCD码高4位 MOVCA,A+DPTR ;换成七段码 MOV22H,A RET TABLE: DB 06H,5BH,4FH,66H,6DH,7DH,7H,7FH,6FH 2.序号大于序号大于256的查表程序的查表程序当元素总数大于256,要用DPTR直接加16位序号,才能得到元素地址值。例3-13设有1000个元素的函数表,元素序号高8位存于20H,低8位存于21H,要求将求出的元素值存于30H。TRAN:MOVDPTR,#TABLE;取表头地址MOVA,21H;求元素位置低8位ADDA,DPLMOVDPL,AMOVA,20H;求元素位置高8位ADDC
23、A,DPHMOVDPH,ACLRAMOVCA,A+DPTR;取出元素MOV30H,ARETTABLE:DB. 3.元素值占两个字节以上的查表程序元素值占两个字节以上的查表程序当元素占两个以上字节,应考虑每个序号的偏移量。例3-14设序号存20H,且小于128,元素占2个字节,表头为2001H,即元素0地址为2001H、2002H,元素1地址为2003H、2004H,余类推。试根据序号求出元素值,并存于30H、31H。TRAN:MOVDPTR,#TABLEMOVA,20HRLA;序号乘2得序号与表头距离MOVR2,A;暂存于R2MOVC A,A+DPTRMOV30H,AMOVA,R2INCAMO
24、VC A,A+DPTRMOV31H,ARETTABLE:DB4.变量变量x的数值不是等差序列的数值不是等差序列的查表程序的查表程序解决这类问题可以采用搜索的办法,即制作一张序号与元素即x-y依序排列表,表中在每个序号x的后面紧接着元素y。表的结构如下:TAB:x1y1x2y2.xnyn 给出序号x的数值后,用搜索法查出它所在的地址,将查出的地址加1,就是元素所在的地址,然后从中取出y值。 七、散转程序七、散转程序 散转程序实际是一种并行分支程序,可根据某个输入值或运算结果,转到不同的分支处理。例3-15设程序中有四个功能子程序入口,分别为1000H、1200H、1400H、1600H。要求根据运行后21H的数值0、1、2、3转相应子程序。 ANYCHEN: MOV DPTR,#TABLE;取入口地址表头 MOV A, 21H;取输入值 RL A ADD A, 21H;输入值乘3 JMPA,A+DPTR TABLE:LJMP 1000H LJMP 1200H LJMP 1400H LJMP 1600H 返回本章首页