版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微机原理及应用微机原理及应用微机原理及应用第4章汇编语言程序设计4.1汇编语言的基本概念4.2顺序程序设计4.3分支程序设计4.4循环程序设计4.5查表程序4.6子程序22020/11/14第4章汇编语言程序设计4.1汇编语言的基本概念
4.2顺序程序设计
4.3分支程序设计
4.4循环程序设计
4.5查表程序
4.6子程序2020/11/1424.1汇编语言的基本概念4.1.1计算机语言程序是计算某一算式或完成某一工作的若干指令的有序集合。目前,用于程序设计的语言可分为三种;机器语言、汇编语言和高级语言。一、机器语言
在计算机中,所有的数符都是用二进制代码来表示的,指令也是用二进制代码来表示。这种用二进制代码表示的指令系统称为机器语言系统,简称为机器语言。直接用机器语言编写的程序称为手编程序或机器语言程序。2020/11/143
1.指令容易理解、记忆,用汇编语言编写的程序可读性好。
2.汇编语言指令与机器语言指令一一对应,用它编写的程序能最有效地利用存储空间。
3.指令直接访问CPU的寄存器、存储单元和I/O端口,可以充分发挥CPU的功能,满足实时控制的要求。
4.汇编语言是面向机器的语言,对使用者来说,必须对机器的硬件结构、指令系统都要熟悉,所以掌握起来不太容易。此外,汇编语言程序的通用性差,程序不能移值。二、汇编语言
汇编语言是一种符号。在汇编语言中,指令用助记符表示,地址、操作数可用标号、符号地址及字符等形式来描述。汇编语言有以下特点:2020/11/144几个与汇编语言相关的术语:汇编语言源程序:用汇编语言编写的程序称为汇编语言源程序,简称源程序。汇编(过程):将汇编语言源程序翻译成机器码目标程序的过程,称为汇编过程,或简称汇编。手工汇编与机器汇编:前者是指人工进行汇编;后者是指由计算机进行汇编。汇编程序:它是计算机的系统软件之一,用于把汇编语言源程序翻译成目标程序,它的功能如图所示。汇编语言源程序汇编程序目标程序源程序列表2020/11/145三、高级语言高级语言是以接近于人的常用语言形式编写程序的语言总称,它是一种面向过程而独立于机器的通用语言。不依赖于计算机的结构和指令系统。用高级语言编写的源程序,必须经编译程序或解释程序进行翻译生成目标程序,机器才能执行。高级语言的特点是简短、易学、易懂,编程快,具有通用性,便于移值到不同机型。但是,高级语言的编译或解释程序使系统开销大,生成的目标程序占存储单元多,执行时间长。同时,目前用高级语言处理接口技术和中断技术还比较困难,所以,它不适合于实时控制。综上所述,三种语言各有特点,采用何种程序设计语言,这取决于机器的使用场合和条件。在单片机应用中,一般使用汇编语言编写程序。因此,要想很好地掌握和应用单片机,就必须学会和掌握汇编语言。2020/11/1464.1.2汇编语言的语句结构
一、汇编语言的指令类型
MCS-51单片机汇编语言,包含两类不同性质的指令。
1.基本指令:即指令系统中的指令。它们都是机器能够执行的指令。
2.伪指令:汇编时用于控制汇编的指令。它们都是机器不能够执行的指令。2020/11/147二、汇编语言的语句格式
汇编语言源程序是由汇编语句(即指令)组成的,汇编语句一般由四部分组成,每一部分称为一段。其典型的汇编语句格式如下:
标号:操作码操作数;注释以字母开头的1-8个字母或数字串指出指令操作的性质或控制要求指令操作的对象对源程序进行注释,说明程序段或关键指令的作用
例:START:MOVA,#30H;A30H
各段之间必须用定界符隔开,即在标号之后要加冒号“:”;在操作码与操作数之间要有空格间隔;在操作数内部要用逗号“,”将源操作数和目的操作数隔开;在注释段之前要加一分号“;”,若注释较长,需要换行时,也必须以分号“;”开始,机器对分号后面的内容不进行汇编。2020/11/1481.标号段
标号是用户给指令语句设定的一个符号,在汇编产生目标程序时,汇编程将把标号所指的指令语句目标码首字节的存储单元地址值赋值给该标号,于是,标号便可作为地址或数据在其他语句的操作数段中引用。
标号是以字母开头的1-8个字母或数字串组成,汇编时,超过的部分被截断而无效。注意,不能使用指令助记符、伪指令或寄存器名来作标号,标号不能重复定义。标号是任选的,并非所有指令语句都要一个标号,只是在程序调用或转移指令所需的地方才设置标号。采用标号便于查找、记忆和修改程序。建议使用能说明程序段功能的标号。2.操作码段
操作码指出指令操作的性质或控制要求,这是不可缺省的部分。该段可以是指令助记符或伪指令助记符。2020/11/1493.操作数段操作数是指令操作的对象,它是参加操作的数或是操作数所在的地址。操作数有三种类型:立即数(8位或16位)、寄存器和地址。表示这些信息的方法有多种:寄存器名、二进制数(B)、十六进制数(H)、十进制数(D或无字尾)、PC现行值($)、ASCII码(‘’)、已赋值的符号名、指令的标号以及表达式。为了区分数字和字符串,规定凡数字必须以0-9开头,所以对十六进制数,在非0-9开头的数字前需要冠以数字0。例如:MOVA,#0A4H。4.注释段对源程序进行注释,简明扼要地说明程序段或关键指令的作用,一般只在程序关键处加注释。汇编时,对于注释部分不予理会。它不会被翻译成机器码;汇编后的程序清单将注释原样列出。注意:注释前必须加分号“;”,如果注释的内容超过一行,则换行后前面还要加上分号。另外,注释也可以从一行的最前面开始。2020/11/14104.1.3伪指令
伪指令是非执行指令,只是在对源程序进行汇编的过程中起某种控制作用。例如,设置目标程序或数据存储区的起始地址,给程序分配一定的存储单元、定义符号、判断源程序是否结束等。伪指令汇编后不产生目标代码,它不影响程序的执行,所以有伪指令之称。常用的伪指令如下。2020/11/1411一、ORG(Origin)ORG是起点,用来设定程序或数据存储区的起始地址。它的格式如下:
ORG16位地址例如:ORG2000HSTART:MOVA,#40H
上例说明程序的起始地址是2000H,若ORG指令不带操作数,则汇编后目标程序的起始地址为0000H。二、ENDEND是汇编语言源程序结束的伪指令,表示源程序结束。在END以后所写的指令,汇编程序都不予处理。一个源程序只能有一个END指令,放在程序的末尾。2020/11/1412三、EQU(Equate)
EQU是赋值(或等值)指令。他的作用是,把操作数段中的地址或数据赋值给标号。经赋值后的标号,其值在整个程序中不改变,且可多次使用。它的格式如下:
标号(字符名称)EQU数或汇编符号注意,标号与EQU之间不能用“:”来作分隔符。例如,COUNTEQU16H;COUNT=16HADDREQU3000H;ADDR=3000HMOVA,COUNT;A(16H)注意,使用EQU指令时,必须先赋值,后使用;而不能先使用,后赋值。2020/11/1413四、DB(DefineByte)DB是定义字节数据。它的作用是,从指定的地址单元开始,定义(存储)若干个字节的数据或ASCII码字符,常用于定义数据常数表。它的格式如下:
[标号:]DB字节常数表其中方括号的内容是任选项。例如,ORG2000HTAB:DB14H,26,‘A’DB0AFH,‘BC’
汇编结果:(2000H)=14H(2001H)=1AH
(2002H)=41H(2003H)=AFH
(2004H)=42H(2005H)=43H2020/11/1414
五、DW(DefineWord)DW定义字数据。它的功能是,从指定的地址单元开始,定义(存储)若干个字数据,常用于定义地址表。它的格式如下:
[标号:]DW字常数表一个字占两个存储单元,其中高字节数存入低位地址,低字节数存入高位地址,即顺序存放。例如,ORG2000HTAB:DW7423H,00ABH,20
汇编结果:(2000H)=74H(2001H)=23H
(2002H)=00H(2003H)=ABH
(2004H)=00H(2005H)=14H2020/11/1415六、DS(DefineStore)
DS是定义存储区。它的功能是,从指定的地址开始,保留一定数量的内存单元,以备程序使用。其区域的大小由指令的操作数确定。它的格式如下:[标号:]DS表达式其中,表达式一般是数值,即要保留的内存单元个数。例如,ORG1000HDS5DB23H
汇编结果:从地址1000H开始,保留5个字节的内存单元,而(1005H)=23H。2020/11/1416七、BITBIT是位地址符号指令。它的作用是,把位地址赋予给所规定的字符名称,常用于定义位符号地址。其格式如下:
字符名称BIT位地址例如,AABITP1.0BBBITP2.0
汇编后,把位地址P1.0P2.0分别赋给变量AA和BB,在程序中它们就是位地址了。2020/11/1417八、DATA
DATA是数据地址赋值指令。它的功能是,将数据地址或代码地址赋予给所规定的字符名称。其格式如下:字符名称
DATA表达式例如,MNDATA1000H
汇编后,MN的值为1000H。伪指令DATA与EQU的主要区别在于:用DATA定义的标识符在汇编时作为标号登记在符号表中,所以可以先使用后定义,而EQU定义的标识符在汇编时不登记在符号表中,因此必须先定义后使用。DATA指令在程序中常用来定义数据地址。2020/11/14184.1.3程序设计的一般步骤1.分析问题:熟悉和明确要求,建立数学模型。
2.确定算法:根据实际问题的要求和指令系统的特点,选择解决问题的方法。
3.设计程序流程图:程序流程图是程序结构的一种图解表示法,体现了程序设计思想,是把算法转化成程序的准备阶段。
4.分配内存单元:确定程序和数据区的起始地址。
5.编写汇编语言源程序:根据流程图和指令系统编写源程序。
6.调试程序:源程序编制好以后,必须上机调试。先将源程序通过汇编生成目标程序,并消除语法错误;然后在实用系统上进行联调修改,直至达到预定的要求。2020/11/1419端点框;表示程序的起点和终点处理框;表示处理功能判断框;表示判断功能,框内标明检测条件
子程序框;表示调用子程序连接符;表示程序框的连接点流程线;表示程序的走向2020/11/14204.2顺序程序
顺序程序(又称简单程序)是一种最简单、最基本的程序。它的特点是,程序按编写的顺序依次往下执行每一条指令,直到最后一条。这种程序虽然简单,但它是构成复杂程序的基础。例
两个无符号双字节数相加。设被加数存放于内部RAM的40H(高位字节),41H(低位字节),加数存放于50H(高位字节),51H(低位字节),和数存入40H和41H单元中。2020/11/1421程序如下:
START:CLRC;将Cy清零
MOVR0,#41H;将被加数地址送数据指针R0MOVR1,#51H;将加数地址送数据指针R1AD1:MOVA,@R0;被加数低字节的内容送入AADDA,@R1;两个低字节相加MOV@R0,A;低字节的和存入被加数低字节中
DECR0;指向被加数高位字节
DECR1;指向加数高位字节
AD2:
MOVA,@R0;被加数高位字节送入AADDCA,@R1;两个高位字节带Cy相加
MOV@R0,A;高位字节的和送被加数高位字节
RET2020/11/1422
例将两个半字节数合并成一个一字节数。设内部RAM40H,41H单元中分别存放着8位二进制数,要求取出两个单元中的低半字节,并成一个字节后,存入50H单元中。程序如下:START:MOVR1,#40H;设置R1为数据指针MOVA,@R1;取出第一个单元中的内容ANLA,#0FH;取第一个数的低半字节SWAPA ;移至高半字节INCR1 ;修改数据指针XCHA,@R1;取第二个单元中的内容ANLA,#0FH;取第二个数的低半字节ORLA,@R1;拼字MOV50H,A ;存放结果RET2020/11/1423ORG2000HMOVR0,#32HMOV@R0,#0;
32H单元清零MOVA,30H;取数XCHDA,@R0;低位数存32HORL32H,#30H;转换低位SWAPAORLA,#30H;高位转换MOV31H,AEND开始(32H)0A(30H)A(32H)低半字节(32H)(32H)+30HA高低半字节交换AA+30H(31H)A结束
例:将一个字节内的两位BCD码拆开并转换成ASCII码,存入RAM两个单元中。解:设BCD码在片内RAM30H单元中,转换结果分别存入31H和32H单元中,顺序存放。数字0-9的ASCII码为30H~39H。若将两位BCD码拆开分别放到另两个单元的低4位中,然后再加30H,即可实现BCD码到ASCII码的转换。程序流程图如图所示。2020/11/1424解:程序如下:ORG2000HMOVA,50H;取一数的低位字节ADDA,60H;两数低位字节相加DAA;BCD码修正MOV40H,A;存低位结果MOVA,51H;取一数的高位字节ADDCA,61H;两数高位字节相加DAA;BCD码修正MOV41H,A;存高位结果例:设有两个4位BCD码,分别存放在片内RAM的50H、51H单元和60H、61H单元中。试编写求这两数之和的程序,结果存放到40H、41H单元中,数据逆序存放。每进行一次加法运算,需要进行一次BCD码调整高位低位2020/11/1425ORG2000HMOVA,R7;取高位字节
JBACC.7,NEG1SJMPSTOPNEG1:MOVA,R6;取低位字节
CPLA;低位字节求补
ADDA,#01HMOVR6,A例:求16位二进制数的补码。设16位二进制数存放在R7、R6中,求补后存入R7、R6中。解:先判断该数的正负,正数补码等于原码,负数,二进制数的补码可用取反加1的方法求得,先低位字节变反加1,然后高位字节变反再加低位变补后的进位。程序如下:2020/11/1426MOVA,R7;取高位字符
CPLA;高位字节求补
ADDCA,#0ORLA,#80H;恢复负号
MOVR7,ASTOP:SJMPSTOP;暂停
END2020/11/14274.3分支程序
利用条件转移指令形成不同的程序分支,这就是分支程序。分支程序有三种基本形式,如图所示。条件值?SNY条件值?S1NYS2K=?S0S1Sn01N……图(a)当条件满足时,执行程序段S,条件不满足时,则跳过程序段S。图(b)是当条件满足时,执行程序段S1;条件不满足时,则执行程序段S2。图(c)是一种多向分支情况,根据给定或计算的K值,选择相应的分支。2020/11/1428例:判16位无符号数的大小。设MH、ML、NH、NL分别表示M、N两个无符号数的高8位和低8位。如果M≥N,则转BIGI处理程序;否则,M<N,转LESI处理程序。MH>NH?M﹤N处理开始AMHMH=NH?AMLML=NL?ML>NL?M≥N处理结束NNNNYYYY2020/11/1429
ORG2000HMOVA,#MHCJNEA,#NH,AAMOVA,#MLCJNEA,#NL,BBSJMPBIG1;M=N转BIG1AA:JNCBIG1;M>N转BIG1SJMPLES1;M<N转LESIBB:JNCBIG1;M>N转BIG1LES1:CLRPSW.5;M<N,使F0=0SJMPDONEBIG1:SETBPSW.5;M≥N,使F0=1DONE:SJMPDONE2020/11/1430例:设数a在30H单元中,数b在31H单元中,试编写计算下式的程序:a+b(当b≥10时)Y=a-b(当b<10时)结果Y存入32H单元中。解:程序如下:
ORG1000HMOVA,31HCJNEA,#10,SUBAB;b不等于10,转SUBABADDAB:ADDA,30HMOV32H,ASJMPDONESUBAB:JNCADDAB;cy=0,b>10,转ADDABCLRC;cy=1,b<10,计算a-bMOVA,30HSUBBA,31HMOV32H,ADONE:SJMP$;暂停2020/11/1431多向分支程序设计举例例:符号函数
1(当x>0时)Y=0(当x=0时)-1(当x<0时)设变量x存于VAR单元中,函数值Y存于FUNC单元中,要求编写按上述函数式给Y赋值的程序。开始AXA=0?A>0?A-1A1结束NNYY存结果2020/11/1432
ORG1000HVARDATA30HFUNCDATA31HMOVA,VAR;取XJZCOMP;X=0,转COMPJNBACC.7,POSI;X>0,转POSIMOVA,#0FFH;X<0,则-1YSJMPCOMPPOSI:MOVA,#1;X>0,则1YCOMP:MOVFUNC,ASJMP$2020/11/1433
实现多向分支的主要方法是采用分支表法。常用的分支表的组成有三种形式:分支地址表转移指令表地址偏移量表例:根据R3的值,控制转向8个分支程序。
R3=0,转向SUBR0
R3=1,转向SUBR1
R3=7,转向SUBR72020/11/1434解法1:采用分支地址表法。
MOVDPTR,#BRATAB;取表首地址MOVCA,@A+DPTR
;查表JMP@A+DPTR;转移
BRATAB:DB
SUBR0
;分支地址表
DBSUBRl
DBSUBR7地址2020/11/1435解法2:采用转移指令表。
MOVDPTR,#JMPTABMOVA,R3ADDA,R3;AR3X2JNCNADDINCDPH;有进位加到DPHNADD:JMP@A+DPTRJMPTAB:AJMPSUBR0;转移指令表
AJMPSUBRl
AJMPSUBR72020/11/1436解法3:
采用地址偏移量表。
MOVDPTR,#DISTAB;取表首地址
MOVA,R3
MOVCA,@A+DPTRJMP@A+DPTRDISTAB:DB
SUBR0—DISTAB
;地址偏移量表
DBSUBR1—DISTABDBSUBR7—DISTABSUBR0:SUBR1:偏移量2020/11/14374.4循环程序设计一、循环程序的结构置循环初值循环结束?NY循环体修改指针结束部分开始结束置循环初值循环体修改指针开始循环结束?结束部分结束NY2020/11/1438
循环程序一般包括如下四个部分:(1)置循环初值(或称初始化):即设置循环开始时的状态,比如设置地址指针,设定工作寄存器,设定循环次数等。(2)循环体:这是要重复执行的程序段,是循环结构的基本部分。(3)循环控制:循环控制包括修改指针,修改控制变量和判断循环是结束还是继续。修改指针和变量是为下一次循环判断作准备,当符合结束条件时,结束循环;否则,继续循环。(4)结束:存放结果或作其他处理。2020/11/1439例:设有100个单字节数据,连续存放在内部数据存储器中,起始地址为BLOCK单元;数据和取为单字节数。存放在RESULT单元。试编写程序。
ORG1020HBLOCKDATA11HRESULTDATA10HMOVA,#0MOVR0,#BLOCK;置地;址指针
MOVR1,#100;置循;环次数LOOP:
ADDA,@R0;求和
INCR0;修改指针
DJNZR1,LOOPMOVRESULT,A;存结果
LP:SJMPLPNA0R0BLOCKR1100R1=0?Y
求和R0R0+1R1R1-1(RESULT)和开始结束2020/11/1440例:设一个无符号数据块,起始地址BUFFER,其长度存于LEN单元。试求出数据块中的最大数,并存入MAX单元。
ORG1020HMAXDATA20HLENDATA21HBUFFERDATA22HCLRAMOVR2,LENMOVR1,#BUFFERLOOP:
CLRCSUBBA,@R1;比较
JNCNEXT;A>(R1)转NEXTMOVA,@R1;A<(R1),A(R1)SJMPNEXT1NEXT:ADDA,@R1;恢复ANEXT1:INCR1DJNZR2,LOOPMOVMAXA;存结果LP:SJMPLPA0R1数据块首址R2数据块长度R1R1+1开始Cy=0?(MAX)A结束NYCy0AA-(R1)A(R1)AA+(R1)R2-1=0?YN2020/11/1441例:求算术平均值在数据采集系统中,常采用算术平均滤波的方法对压力、流量等周期脉动的采样值进行平滑加工,即在一个采样周期中把N次采样的值相加,然后除以采样次数N,便得到该采样周期的值,设从P1口读入采样数据,在一个采样周期内连续采样8次,要求计算机它的平均值。ORG1000HMOVR0,#0;累加值的高8位
MOVR1,#0;累加值的低8位
MOVR2,#8;置累加循环8次LP1:
MOVP1,#0FFH;置P1为输入
MOVA,P1;输入读数
ADDA,R1;累加
JNCLP2INCR0;累加值的高8位加1LP2:MOVR1,A;累加值的低8位的和送R1DJNZR2,LP1;未完,继续
MOVR3,#3LP3:MOVA,R0;累加和除以8
CLRCRRCAMOVR0,AMOVA,R1RRCAMOVR1,A
DJNZR3,LP3LP:SJMPLP2020/11/1442例:已知8051单片机系统的晶振频率为12MHz,试设计一个软件延时程序,延时时间为20ms。
ORG1000H;机器周期数(TM)DIMSEQU#250;
MOVR0,#20;1DELAY2:MOVR1,DIMS;1DELAY1:NOP;1NOP;1DJNZR1,DELAY1;2DJNZR0,DELAY2;2
tMC=12/fosc=12/(12MHZ)=1us设内循环1ms则:1ms=1000us=(1+1+2)×DIMS×1usDIMS=1000/4=250总延时机器周期数为:[(1+1+2)×250+1+2]×20+1=20061
2020/11/144310秒延时程序。延时程序与MCS-51执行指令的时间有关,如果使用6MHz晶振,一个机器周期为2μs,计算出一条指令以至一个循环所需要的执行时间,给出相应的循环次数,便能达到延时的目的。10秒延时程序如下:DELAY:MOVR5,#100DEL0:MOVR6,#200DEL1:MOVR7,#248DEL2:DJNZR7,DEL2DJNZR6,DEL1DJNZR5,DEL0RET2020/11/1444例:试设计一个排序程序,将5次采样值按从小到大的顺序排序。2020/11/1445例:试设计一个排序程序,将5次采样值按从小到大的顺序排序。
ORG2000HSAMPDATA30H
MOVR2,#04;置大循环次数SORT:MOVA,R2
MOVR3,A;置小循环次数
MOVR0,#SAMP;置地址指针LOOP:MOVA,@R0;取数
INCR0MOVR1,ACLRCSUBBA,@R0;(30H)-(31H)两数比较JCDONE;(R0)<(R0+1),(30H)<(31)不交换,转DONEMOVA,@R0;否则,交换
DECR0XCHA,@R0;(R0)(R0+1)INCR0MOV@R0,ADONE:DJNZR3,LOOPDJNZR2,SORTLP:SJMPLPR2大循环数NR2R2-1SORT结束R3小循环数(R0)<(R0+1)?Y(R0)(R0+1)指向下一个数R3R3-1R3=0?R2=0?YYNN2020/11/14464.5查表程序
作用:求函数值、完成数据补偿、修正、计算、实现代码转换、按键的识别、查找按键命令处理程序的入口地址、显示译码等各种功能,具有程序简单、执行速度快等优点。
查表指令:执行查表指令时,发出读程序存储器选通脉冲/PSEN。在MCS-51的指令系统中,给用户提供了两条极为有用的查表指令:
⑴MOVCA,@A+DPTR ⑵MOVCA,@A+PC
表格的定义方法:使用DB、DW伪指令,存放于代码段中。2020/11/14474.5查表程序
一、顺序查表例:在以DATA为首地址的存储区中,有一长度为100个字节的无序数据表,设要找的关键字放在KEY单元中,试编写程序,若找到关键字,则将它所在的内存单元地址存入R2、R3中;若未找到,则将R2、R3清零。
方法1:MOVCA,@A+PC开始(KEY)关键字R4100取表中的数=(KEY)?R4=0?地址+1R2R30NNYR2R3DPTR
结束Y2020/11/1448ORG1000HCHECKEQU20HKEYEQU21H
1000H852120MOVCHECK,KEY;取关键字1003H7C64MOVR4,#100
;置查找次数1005H7415MOVA,#15H;TABLE-L1=15H1007H901022MOVDPTR,#TABLE100AHC0E0LOOP:PUSHAcc100CH83MOVCA,@A+PC;取数100DHB52006L1:CJNEA,CHECK,A1;查找,未找到,转A11010HAA83MOVR2,DPH;已找到,地址送R2R31012HAB82MOVR3,DPL1014H80FEDONE:SJMPDONE1016HD0E0A1:POPAcc 1018H04INCA;求下一个数据地址1019HA3INCDPTR101AHDCEEDJNZR4,LOOP
;未完,继续查找101CH7A00MOVR2,#0;查完,未找到,0送R2R3101EH7B00MOVR3,#01020H0114AJMPDONE1022H4FTABLE:DB‘O’,’A’,’B’1023H412020/11/1449方法二:MOVCA,@A+DPTRORG1000HCHECKEQU20HKEYEQU21H1000H852120MOVCHECK,KEY;取关键字1003H7C64MOVR4,#100
;置查找次数1005H90101CMOVDPTR,#TABLE1008HE4LOOP:CLRA1009H93MOVCA,@A+DPTR;取数100AHB52006CJNEA,CHECK,A1;查找,未找到,转A1100DHAA83MOVR2,DPH;已找到,地址送R2R3100FHAB82MOVR3,DPL1011H80FEDONE:SJMPDONE1013HA3A1:INCDPTR;修改地址指针1014HDCF2DJNZR4,LOOP
;未完,继续查找1016H7A00MOVR2,#0;查完,未找到,0送R2R31018H7B00MOVR3,#0101AH80F5SJMPDONE101CH4FTABLE:DB‘O’,’A’,’B’101DH41101FH422020/11/1450二、计算查表法例:求函数y=X!(X=0,1,2,…7)。y地址=函数表首地址+X*22020/11/1451ORG2000HDATAAEQU30HMOVA,DATAA;取xADDA,DATAA;X*2MOVR2,AADDA,#06;计算偏移量TABLE-A1=06MOVCA,@A+PC;取第一个字节(高位)A1:XCHA,R2;高位存R2ADDA,#03;计算偏移量TABLE-A2+1=03
MOVCA,@A+PC;取第二个字节(低位)A2:MOVR3,A;低位存R3RETTABLE:DW1,1DW2,6DW24,120DW720,50402020/11/14524.6子程序
一、子程序设计原则和应注意的问题子程序是一种能完成某一特定任务的程序段。其资源要为所有调用程序共享。因此,子程序在结构上应具有独立性和通用性,在编写子程序时应注意以下问题:1.子程序的第一条指令的地址称为子程序的入口地址。该指令前必须有标号。2.主程序调用子程序,两条子程序调用指令:(1)绝对调用指令:ACALLaddr11
(2)长调用指令:LCALLaddr163.子程序最后一条指令必须是RET指令2020/11/14534.注意设置堆栈指针和现场保护5.子程序可以嵌套,即子程序可以调用子程序6.在子程序调用时,还要注意参数传递的问题二、子程序的基本结构
MAIN:┇ ;MAIN为主程序┇
LCALLSUB;调用子程序SUB ┇SUB:PUSHPSW ;现场保护
PUSHACC ┇
子程序处理程序段
POPACC ;现场恢复
POPPSW ;
RET ;最后一条指令必须为RET2020/11/1454
例:用程序实现c=a2+b2。设a、b均小于10,a、b、c分别存于片内RAM的三个单元DATAA、DATAB、DATAC中。
ORG2000HDATAAEQU31HDATABEQU32HDATACEQU33HMOVA,DATAAACALLSQR;求a2MOVR1,AMOVA,DATABACALLSQR;求b22020/11/1455ADDA,R1;求a2+b2MOVDATAC,AHERE:SJMPHEREENDSQR:INCAMOVCA,@A+PCRETTAB:DB0,1,4,9,16DB25,36,49,64,812020/11/1456ORG2000HHASC:CJNEA,#0AH,L1L1:JNCL2;A≥0AH,转L2ADDA,#30H;A小于0AH,则A+30HSJMPL3L2:ADDA,#37H;A≥0AH,则A+37HL3:RET例:编写1位十六进制数转换为ASCII码子程序2020/11/1457例:将累加器A中的ASCII码转换为1位十六进制数,结果存于A中。试编写程序。解:根据十六进制数和ASCII码之间的对应关系,可编写子程序如下:ASCHEX:CLRCSUBBA,#30HCJNEA,#0AH,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 线上教育保险合作协议书
- 承包期土地补偿协议书
- 超凡装饰样板间协议书
- 应届生协议书离职证明
- 美国二次引渡协议书
- 中学规范守则实施方案
- 不锈钢管道安装施工工艺标准
- 外墙保温施工质量方案范本
- 苯胺的课程设计
- c7220机床课程设计
- 一、内分泌危重患者抢救流程图
- 2023年江西新余中考历史真题及答案
- 2023中级无线电装接工技能理论考试题库(浓缩500题)
- 【人教版】八年级数学下册《一次函数与方程、不等式》基础测试卷及答案
- 预防接种妈妈课堂课件
- 《钢结构工程施工员培训教材》
- GB/T 31166-2014高尔夫球运动安全防护要求
- GB/T 193-2003普通螺纹直径与螺距系列
- 第六课-我是跟旅游团一起来的课件
- 边坡巡检记录表
- 《武汉理工大学学报》论文格式要求
评论
0/150
提交评论