【文档说明】第三章:汇编语言程序设计X课件.ppt,共(48)页,179.763 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44762.html
以下为本文档部分文字说明:
第三章:汇编语言程序设计X高级语言:§3-1汇编语言程序设计概述一、汇编语言的特点及其语句格式汇编语言:机器语言:程序设计语言:用二进制代码表示指令和数据。用助记符表示指令操作功能,用标号表示操作对象。独立于机
器,面向过程,接近自然语言和数学表达式.●助记符指令和机器指令一一对应,效率高、占用存储空间小、运行速度快,编制的程序是最优化的程序。●使用汇编语言编程比使用高级语言编程困难,要深入了解硬件。●汇编语言能直接管理
和控制存储器及接口电路等硬件设备,也能处理中断。●汇编语言无通用性,程序不易移植,各种计算机的汇编语言不能通用。1汇编语言的特点标号——语句地址的标志符号,其它语句访问该语句的地址。★1-8个ASCⅡ字符组成,第一个字
符必须是字母。★不能使用本汇编语言已经定义了的符号作标号(助记符伪指令寄存器名等)。★标号后为冒号(:)。★一个程序中的标号不能重复定义。★标号不是必须的,其它语句访问该语句时才定义标号。操作码——表示了该
指令所能执行的操作功能。操作数——表示参加操作的数的本身或操作数所在的地址。[标号:]操作码助记符[第一操作数][,第二操作数][;注释]2汇编语言的语句格式MCS-51指令格式:★在程序中需对数据的存放、寄存器和工作单元的使用作出具体安排。★
要对单片机的硬件结构有详细的了解。★程序设计的技巧性。二、汇编语言程序设计的特点§3-2汇编语言及汇编过程一、汇编程序功能源程序(汇编指令程序)汇编目标程序(机器码指令程序)汇编指令与机器码指令有一一对应的关系。汇编程序是一种翻译程序,将源程序翻译成目标程序。二、汇编程序的汇编过程汇编有两种方
法:手工汇编、机器汇编。1、手工汇编:第一次汇编:确定地址,翻译成各条机器码,字符标号原样写出;第二次汇编:标号代真,将字符标号用所计算出的具体地址值或偏移量代换。源程序目标程序地址ORG1000HSTART:
MOVR0,2FHMOVR2,#00HMOVA,@R0MOVR3,AINCR3SJMPNEXTLOOP:INCR0CJNE@R0,#44H,NEXTINCR2NEXT:DJNZR3,LOOPMOV2AH,R2SJMP$END第一次汇编第二次汇编1000A82F10027A
001004E61005FB10060B100780NEXT100908100AB644NEXT100D0A100EDBLOOP10108A2A101280FEA82F7A00E6FB0B800508B644010ADBF98A2A8
0FE2、机器汇编借助微机或开发器进行单片机的程序设计,编辑一个扩展名为“.ASM"的ASCⅡ码文件,然后用汇编程序进行汇编。单片机指令伪指令宏指令源程序编辑程序交叉汇编程序列表文件目标文件单片机调试运行编辑包含一
段独立代码原程序和机器码16进制代码机器汇编是一个两次扫描过程。第一次扫描:检查语法错误,确定符号名字;建立使用的全部符号名字表;每一符号名字后跟一对应值(地址或数)。第二次扫描:是在第一次扫描基础上,将符号地址转换成地址(代真);利用操作码表将助记符转换成相应的目标码。
三、伪指令伪指令是告诉汇编程序,如何汇编源程序的指令。伪指令既不控制机器的操作,也不能被汇编成机器代码,故称为伪指令。1、起始地址伪指令ORG(ORiGin)ORGaddr16用于规定目标程序段或数据块的起始地址,设置在程序开始处。2、汇编结束伪指令E
ND(ENDofassembly)告诉汇编程序,对源程序的汇编到此结束。一个程序中只出现一次,在末尾。3、赋值伪指令EQU(EQUate)告诉汇编程序,将汇编语句操作数的值赋予本语句的标号。格式:标号名称E
QU数值或汇编符号“标号名称”在源程序中可以作数值使用,也可以作数据地址、位地址使用。先定义后使用,放在程序开头。4、定义字节伪指令DB(DefineByte)告诉汇编程序从指定的地址单元开始,定义若干字节存储单元并赋初值。(定义数据)
格式:[标号:]DB字节数据或字节数据表或引号起来5、定义字伪指令DW(DefineWord)的字符串(ASCⅡ)从指定地址开始,定义若干个16个位数据,高八位存入低地址;低八位存入高地址。(定义地址)例、
ORG1000HPIOI:DW7654H,40H、12、„AB‟6、数据地址赋值伪指令DATA将表达式指定的数据地址赋予规定的字符名称格式:字符名称DATA表达式注:该指令与EQU指令相似,只是,可先使用后定义,放于程序开头、结尾均可。7、定义空间伪
指令DS从指定地址开始,保留由表达式指定的若干字节空间作为备用空间。格式:[标号:]DS表达式例2、ORG1000HDS0AHDB71H,11H,11H;从100BH开始存放;71H11H、11H。注:DB、DW、DS只能用于程序存储器;而不能用于数据存储器。8、位地址赋值伪指令BIT将
位地址赋予规定的字符名称。格式:字符名称BIT位地址例3、X1BITP1.2相当于X1EQU92H§3-3汇编语言程序的基本结构及应用举例程序编写做到:占用存储空间少;运行时间短;程序的编制、调试及排错所需时间短;结构清晰,易
读、易于移植。按结构化程序设计思想,任何复杂程序都可由顺序结构、分支结构、循环结构子程序结构语句3语句2顺序结构入口语句1出口分支结构入口条件满足否?分支1出口YN分支2循环结构入口处理修改条件条件满足否?Y出口N一、顺序程序举例例1、设在片内RAM的60H单元存有1个字节代码,要求将其分解成两个
4位字段,高4位存入原单元的低4位,其低4位存入61H单元的低4位,且要求这两个单元的高4位均为0,试编制完整程序。分析:####¥¥¥¥0000¥¥¥¥61H0000####60H解:核心指令ANLORL1000HMODE:MOVR0,#60HMOVA,@R0MOVB,AANLA,#0F0
HSWAPAMOV@R0,AANLB,#0FHMOVA,BINCR0MOV@R0,AEND二、分支结构与分支程序设计1单分支程序结构:根据不同的条件,进行相应的处理。通常用条件转移指令形成简单分支结构。如:判(A)=Z或NZ,转移(JZ
,JNZ)判(CY)=1或0,转移(JC,JNC)判(bit)=1或0,转移(JB,JNB,JBC)CJNE比较不相等转移DJNZ减1条件转移单分支程序举例例1、设在外RAM的ST1、ST2和ST3共三个连续单元,其中ST1、ST2存放着两个8位无符号二进制数,
要求找出其中大数存入ST3中。START:CLRC;进位位清”0“MOVDPTR,#ST1;设置数据指针MOVXA,@DPTR;取第一个数MOVR2,A;第一个数存R2INCDPTR;数据指针加1MOVXA,@DPTR;取第二个数SUBBA,R2;两数比较JNCBIG1;第二个数大转BI
G1XCHA,R2BIG0:INCDPTRMOVX@DPTR,A;存大数RETBIG1:MOVXA,@DPTRSJMPBIG0例2、设a存放在累加器A中,b存放在寄存器B中,要求按下式计算Y值,并将结果Y存于累加器A中,试编
写程序。a-b(a≥0)Y=a+b(a<0)解:本题关键是判a是正数,还是负数;由ACC.7便知。ORG1000HBR:JBACC.7,MINUSCLRCSUBBA,BSJMPDONEMINUS:ADDA,BDONE:SJMP$END2多分支程序多分支程序结构K=?转
向0分支转向1分支转向n-1分支转向n分支……K=0K=1K=n-1K=n指令系统中没有多分支转移指令,无法使用单条指令完成多分支转移例3、某温度控制系统采集的温度值Ta放在A中,内RAM54H放下限值T54,55H放上限值T5
5,若Ta>T55,程序转向JW,若Ta<T54,程序转向SW,若T55≥Ta≥T54程序转向FH多分支程序举例(1)使用多条CJNE指令,连续比较,实现多分支转移(A)=0?(A)=1?(A)=2?转向0分支转向1分支转向
2分支CJNEA,55H,LOOP1;Ta≠T55,转LOOP1AJMPFH;Ta=T55,返回LOOP1:JNCJW;若(CY)=0,则Ta>T55,转JWCJNEA,54H,LOOP2;Ta≠T54,转LOOP2AJMPFH;Ta=T54,返回LOOP2:JCSW;若
(CY)=1,则Ta<T54,转SWFH:RET多分支程序举例(2)使用查转移指令表的方法实现多分支转移也是以查表实现多分支程序转移,但表中放转移指令,转移指令用AJMP,转移范围是2KB(128分支),用LJ
MP是64K键功能键值处理程序读数据01DS写数据02XS插入03CR例5假定键盘上有3个操作键,键值已读入A中,其功能为:.MOVDPTR,#BRTABCLRCRLCAJMP@A+DPTRBRTAB:NOPNOPAJMPDSA
JMPXSAJMPCR..三、循环程序循环是为了重复执行一个程序段,汇编语言没有专用循环指令,只能用条件转移指令通过条件判断来控制循环是继续还是结束循环结构不但使程序简练,而且大大节省存储空间。循环程序包含四部分:1、初始化部
分(循环计数器、变量置初值)2、循环处理部分(主体,需要重复执行的部分)3、循环控制部分(修改地址指针、修改变量、检测循环结束条件)4、循环结束部分(对结果分析、处理,存放结果)先处理,后判断:开始初始化部分处理部分修改变量循环结束?结束部分结束YN先判断,后处理:开
始初始化部分修改变量循环结束?Y结束部分结束N处理部分循环有:单循环、多重循环。循环次数已知,可用计数器控制循环次数;循环次数未知,按问题条件控制循环是否结束。1、单循环程序(1)循环次数是已知的程序例1、已知片外RAM的1000H单元存放一8位二进制数,要求将其转移
成相应的ASCII码,并以高位在前,低位在后的顺序,依次存放到片内RAM以40H为首地址的连续单元中,试编程。解:先将中间单元置成30H,然后判欲转换位是否为1,若是,则将中间单元内容加1;否则,中间单元内容保持不变。通过左移指令实现由
高到低的顺序进行转换。START:MOVR2,#08H;循环计数初值(循环次数已知)MOVDPTR,#1000H;地址指针初值MOVR0,#3FH;地址指针初值MOVXA,@DPTR;取数MOVB,A;暂存B中LOOP:MOVA,#30H;
将中间单元(A)置成30HJNBB.7,NA;判断转换的二进制位为0否?INCA;若为1,则变成1的ASCII码“31H”NA:INCR0;修改地址指针MOV@R0,A;存放转换的结果MOVA,BRLA;作好准备,判断下一位MOVB,A;暂存DJNZR2,LOOP
;判断转换结束否?未完继续SJMP$(2)循环次数未知的程序例2、设用户用键盘输入长度不超过100字节的字符串放在8031单片机外部RAM以2000H为首地址的连续单元,该字符串用回车符CR(„CR‟=0DH)作为结束标
志,要求统计此字符串的长度并存入内部RAM的1FH单元中。解:从首单元开始取数,每取一数判断其是否为‘CR‟,是则结束。ORG1000HSTADADATA1FFFHSLANGDATA1FHCMCR2:MOVDPTR,#STADAMOVB,#0FFHCRLOP:INCDPTRIN
CBMOVXA,@DPTRCJNEA,#0DH,CRLOPMOVSLANG,BSJMP$END§3-4编程综合举例一、加减法运算两个N字节无符号数分别存放在内RAM的单元中,低字节在前,高字节在后,R0指定被减数单元地址,R1指定减数单元地址,差放原被减数单元CLRC;清进位
位MOVR2,#N;设定字节数LOOP:MOVA,@R0;从低位取被减数的一个字节SUBBA,@R1;两数相减MOV@R0,A;存字节相减的差INCR0INCR1DJNZR2,LOOP;两数相减完否JCQAZ;最高字节有借位转溢出处理RET二、乘
法运算进行两个双字节无符号数乘法运算,被乘数和乘数分别放在内RAM的R2、R3单元和R6、R7单元中,其中R2、R6为高字节,相乘结果(积)依次放在R4、R5、R6、R7中R2R3R6R7(×)R3R7HR3R7LR5R7R2R7HR2R7L(+)
R7R4R5R3R6HR3R6L(+)R7R6R5F0R2R6L(+)R7R6R5ACC.0R2R6H(+)R7R6R5R4DBMUL:MOVA,R3MOVB,R7MULAB;R3*R7(得到第一次部分积)XCHA,R7;原R7内
容送A,R7←R3R7L(在R7中得到乘积的第四字节)MOVR5,B;R5←R3R7HMOVB,R2MULAB;R2*R7(得到第二次部分积)ADDA,R5;R2R7L+R3R7HMOVR4,A;R4←和CLRAADDCA,B;R2R7H+(R2R7L+R5时产生的进位)MOVR5
,A;R5←和MOVA,R6MOVB,R3MULAB;R3*R6(得到第三次部分积)ADDA,R4;R3R6L+R4XCHA,R6;A←R6,R6←R3R6L+R4(在R6中得到乘积的第三字节)R2R3R6R7R3R7HR3R7LR5R7R2R7HR2R7LR7R4R5R3R6HR3R6L
R7R6R5F0R2R6LR7R6R5ACC.0R2R6HR7R6R5R4XCHA,B;A←R3R6H,B←R6ADDCA,R5;R3R6H+R5+(R3R6L+R4时产生的进位)MOVR5,A;R5←和MOVF0,C;F0←进位MOVA,R2MULAB;R2*R6(得到第四次部分积)ADDA,R
5;R2R6L+(R3R6H+R5时产生的进位)MOVR5,A;在R5中得到乘积的第二字节CLRAMOVACC.0,C;累加器最高位←进位MOVC,F0ADDCA,B;R2R6H+F0+ACC.0MOVR4,A;在R4中得到乘积的第一字节RETR
2R3R6R7R3R7HR3R7LR5R7R2R7HR2R7LR7R4R5R3R6HR3R6LR7R6R5F0R2R6LR7R6R5ACC.0R2R6HR7R6R5R4三、除法运算除法指令DIVAB是对单字节的,多字节除法不能直接使用,需要编程实现。常用
的一种方法是“移位相减”,即按位进行:从被除数高位逐位减去除数,够减商加1,依次一直循环到最后一位。移位方法:被除数向余数单元左移,而被除数腾出的低位用于存放商数,这样,除法完成后,被除数已经全部移到余数单元并逐次
减掉除数得到余数,而且被除数单元已经被商数代替。在大部分程序中,运算结束后,进行对余数的“四舍五入”处理两个双字节无符号数的除法数据单元分配:R7R6:被除数,程序执行后存商数R5R4:除数R3R2:存每次相除的余数,完成后为最终余数3AH:溢出标志单元,除数为0
,置3AH单元为”0FFH“R1:循环次数计数器(16次)R7R6R3R2R5R4(-)WDIV:MOV3AH,#00H;清溢出标志单元MOVA,R5JNZZERO;除数高位不为0转MOVA,R4JZOVER;除数为0转溢出处理ZERO:MOVA,R7JNZSTART;被除数高字节不为0开始运算M
OVA,R6JNZSTART;被除数低字节不为0开始运算RET;被除数字节为0结束程序START:CLRA;开始除法运算MOVR2,A;余数单元清”0“MOVR3,AMOVR1,#10H;置循环次数为10HLOOP:CLRC;进行一位除法运算MOVA,R6R
LCAMOVR6,AMOVA,R7RLCAMOVR7,AMOVA,R2;移出的被除数高位移入余数单元R7R6:被除数R5R4:除数R7R6R3R2R5R4(-)RLCAMOVR2,AMOVA,R3RLCAMOVR3,AMOV
A,R2;余数减除数SUBBA,R4;低位先减JCNEXT;不够减转移MOVR0,AMOVA,R3SUBBA,R5;再减高位JCNEXT;不够减转移INCR6;够减商为1MOVR3,A;相减结果送回余数单元MOVA,R0MOVR2,AN
EXT:DJNZR1,LOOP;不够16次返回……;四舍五入处理OVER:MOV3AH,#0FFH;除数为0置溢出标志RETR7R6:被除数R5R4:除数R7R6R3R2R5R4(-)四、十六进制数转换为ASCⅡ码ORG2000HH2ASC
:MOVA,R2;取待转换的数据(入口)ADDA,#0F6H;判此数是否≥10?若≥10,则C=1;<10,则C=0MOVA,R2;重取待转换的数据JNCAD30H;小于10就跳去加30HADDA,#07H;≥10就先加7再去加30HAD30H:ADDA,#30HMOVR2,A;存结果(
出口)RET例:16进制数(00H—0FH)转ASCII码子程序算法:凡≥10的十六进制数加37H;凡<10的十六进制数加30H。(参见ASCII码表)ie.0~9→30H~39H,A~F→41H~46H五、ASCⅡ码转换为16进制数在片内RAM的30H~3FH单元中的ASCⅡ码依次转换为
16进制数(高位在前),存放在内RAM的60H~67H单元中转换算法:计算法,把ASCⅡ码减30H,其结果:若小于0,为非16进制数;若为0~9即为转换结果;若大于等于0AH,应再减7,减7后:若在0AH~0FH之间即为转换结果若小于0AH或大于0FH,也是非16
进制数清C通过R0间址取数,并减30H是否小于0是否00H~09H减07H小于0AH?大于0FH?返回非16进制数YYYYNNN转换子程序流程主程序设置ASCⅡ码地址指针(R0)=30H设置16进制地址指针(R1)=60H设置拼装字节个数(
R7)=08H取出待转换的ASCⅡ码调用ASCⅡ码→16转换子程序A的高低4位交换转换结果存16进制缓冲区调用ASCⅡ码→16转换子程序与上一个16进制数拼装拼装结果送16进制数缓冲区(R0)+1→R0,(R1)+1→R1(R7)-1=0?结
束NY主程序流程入口参数:R0间址出口参数:AMAIN:MOVR0,#30H;设置ASCⅡ码地址指针MOVR1,#60H;设置16进制数地址指针MOVR7,#08H;拼装的16进制数字节个数AB:ACALLTRAN;调用转换子程序SWAPA;A高低4位交换MOVX@R1,A;存放外部
RAMINCR0ACALLTRAN;调用转换子程序XCHDA,@R1;16进制数拼装INCR0INCR1DJNZR7,AB;继续HALT:AJMPHALTTRAN:CLRC;清进位位MOVXA,@R0;取ASCⅡ码SUBBA,#30H;减30HJCERRORCJNE
A,#0AH,BBBB:JCDONESUBBA,#07HCJNEA,#0AH,BCBC:JCERRORCJNEA,#10H,BDBD:JNCERRORRET;返回ERROR:MOVA,#0FFHRET六、布尔处理机的应用假设有下列逻
辑方程,试求解:Q=U(V+W)+(XY)+Z..此方程可用硬件求解也可用软件求解,下图是用TTL硬件求解的方案&≥1。≥1&。UVWXYZQ..Q=U(V+W)+(XY)+Z软件求解方法:1利用字节型逻辑指令的方法2利用位测试指令的方法3利用布尔处理机逻辑操作指令子集的方法假定:U和V是输入引脚
P1.1和P1.2,W和X是2个外设控制器的状态位TF0(TCON.5)和IE1(TCON.3),Y和Z是程序中设置的软件标志20H.0和21H.1,Q是输出口引脚P3.3。布尔处理机逻辑操作指令求解程序UBITP1.1VBITP2.2WBITTF
0XBITIE1YBIT20H.0ZBIT21H.1QBITP3.3……MOVC,VORLC,WANLC,UMOVF0,CMOVC,XANLC,/YORLC,F0ORLC,/ZMOVQ,C上述三种程序的效益比较:占用存储器字节数执行周期数字节型逻辑指令5065位测试指令2416布尔处
理机指令集1818由此可见:布尔处理机在求解逻辑方程的应用中十分简单并且有效