操作码代码
位锁存器的结果应作为加法器的进位输入。
nand01
下载
世界ศ范围内的即时通信我们已经很熟悉,但它是当今新า技
这些只是一个多职业生涯者的足迹。摩尔斯最着名的贡献
要回到先前的程序,并使用a、b、c中ณ原有的值。
当然,你能做的工作只是简单地把寄存器a、b、c中的值保存到存储器中ณ的不同位置,
以后再把这些位置的值装载到寄存器中,但这样做需要保存值被保存的位置。一个显然的方แ
法是把寄存器压入堆栈:
pushaທ
pushb
pushc
一会儿再解释这些指令的作用。现在,我们只需要知道它们以某种方式把寄存器的内容
保存在一个后进先出的存储器中。一旦这些语句执行了,你的程序就可以毫无顾虑地利用这
些寄存器来做其他工作。为ฦ了得到原来的值,只需简单地按与压入堆栈相反的顺序把它们从
堆栈中弹出即可,如下所示ิ:
1้98编码的奥秘
下载
popc
popb
popa
记住是后进先出。如果用错了pop语句的顺序,就会引起错误。
堆栈机制的一个好处在于一个ฐ程序的不同部分都可以使用堆栈而不会出现问题。例如,
在把a、b、c压入堆栈中后,程序的其他部分还可能需要把寄存器c、d、e的内容压入堆栈:
pushcນ
pushd
pushe
接着,这一部分程序所要做的就是在第一部分弹出c、b和a之ใ前,用下述方法恢复寄存
器的值:
pope
popd
popc
堆栈是怎样实现的呢?先,堆栈只是不被别的东西使用的正常的ram的一部分。808๖0
微处理器包含一个特殊的16๔位寄存器来对这一部分存储器进行寻址,这个ฐ16位寄存器叫作堆
栈指针。
这里举的压入和弹出寄存器的例子对于80่80来说不太准确。8080的push指令实际上是存
储1้6๔位的值到堆栈,pop指令用来恢复它们。因此8080不用像pushc和popc这样的指令,
它有下述8条指令:
操作码指令操作码指令
cນ9
d5pushded1popde
e5pushhle1pophl
f5pushp9f1popp9๗
pushbcນ指令把寄存器b和cນ的内容保存到เ堆栈中,popbcນ指令恢复它们。最后一行的
缩写ps9指的是程序状态字,前面讲过,它是包含有标志位的8位寄存器。最后一行的两条指
令实际上是把累加器和ps9都压入和弹出堆栈。如果你想保存所有寄存器和标志位的内容,
可以使用:
pushp9
pushbຘc
pushde
pushhl
当以后想恢复这些寄存器的内容时,按相反的顺序使用pop指令:
pophl
popde
popbcນ
popp9
堆栈是怎样工作的呢?假设堆栈指针ฤ为8๖000h,pushbc指令将引起下面这些情况生:
堆栈指针ฤ减1至7fffh
寄存器bຘ的内容保存在堆栈指针ฤ所指的地址处,即7fffh处
第19章两种典型的微处理器199
下载
堆栈指针减1至7ffeh
寄存器cນ的内容保存在堆栈指针所指的地址处,即7ffeh处
当堆栈指针仍然为7ffeh时,popbc指令执行,用来反向执行每一步:
从堆栈指针所指的地址即7ffeh处装载数据到寄存器c中
堆栈指针ฤ增1至7fffh
从堆栈指针所指的地址即7๕fffh处装ณ载数据到เ寄存器bຘ中
堆栈指针增1至8๖000h
对每个push指令,堆栈都会增加2个字节,这可能导致程序出现小毛病—堆栈可能会
变得很大以致会覆盖掉程序所需的一些代码和数据。这就是堆栈上溢问题。同样,过多的
pop指令会过早用光堆栈内容,这就是堆栈下溢问题。
如果8080่同一个64kb的存储器连接,你可能想把初始堆栈指针置为00่00h。第一条push
指令使地址减1变为ffffh,这时堆栈占用了存储器的最高地址。如果你的程序放在从0000h
处开始的存储器区域,则它和堆栈离的就太远了。
对堆栈寄存器进行赋值的指令是lxi,即loadextendedimmediate装载扩展的立即数。
下面这些操作码后的指令也是把两个字节装载到16位寄存器:
操作码指令
01lxibcນ,xxxx