单片机原理及应用:第4章 汇编语言程序设计_第1页
单片机原理及应用:第4章 汇编语言程序设计_第2页
单片机原理及应用:第4章 汇编语言程序设计_第3页
单片机原理及应用:第4章 汇编语言程序设计_第4页
单片机原理及应用:第4章 汇编语言程序设计_第5页
已阅读5页,还剩144页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章汇编语言程序设计知识要点:伪指令及其使用方法;顺序结构、分支结构、循环结构程序设计方法;子程序、查表程序设计方法;数据运算和处理的典型汇编语言实现方法。

本章学习目标:能够读懂汇编程序,并能够编写较为复杂的汇编语言程序,懂得汇编程序仿真软件的使用,懂得调试汇编程序。4.汇编语言程序设计4.1程序设计概述4.2汇编语言伪指令4.3汇编语言程序结构与设计4.汇编语言程序设计程序设计语言的种类程序的编译和汇编程序设计的基本过程汇编语言的基本格式4.1程序设计概述1、

程序设计语言的种类高级语言:接近于人的常用语言形式,是一种面向过程

而独立于机器的通用语言,如C语言。

voidmain() { chara=21; charb=48; charc; c=a+b; }4.1程序设计概述汇编语言:它是一种符号语言,是一种面向机器的语言。

ORG 0000H MOV A, 15H ADD A, 30H MOV R0, A SJMP $ END4.1程序设计概述机器语言:是用二进制0,1表示指令和数据的最原始的程序设计语言。RAWDATA:E5152530F880FEDisassembledDATA:0000 E515 MOV A, 15H0002 2530 ADD A, 30H0004 F8 MOVR0, A0005 80FE SJMP$4.1程序设计概述选择程序设计语言类型的原则是什么?4.1程序设计概述2、

程序的编译、汇编和链接4.1程序设计概述4.1程序设计概述3、

程序设计的基本过程分析问题确定算法设计流程分配资源编写源程序调试、修改4.1程序设计概述4、

汇编语言的基本格式例:计算21+48

ORG0200H

START: MOV A,#21 ;A←21(1Cycle)

ADD A,#48 ;A←A+48(1Cycle)

MOV R1,A ;R1←A(1Cycle)

SJMP START;原地踏步(2Cycles)

END[标号:]操作码[第一操作数,第二操作数]

[;注释]4.1程序设计概述其中,Cycle:机器周期标号的作用:

为程序转移和子程序的调用提供转移目的地址。标号的命名方法:

1)由字母或数字组成,标号必须以字母开头。

2)不可使用关键字,如助记符、寄存器名。

3)建议使用具有描述性的符号,能够说明程序功能。[标号:]操作码[第一操作数,第二操作数]

[;注释]4.1程序设计概述4.1程序设计概述4.2汇编语言伪指令4.3汇编语言程序结构与设计伪指令的作用伪指令详解伪指令的应用

4.2汇编语言伪指令4.2.1伪指令的作用和使用方法伪指令的作用写在源文件中,用于控制汇编过程的命令。如设置程序或数据存储区的地址、定义符号、判断程序是否结束等。

没有对应的机器码,它是不可执行的指令。4.2汇编语言伪指令伪指令种类:ORG:指定语句行装载的起始地址,可以在同一文件中出现多次。END:指示语句行到此结束,一般出现在程序行结束以前。EQU:赋值指令,用于定义常数,或地址。

等同于C中的#define语句。DATA:定义字节地址。BIT:

定义位符号地址。DB:定义字节数据。用于给代码空间的存储单元进行初始化、

赋值,或定义表格。DW:

定义字数据,即两个字节。用于给代码空间的存储单元

进行初始化、赋值,或定义表格。

DS:

预留若干个存储单元,等同于C中的malloc函数。4.2汇编语言伪指令1、ORG(Origin)汇编起始地址命令

指定语句行装载的起始地址。

命令格式:ORGadd16例如,ORG2000H START:MOVA,#40H

上例说明程序的起始地址是2000H,第一条指令就从2000H开始存放。4.2汇编语言伪指令在一个源程序中,可以多次使用ORG指令,以规定不同程序段的起始位置不允许有重叠,即不同的程序段之间不能有重叠。通常所规定的地址从小到大。4.2汇编语言伪指令2、END汇编终止命令

汇编语言源程序结束的伪指令,表示源程序结束。

在END以后所写的指令,汇编程序都不予以处理,即不再翻译。

一个源程序只能有一个END指令,放在程序的末尾。4.2汇编语言伪指令3、EQU(Equate)赋值指令。

将操作数段中的地址或数据赋值给标号。赋值后的标号,其值在整个程序中不改变,可多次使用。

命令格式:标号EQU数或汇编符号

例如:COUNT EQU 16H ;COUNT=16H ADDR EQU 3000H ;ADDR=3000H MOV A, #COUNT ;A=16H标号与EQU之间不能用“:”来作分隔符。4.2汇编语言伪指令4、DATA

数据地址赋值指令

将数据地址或代码地址赋予所规定的标号。

命令格式为:字符名称 DATA表达式

例如,MN DATA10H

汇编后,MN的值为10H。

DATA指令在程序中常用来定义存放数据的单元字节地址。4.2汇编语言伪指令5、BIT位地址符号命令

将位地址赋予所规定的字符名称,常用于定义位符号地址。命令格式为:字符名称BIT位地址例如, AABITP1.0 BBBITP2.04.2汇编语言伪指令6、DB(DefineByte)定义字节命令

定义字节数据。它的作用是从指定的地址单元开始,定义数据或ASCII码字符,常用于定义数据常数表。

命令格式:

[标号:]DB字节常数表例如:

ORG2000H TAB:DB14H,26,'A' DB0AFH,‘BC’汇编结果:

(2000H)=14H(2001H)=1AH (2002H)=41H(2003H)=AFH (2004H)=42H(2005H)=43H2000H142001H1A2002H412003HAF2004H422005H434.2汇编语言伪指令7、DW(DefineWord)定义字命令

定义16位数据。从指定的地址单元开始,定义若干个字常数,常用于定义地址表。

命令格式为:[标号:]DW字常数表

例如,ORG2000H TAB:DW7423H,00ABH,20汇编结果: (2000H)=74H(2001H)=23H (2002H)=00H(2003H)=ABH (2004H)=00H(2005H)=14H2000H742001H232002H002003HAB2004H002005H14提示:一个字占两个存储单元,其中高字节数存入低位地址,低字节数存入高位地址,即顺序存放。4.2汇编语言伪指令8、DS(DefineStore)定义存储区

定义存储区。从指定的地址开始,保留一定数量的内存单元,以备程序使用,其区域的大小由指令的操作数确定。

命令格式:[标号:]DS数值

例如: ORG1000H DS5 DB23H汇编结果:从地址1000H开始,保留5个字节的内存单元,而(1005H)=23H1000H--1001H--1002H--1003H--1004H--1005H23H4.2汇编语言伪指令汇编语言伪指令应用实例4.2汇编语言伪指令ORG的应用:4.2汇编语言伪指令EQU、DATA的应用:4.2汇编语言伪指令BIT的应用:4.2汇编语言伪指令DB、DW的应用:4.2汇编语言伪指令使用DB、DW定义字符时可以用单引号,也可以用双引号,其作用等同。4.2汇编语言伪指令程序装载之后,程序空间显示结果:4.1程序设计概述4.2汇编语言伪指令4.3汇编语言程序结构与设计4.3汇编语言程序结构与设计程序的基本结构顺序分支循环子程序4.3.1顺序结构例:编写程序实现两个16bits无符号数的加法。(徐-例4.1)X+Y=0x5678+0x98761、基本原理分析1)分两次完成,每次完成8位加法。2)采用间接寻址方式,读取加数和被加数,以及保存结果。ADDC

ADD4.3汇编语言程序结构与设计2、资源分配

33H、32H:

存放被加数,以及结果37H、36H:

存放加数

22H.0:

存放和的最高位

R0、R1:

数据指针4.3汇编语言程序结构与设计3、流程图4.3汇编语言程序结构与设计4、

源程序4.3汇编语言程序结构与设计5、程序调试与测试调试方法:单步、断点调试方法程序测试:考虑有进位和没有进位两种情况。思考:1.保存和的最高位还有哪些方法?2.如何实现多字节数的减法?3.如何实现多字节BCD码数的加法,以及减法?4.3汇编语言程序结构与设计两个16位数加法(C51实现)4.3汇编语言程序结构与设计#include<reg52.h>unsignedintdataa=0; //定义被加数变量unsignedintdatab=0; //定义加数变量bitc; //定义进位位变量

voidmain(void){ a=0x5678;//赋值被加数

b=0xF876;//赋值加数

a=a+b;c=CY;//保存进位位}4.3汇编语言程序结构与设计4.3汇编语言程序结构与设计在源文件中如果需要对芯片的寄存器进行操作,就必须通过include引述头文件reg52.h!

4.3汇编语言程序结构与设计unsignedintdataa=0; //定义被加数变量unsignedintdatab=0; //定义加数变量bitc; //定义位变量a分配到片上08H,09H单元b分配到片上0AH,0BH单元c分配到20H.0Compiling…….4.3汇编语言程序结构与设计a分配到片外数据0000H,0001H单元b分配到片外数据0002H,0003H单元

unsignedintxdataa=0; //定义被加数变量unsignedintxdatab=0; //定义加数变量

4.3汇编语言程序结构与设计存储类型描述code程序存储区(64KBytes),由操作码“MOVC@A+DPTR”访问

data直接寻址内部数据存储区idata间接寻址内部数据存储区,可访问全部内部地址空间(256Bytes)bdata可位寻址内部数据存储区,支持位和字节混合访问。xdata外部数据存储区(64KBytes),由操作码“MOVX@DPTR”访问

pdata分页(256Bytes)外部数据存储区,由操作码“MOVX@Ri"访问

C51变量的存储类型4.3汇编语言程序结构与设计存储器模式描述SMALL参数及局部变量放入可直接寻址的内部存储器(最大128B,默认存储器类型为data)COMPAT参数及局部变量放入分页外部存储区(最大256B,默认存储器类型为pdata)LARGE参数及局部变量直接放入外部数据存储器(最大64KB,默认存储器类型为xdata)C51的存储器模式4.3.2分支结构程序设计分支结构形式与转移指令典型分支结构设计

二分支结构

三分支结构

散转结构4.3汇编语言程序结构与设计4.3.2分支结构程序设计分支结构形式if…thenelse…4.3汇编语言程序结构与设计switch(){}转移指令1.无条件转移 SJMP:

短跳转,转移范围-128B~+127B AJMP:

绝对跳转,转移范围2KB LJMP:

长跳转,转移范围64KB JMP:

散转指令,实现多分支2.条件转移

JZ/JNZ ;测试A

JC/JNC ;测试Cy JB/JBC/JNB ;测试某一比特位

CJNE ;比较两数的大小;可用于形成三分支结构DJNZ ;可用于循环结构4.3汇编语言程序结构与设计1、二分支结构设计例:求取|x|(x为8bits符号数)解:基本原理

当x<0:若已知[x]补=y,则有[y]补=|x|4.3汇编语言程序结构与设计

XDATA20H;

定义X为20H,符号数X存于20H单元中。

ORG0000H

LJMPSTART

ORG0200HSTART: MOVSP,#30H MOVA,X

JNBACC.7,ISPOS ;是正数 CPLA ;对负数取反加1 INCAISPOS: MOVX,A ;保存结果HERE: SJMPHERE

END

4.3汇编语言程序结构与设计例:二分支结构应用找出XD1,XD2单元中的最小数,并保存于XD3单元中。

X,Y均为无符号数,XD1位于片外1000H。(徐-例4.2)

解:设X:(1000H)=10,Y:(1001H)=20基本原理: 利用SUBB和JC指令判断数的大小关系徐-例4.22、

三分支程序设计例:判断电压值的范围,并设置相应的标志。(徐-例4.3)X>V50: Y=11H(满电)V40≤X≤V50: Y=10H(正常)X<V40: Y=01H(空电)解:基本原理: 利用CJNE和JC/JNC指令实现三分支

资源分配

A: 存放当前电压值 50H:存放电压上限值 40H:存放电压下限值 30H:存放标志变量流程图:10H徐-例4.3调试方法:1)合理选取测试样本集C={34,33,31,30,29}

保证测试数据的完备性,每个支路都要测试到!!!

2)合理设置断点3、

散转结构

散转结构的提出是为了仅仅使用单条指令就能高效地实现多分支。如满足按键处理的要求。switch(X){

case0: { … break; } case1: { … break; } …}散转结构程序 作用:实现按键响应,以及其它需要实现多分支的应用。特点:效率高。实现方法:1)散转指令表

2)散转地址表

3)散转偏移量表

例:根据R3的值,转向3个分支,R3中存放支路号。R3=0,转向R_KEY0R3=1,转向R_KEY1R3=2,转向R_KEY2解:a.构造转移指令表

JMP@A+DPTRENTRY: LJMPR_KEY0 ;转移指令表:3字节

LJMPR_KEY1

LJMPR_KEY2b.根据R3,计算偏移量偏移量=R3×31)散转指令表;MLJMP.lst思考:1.若按键数目达到100个,应如何修改程序?2.若改用AJMP指令,应如何修改程序?

;MAJMP.asm ORG0400HSTART: MOVDPTR,#ENTRY ;赋指令表入口地址

MOVA,R3 ;计算偏移量

MOVB,#3MULAB;JNBOV,NEXT ;

INCDPH;乘积>255时,

需要执行INCDPHNEXT: JMP@A+DPTR;散转ENTRY:LJMPR_KEY0 ;转移指令表:3

字节

LJMPR_KEY1 LJMPR_KEY2……LJMPR_KEY99LJMP指令与散转结构99×3=297=129H

;MAJMP.asm ORG0400HSTART: MOVDPTR,#ENTRY ;赋指令表入口地址

MOVA,R3 ;计算偏移量

ADDA,R3

JMP@A+DPTR ;散转ENTRY: AJMPR_KEY0 ;转移指令表:2

字节

AJMPR_KEY1 AJMPR_KEY2R_KEY0: CLRP1.0 SJMPSTARTR_KEY1: SETBP1.0 SJMPSTARTR_KEY2: MOVP1,#0AAH SJMPSTART ENDAJMP指令与散转结构4.3.3循环结构基本知识

循环结构三要素典型程序设计

延时程序

数据块求和、寻找最大数、均值滤波

4.3汇编语言程序结构与设计1、基本知识应用背景:常常某一段代码需要执行多次。常见C语言形式1) for(i=0;i<10;i++) { …… }4.3.3循环结构2)do while(I!=10){ { …… ……}while(I!=10); }3)for(;;){ … if(x==‘q’)break;}2、循环结构基本要素基本要素:循环变量,循环体,循环条件典型汇编语言循环结构Mode1:已知循环次数

MOVR6,#8 MOVR0,#30HLOOP: MOV@R0,#0 INCR0 DJNZR6,LOOP SJMP$Mode2:未知循环次数TEST: JBP3.0,QUIT;IfP3.0=1,thenquit!

INCA SJMPTESTQUIT: SJMP$3、典型程序设计

延时程序设计数据块求和寻找最大数

均值滤波例:延时程序设计应用背景:LED灯控制START:MOVP1,#11111110B ;2cycles MOVP1,#11111101B ;2cycles SJMPSTART ;2cycles全速执行时能够观察到LED闪烁现象吗?信号频率=1/6=167kHz(12MHz的晶振)人眼对频率高于24Hz的信号已不敏感。降低信号频率、改变占空比的方法:

START: MOVP1,#11111110B

NOP NOP MOVP1,#11111101B SJMPSTART若间隔1s需要插入多少个NOP指令?

NOP指令执行时间1us(12MHz),需要插入106个。所需程序存储空间为1M字节。试分析如下代码段的执行时间(晶振频率=8MHz)

MOVR2,#255 ;1cycleLOOP2: NOP ;1cycle NOP NOP DJNZR2,LOOP2 ;2cycles循环体执行时间 (1+1+1+2)×255=1275cycles整体时间:

1+1275=1276cycles=1.914ms

1cycle=12/8=1.5us若想延时20ms怎么办? MOVR3,#10LOOP1: MOVR2,#255 ;1cycleLOOP2: NOP ;1cycle NOP NOP DJNZR2,LOOP2 ;2cycles

DJNZR3,LOOP1 ;2cycles如何精确计算代码的运行时间?内循环体执行时间T内:5×255=1275cycles外循环体执行时间T外:(1+T内+2)×10

=(1+1275+2)×10

=12780cycles整体执行时间:1+T外=12781cycles

=19.172ms如何粗略估算运行时间?(1+1+1+2)×255×10=12750cycles=19.125ms思考:1.若延时1s,应如何修改程序?2.若晶振频率改为6MHz,则R3的初值为多少?3.如何形成多重循环?数据块的处理问题:1,54,3,0,36,5,78,27,9,……..求取累加和;或找出最大数、或最小数、或奇数、或偶数;或求取平均值;或找出大于X的所有数;或找出某个特定数;或由大到小排序。例:数据块求和(胡-例4.2.9)应用领域:内存测试通讯数据测试(校验和测试法)基本原理:

利用ADD实现数据累加,仅保留和的低8位。资源分配:R0:数据指针

R1:循环计数器

A:校验和(8位)

BLOCKDATA11H;定义数据块首地址RESULTDATA10H;定义结果单元地址

ORG1000HMOVA#0;累加器A清零

MOVR0,#BLOCK;置地址指针

MOVR1,#100;置循环次数LOOP:ADDA,@R0INCR0;修改指针

DJNZR1,LOOPMOVRESULT,A;存放结果

SJMP$数据块求和源程序:例:寻找最大数(胡–例4.2.10)应用领域:

消除噪声

基本原理:利用SUBB和JC指令判断大小关系。资源分配:R1:数据指针R2:循环计数器A:存放MAX值核心代码:LOOP: CLRC SUBBA,@R1 JNCNEXT;Cy=0,A中数较大MOVA,@R1SJMPNEXT1NEXT:ADDA,@R1;恢复A的值NEXT1:INCR1DJNZR2,LOOP思考:1.若寻找最小数,应如何修改程序?2.比较两数的大小还可使用什么指令?有何特点?比较转移指令

CJNE A,direct,rel CJNE A,#data,rel CJNE Rn,#data,rel CJNE @Ri,#data,relCJNE指令不改变第一、第二操作数的内容。例:

均值滤波(胡–例4.2.12)应用领域:数字滤波基本原理:

y=(X1+X2+X3+…+X8)÷8利用RRC指令实现双字节除8

资源分配:R0、R1:累加和,前者存放高位R2:计数器任务要求:在一个采样周期内连续采样8次,求采样值的平均值。采样数据从P1端口读入采样数据。1000100101001000100010010010001001R0R1CyCy01001000101001000CyRRCRRC如何实现双字节无符号数右移一次?如何保证从P1口正确输入采样值?编程中不要忘记写“读预备指令”MOVP1,#0FFH;读预备指令;保证P1能够正确输入外部信息MOVA,P1;读入电压值MOVA,P1;读引脚,

执行过程中会发出readpin信号

。均值滤波源程序4.3.4查表程序设计表格的用途表格的定义方法表格的结构和表项地址求取方法查表指令查表程序典型应用

应用1:已知十六进制数,求取其ASCII

应用2:利用散转地址表,实现多分支

应用3:利用顺序查表法,寻找关键字符4.3.4查表程序设计表格是计算机的一种基本数据结构。查表法是一种非数值计算方法,不需复杂计算。主要优点:可以大大简化程序,提高程序执行速度。主要缺点:如果表格过大,会占用较多的存储单元。常用查表方法:计算查表法、顺序查表法、对分查表法。1、表格的用途例:求sin(x)=?sin(x)=x-x3/3!+x5/5!-…+(-1)nx2n+1/(2n+1)!+…求函数值、传感器非线性校正、码制转换、LED字模转换2、表格的定义方法表格使用DB、DW伪指令定义,存放于代码段中。3、表格的结构和表项地址求取方法表项首地址=表首地址+表项序号×表项大小表项序号:0,1,2,3…表项大小:84、查表指令MOVCA,@A+DPTR;对应于DPTR查表方式MOVCA,@A+PC;对应于PC查表方式5、查表程序典型应用

应用1:已知十六进制数,求取其ASCII

应用2:利用散转地址表,实现多分支

应用3:利用顺序查表法,寻找关键字符例:利用查表法求取字符0-F的ASCII码

(lkup1.asm)基本原理:

利用DB语句定义字符的ASCII码表;

利用MOVC指令读取程序空间中的表格内容。

采用DPTR方式查表时,DPTR的初始值为表格首地址。

采用PC方式查表时,需要计算PC与表格首地址间的偏移量。寻找ASCII指令长度估算方法:指令基本长度为1字节;逢立即数(8bits)长度加1;逢立即数(16bits)长度加2;逢直接寻址方式,指令长度加1。两种查表方式特点比较例:利用散转地址表实现多分支

基本原理:利用DW伪指令将程序入口地址定义在程序空间中;利用MOVC分两次读取16位散转地址;利用JMP指令实现散转。

例:利用散转地址表实现多分支

解:利用DW伪指令将程序入口地址定义在程序空间中。散转地址散转地址存放的单元地址源程序:利用散转地址表实现多分支MDWJMP.asm

例:利用顺序查表,在无序表中查找关键字。任务要求:有一个长度为100字节的表格,其中数据无序存放,在其中找出KEY,并记录其在表中的地址号。若表中无此关键字,则返回0。基本原理:顺序读取表中内容,将其与KEY比较,判断是否相同。采用DPTR查表方式,其步骤:1)表的起始地址送入DPTR;2)表格的长度放在某一个寄存器中;3)要查找的关键字放在某一内存单元中;4)用MOVCA,@A+DPTR指令取数;5)用CJNEA,direct,rel指令判断是否是要找的关键字。

流程图无序表中搜索关键字调试结果:当(KEY)=08H,即希望查找数据8程序运行后有:思考:1)如果不知道表的长度,但知道表格的结束标志是’$’,

应该如何修改程序?2)表格能放在上电入口0000H的地方吗?

为什么?

会有什么严重后果?

ORG0000HDB‘!’,3,4,8,10,4,….

2)表格能放在上电入口0000H的地方吗?

ORG0000HDB‘!’,3,4,8,10,4,….不能!!!程序汇编和装载以后,程序空间结果如下:反汇编结果:表格数据被解析为指令,导致结果不可预见。4.3.5子程序设计子程序的作用调用和返回指令子程序的定义和调用方法参数传递方法

典型应用

:多字节加法

现场与现场保护方法

堆栈冲突及其规避

子程序的作用:提高程序的模块性,压缩代码长度。4.3.5子程序设计子程序设计要素:1)子程序需命名。子程序的第一条指令应加标号,

以便调用。2)要正确传送参数。3)注意保护和恢复现场。4)子程序的末尾必须是RET指令。1、调用和返回指令调用指令:LCALL,ACALL返回指令:RET,RETI(用于中断返回)ACALL:绝对调用LCALL:长调用RET:子程序返回LCALLaddr16

;PC←PC+3,

;SP←SP+1,((SP))←PC7~0

;SP←SP+1,((SP))←PC15~8

;PC←addr16RET

;PC15~8←((SP)),SP←SP-1

;PC7~0←((SP)),SP←SP-1子程序返回指令。功能:将堆栈内的返回地址送入PC,

使CPU返回到原断点地址处,继续执行原程序。2、子程定义和调用方法

ORG0030HSTART: MOVSP,#40HAGAIN: SETBP1.0

LCALLDELAY CLRP1.0

LCALLDELAY SJMPAGAIN;------------------------------------------------------DELAY: MOVR6,#40DLOOP: NOP DJNZR6,DLOOP

RET ENDLCALL指令执行后:

返回地址0038H

存入堆栈,SP指针向上移动两个单元380041H42Hxx40HSP准备执行LCALL指令…..SP0x40SP-max0x40PC转移到子程序DELAY的入口……SP0x42SP-max0x42PC返回主程序……SP0x40SP-max0x42片上RAM空间

信息0x40:0000000000……

片上RAM空间

信息0x40:0038000000……

3、参数传递方法入口参数:子程序执行中所必须的寄存器值或存储单元内容(或地址)。出口参数:子程序执行完毕后,结果存放的寄存器或存储单元(或地址)。

MOV A,#4 LCALL SQR ……

SQR: MOV B,A MUL AB RET入口参数:A出口参数:A,B入口参数、出口参数传递方法:1.利用A2.利用寄存器,或存储单元3.利用堆栈

MOVR6,#40H LCALLDELAY …… ;------------------------------------------------- DELAY: NOP DLOOP: NOP DJNZR6,DLOOP RET例:两个3字节数加法入口参数:R0,R1出口参数:R020H21H22H30H31H32H20H21H22H+23HR0R1多字节加法思考:程序执行后,R0指向哪个单元?20H21H22H30H31H32H20H21H22H+23HR0R1R04、现场保护何谓“现场”?如何保护?

ORG0100H MOV R0,#30H MOV R2,#0AH CLR A LOOP: MOV @R0,A INC R0 ACALLDELAY DJNZ R2,LOOP……

DELAY: MOVR2,#20LOOP1: NOP DJNZR2,LOOP1 RET

保护现场的方法:1)选用其它寄存器2)选用其它组寄存器

;选用2组工作寄存器

SETBRS1;RS1=1 CLRRS0;RS0=03)利用堆栈保护重要寄存器内容,如A,PSW

PUSHACC PUSHPSW …… POPPSW POPACC5、堆栈溢出和堆栈冲突堆栈溢出、冲突:栈顶位置超出了合理范围。会使SP指针向上移动的操作和事件: PUSH指令运行后SP指针加1 LCALL、ACALL指令运行后SP指针加2 MOVSP,#data;SP移动情况由#data决定 中断事件

习题课:汇编语言程序设计利用RET指令实现散转单字节BC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论