⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 单片机指令(三).htm

📁 单片机快速入门
💻 HTM
📖 第 1 页 / 共 2 页
字号:
</FONT><FONT size=3>MOV A</FONT><FONT lang=ZH-CN face=宋体 size=3>,</FONT><FONT 
size=3>R0 
<P></P></FONT><FONT lang=ZH-CN face=宋体 size=3>
<P align=justify>
<HR align=right width="4%" SIZE=1>
</FONT><FONT size=3>MOVC A</FONT><FONT lang=ZH-CN face=宋体 size=3>,</FONT><FONT 
size=3>@A+DPTR 
<P></P></FONT><FONT lang=ZH-CN face=宋体 size=3>
<P align=justify>
<HR align=right width="4%" SIZE=1>
</FONT><FONT size=3>. 
<P></P></FONT><FONT lang=ZH-CN face=宋体 size=3>
<P align=justify></P></FONT><FONT size=3>
<P align=justify>ORG 0100H.</P>
<P align=justify>DB 0,1,4,9,16,25</P></FONT><FONT lang=ZH-CN face=宋体 size=3>
<P align=justify></P></FONT>
<P align=justify><FONT lang=ZH-CN face=宋体 size=3>如果</FONT><FONT 
size=3>R0</FONT><FONT lang=ZH-CN face=宋体 size=3>中的值为</FONT><FONT 
size=3>2</FONT><FONT lang=ZH-CN face=宋体 size=3>,则最终地址为</FONT><FONT 
size=3>100H+2</FONT><FONT lang=ZH-CN face=宋体 size=3>为</FONT><FONT 
size=3>102H</FONT><FONT lang=ZH-CN face=宋体 size=3>,到</FONT><FONT 
size=3>102H</FONT><FONT lang=ZH-CN face=宋体 size=3>单元中找到的是</FONT><FONT 
size=3>4</FONT><FONT lang=ZH-CN face=宋体 size=3>。这个可以看懂了吧?</FONT></P><FONT 
lang=ZH-CN face=宋体 size=3>
<P align=justify>那为什么不这样写程序,要用标号呢?不是增加疑惑吗?</P></FONT>
<P align=justify><FONT lang=ZH-CN face=宋体 
size=3>如果这样写程序的话,在写程序时,我们就必须确定这张表格在</FONT><FONT size=3>ROM</FONT><FONT 
lang=ZH-CN face=宋体 
size=3>中的具体的位置,如果写完程序后,又想在这段程序前插入一段程序,那么这张表格的位置就又要变了,要改</FONT><FONT size=3>ORG 
100H</FONT><FONT lang=ZH-CN face=宋体 
size=3>这句话了,我们是经常需要修改程序的,那多麻烦,所以就用标号来替代,只要一编译程序,位置就自动发生变化,我们把这个麻烦事交给计算机&amp;#0;&amp;#0;指</FONT><FONT 
size=3>PC</FONT><FONT lang=ZH-CN face=宋体 size=3>机去做了。</FONT></P></DIR><FONT 
lang=ZH-CN face=宋体 size=3>
<P align=justify>堆栈操作</P></FONT><FONT size=3>
<P align=justify>PUSH direct</P>
<P align=justify>POP direct</P></FONT>
<P align=justify><FONT lang=ZH-CN face=宋体 size=3>第一条指令称之为推入,就是将</FONT><FONT 
size=3>direct</FONT><FONT lang=ZH-CN face=宋体 
size=3>中的内容送入堆栈中,第二条指令称之为弹出,就是将堆栈中的内容送回到</FONT><FONT size=3>direct</FONT><FONT 
lang=ZH-CN face=宋体 size=3>中。推入指令的执行过程是,首先将</FONT><FONT size=3>SP</FONT><FONT 
lang=ZH-CN face=宋体 size=3>中的值加</FONT><FONT size=3>1</FONT><FONT lang=ZH-CN 
face=宋体 size=3>,然后把</FONT><FONT size=3>SP</FONT><FONT lang=ZH-CN face=宋体 
size=3>中的值当作地址,将</FONT><FONT size=3>direct</FONT><FONT lang=ZH-CN face=宋体 
size=3>中的值送进以</FONT><FONT size=3>SP</FONT><FONT lang=ZH-CN face=宋体 
size=3>中的值为地址的</FONT><FONT size=3>RAM</FONT><FONT lang=ZH-CN face=宋体 
size=3>单元中。例:</FONT></P>
<P align=justify><FONT size=3>MOV SP</FONT><FONT lang=ZH-CN face=宋体 
size=3>,</FONT><FONT size=3>#5FH</FONT></P>
<P align=justify><FONT size=3>MOV A</FONT><FONT lang=ZH-CN face=宋体 
size=3>,</FONT><FONT size=3>#100</FONT></P>
<P align=justify><FONT size=3>MOV B</FONT><FONT lang=ZH-CN face=宋体 
size=3>,</FONT><FONT size=3>#20</FONT></P><FONT size=3>
<P align=justify>PUSH ACC</P>
<P align=justify>PUSH B</P></FONT>
<P align=justify><FONT lang=ZH-CN face=宋体 size=3>则执行第一条</FONT><FONT size=3>PUSH 
ACC</FONT><FONT lang=ZH-CN face=宋体 size=3>指令是这样的:将</FONT><FONT 
size=3>SP</FONT><FONT lang=ZH-CN face=宋体 size=3>中的值加</FONT><FONT 
size=3>1</FONT><FONT lang=ZH-CN face=宋体 size=3>,即变为</FONT><FONT 
size=3>60H</FONT><FONT lang=ZH-CN face=宋体 size=3>,然后将</FONT><FONT 
size=3>A</FONT><FONT lang=ZH-CN face=宋体 size=3>中的值送到</FONT><FONT 
size=3>60H</FONT><FONT lang=ZH-CN face=宋体 size=3>单元中,因此执行完本条指令后,</FONT><FONT 
size=3> </FONT><FONT lang=ZH-CN face=宋体 size=3>内存</FONT><FONT 
size=3>60H</FONT><FONT lang=ZH-CN face=宋体 size=3>单元的值就是</FONT><FONT 
size=3>100</FONT><FONT lang=ZH-CN face=宋体 size=3>,同样,执行</FONT><FONT size=3>PUSH 
B</FONT><FONT lang=ZH-CN face=宋体 size=3>时,是将</FONT><FONT size=3>SP+1</FONT><FONT 
lang=ZH-CN face=宋体 size=3>,即变为</FONT><FONT size=3>61H</FONT><FONT lang=ZH-CN 
face=宋体 size=3>,然后将</FONT><FONT size=3>B</FONT><FONT lang=ZH-CN face=宋体 
size=3>中的值送入到</FONT><FONT size=3>61H</FONT><FONT lang=ZH-CN face=宋体 
size=3>单元中,即执行完本条指令后,</FONT><FONT size=3>61H</FONT><FONT lang=ZH-CN face=宋体 
size=3>单元中的值变为</FONT><FONT size=3>20</FONT><FONT lang=ZH-CN face=宋体 
size=3>。</FONT></P>
<P align=justify><FONT size=3>POP</FONT><FONT lang=ZH-CN face=宋体 
size=3>指令的执行是这样的,首先将</FONT><FONT size=3>SP</FONT><FONT lang=ZH-CN face=宋体 
size=3>中的值作为地址,并将此地址中的数送到</FONT><FONT size=3>POP</FONT><FONT lang=ZH-CN face=宋体 
size=3>指令后面的那个</FONT><FONT size=3>direct</FONT><FONT lang=ZH-CN face=宋体 
size=3>中,然后</FONT><FONT size=3>SP</FONT><FONT lang=ZH-CN face=宋体 
size=3>减</FONT><FONT size=3>1</FONT><FONT lang=ZH-CN face=宋体 
size=3>。</FONT></P><FONT lang=ZH-CN face=宋体 size=3>
<P align=justify>接上例:</P></FONT><FONT size=3>
<P align=justify>POP B</P>
<P align=justify>POP ACC</P></FONT>
<P align=justify><FONT lang=ZH-CN face=宋体 size=3>则执行过程是:将</FONT><FONT 
size=3>SP</FONT><FONT lang=ZH-CN face=宋体 size=3>中的值(现在是</FONT><FONT 
size=3>61H</FONT><FONT lang=ZH-CN face=宋体 size=3>)作为地址,取</FONT><FONT 
size=3>61H</FONT><FONT lang=ZH-CN face=宋体 size=3>单元中的数值(现在是</FONT><FONT 
size=3>20</FONT><FONT lang=ZH-CN face=宋体 size=3>),送到</FONT><FONT 
size=3>B</FONT><FONT lang=ZH-CN face=宋体 size=3>中,所以执行完本条指令后</FONT><FONT 
size=3>B</FONT><FONT lang=ZH-CN face=宋体 size=3>中的值是</FONT><FONT 
size=3>20</FONT><FONT lang=ZH-CN face=宋体 size=3>,然后将</FONT><FONT 
size=3>SP</FONT><FONT lang=ZH-CN face=宋体 size=3>减</FONT><FONT 
size=3>1</FONT><FONT lang=ZH-CN face=宋体 size=3>,因此本条指令执行完后,</FONT><FONT 
size=3>SP</FONT><FONT lang=ZH-CN face=宋体 size=3>的值变为</FONT><FONT 
size=3>60H</FONT><FONT lang=ZH-CN face=宋体 size=3>,然后执行</FONT><FONT size=3>POP 
ACC</FONT><FONT lang=ZH-CN face=宋体 size=3>,将</FONT><FONT size=3>SP</FONT><FONT 
lang=ZH-CN face=宋体 size=3>中的值(</FONT><FONT size=3>60H</FONT><FONT lang=ZH-CN 
face=宋体 size=3>)作为地址,从该地址中取数(现在是</FONT><FONT size=3>100</FONT><FONT lang=ZH-CN 
face=宋体 size=3>),并送到</FONT><FONT size=3>ACC</FONT><FONT lang=ZH-CN face=宋体 
size=3>中,所以执行完本条指令后,</FONT><FONT size=3>ACC</FONT><FONT lang=ZH-CN face=宋体 
size=3>中的值是</FONT><FONT size=3>100</FONT><FONT lang=ZH-CN face=宋体 
size=3>。</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体 size=3>这有什么意义呢?</FONT><FONT 
size=3>ACC</FONT><FONT lang=ZH-CN face=宋体 size=3>中的值本来就是</FONT><FONT 
size=3>100</FONT><FONT lang=ZH-CN face=宋体 size=3>,</FONT><FONT 
size=3>B</FONT><FONT lang=ZH-CN face=宋体 size=3>中的值本来就是</FONT><FONT 
size=3>20</FONT><FONT lang=ZH-CN face=宋体 
size=3>,是的,在本例中,的确没有意义,但在实际工作中,则在</FONT><FONT size=3>PUSH B</FONT><FONT 
lang=ZH-CN face=宋体 size=3>后往往要执行其他指令,而且这些指令会把</FONT><FONT size=3>A</FONT><FONT 
lang=ZH-CN face=宋体 size=3>中的值,</FONT><FONT size=3>B</FONT><FONT lang=ZH-CN 
face=宋体 size=3>中的值改掉,所以在程序的结束,如果我们要把</FONT><FONT size=3>A</FONT><FONT lang=ZH-CN 
face=宋体 size=3>和</FONT><FONT size=3>B</FONT><FONT lang=ZH-CN face=宋体 
size=3>中的值恢复原值,那么这些指令就有意义了。</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体 size=3>还有一个问题,如果我不用堆栈,比如说在</FONT><FONT 
size=3>PUSH ACC</FONT><FONT lang=ZH-CN face=宋体 size=3>指令处用</FONT><FONT 
size=3>MOV 60H</FONT><FONT lang=ZH-CN face=宋体 size=3>,</FONT><FONT 
size=3>A</FONT><FONT lang=ZH-CN face=宋体 size=3>,在</FONT><FONT size=3>PUSH 
B</FONT><FONT lang=ZH-CN face=宋体 size=3>处用指令</FONT><FONT size=3>MOV 
61H</FONT><FONT lang=ZH-CN face=宋体 size=3>,</FONT><FONT size=3>B</FONT><FONT 
lang=ZH-CN face=宋体 size=3>,然后用</FONT><FONT size=3>MOV A</FONT><FONT lang=ZH-CN 
face=宋体 size=3>,</FONT><FONT size=3>60H</FONT><FONT lang=ZH-CN face=宋体 
size=3>,</FONT><FONT size=3>MOV B</FONT><FONT lang=ZH-CN face=宋体 
size=3>,</FONT><FONT size=3>61H</FONT><FONT lang=ZH-CN face=宋体 
size=3>来替代两条</FONT><FONT size=3>POP</FONT><FONT lang=ZH-CN face=宋体 
size=3>指令,不是也一样吗?是的,从结果上看是一样的,但是从过程看是不一样的,</FONT><FONT size=3>PUSH</FONT><FONT 
lang=ZH-CN face=宋体 size=3>和</FONT><FONT size=3>POP</FONT><FONT lang=ZH-CN 
face=宋体 size=3>指令都是单字节,单周期指令,而</FONT><FONT size=3>MOV</FONT><FONT lang=ZH-CN 
face=宋体 
size=3>指令则是双字节,双周期指令。更何况,堆栈的作用不止于此,所以一般的计算机上都设有堆栈,而我们在编写子程序,需要保存数据时,通常也不采用后面的方法,而是用堆栈的方法来实现。</FONT></P><FONT 
lang=ZH-CN face=宋体 size=3>
<P align=justify>例:写出以下程序的运行结果</P></FONT>
<P align=justify><FONT size=3>MOV 30H</FONT><FONT lang=ZH-CN face=宋体 
size=3>,</FONT><FONT size=3>#12</FONT></P>
<P align=justify><FONT size=3>MOV 31H</FONT><FONT lang=ZH-CN face=宋体 
size=3>,</FONT><FONT size=3>#23</FONT></P><FONT size=3>
<P align=justify>PUSH 30H</P>
<P align=justify>PUSH 31H</P>
<P align=justify>POP 30H</P>
<P align=justify>POP 31H</P></FONT>
<P align=justify><FONT lang=ZH-CN face=宋体 size=3>结果是</FONT><FONT 
size=3>30H</FONT><FONT lang=ZH-CN face=宋体 size=3>中的值变为</FONT><FONT 
size=3>23</FONT><FONT lang=ZH-CN face=宋体 size=3>,而</FONT><FONT 
size=3>31H</FONT><FONT lang=ZH-CN face=宋体 size=3>中的值则变为</FONT><FONT 
size=3>12</FONT><FONT lang=ZH-CN face=宋体 
size=3>。也就两者进行了数据交换。从这个例子可以看出:使用堆栈时,入栈的书写顺序和出栈的书写顺序必须相反,才能保证数据被送回原位,否则就要出错了。</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体 size=3>作业:在</FONT><FONT 
size=3>MCS51</FONT><FONT lang=ZH-CN face=宋体 
size=3>下执行上面的例程,注意观察内存窗口和堆栈的变化。</FONT></P><FONT lang=ZH-CN face=宋体 size=3>
<P align=center><A href="http://www.onestudy.net/"><FONT 
face=黑体>返回“一学网</FONT><FONT face="Times New Roman" color=#000000> </FONT><FONT 
face="Times New Roman"><FONT color=#000000>www.</FONT><FONT 
color=#ff0000>one</FONT><FONT color=#008000>study</FONT>.net</FONT><FONT 
face=黑体> ”首页</FONT></A></P>
<P align=justify></P></FONT></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -