这是一类最基本的指令,用来完成计算机主机内部数据的存取操作。从操作对象来区分,数据传送类指令的操作可以有以下几种情况:
(1)寄存器至寄存器(Register-Register,R-R)。
(2)存储器至寄存器(Storage-Register,S-R)。
(3)寄存器至存储器(Register-Storage,R-S)。
(4)存储器至存储器(Storage-Storage,S-S)。
数据传送指令一次可以传送一个数据或一批数据,有些计算机还设置了数据交换指令,可实现双向传送。
堆栈操作指令是一种特殊的数据传送指令。压栈指令(PUSH)把指定的操作数送入栈顶,而弹出指令(POP)把栈顶的数据取出,送到指令所指定的目的地。
堆栈是若干个存储单元(或寄存器)的有序集合。它顺序地存放一组元素,第一个被压入元素的堆栈单元称为栈底,最后一个被压入元素的单元称为栈顶。数据的存取只能在栈顶单元内进行,即数据的进栈与出栈都只能经过栈顶单元这个唯一的“出入口”。堆栈中的数据采用的是“后进先出”(LIFO)的存取工作方式。(www.xing528.com)
为了向堆栈存入数据,要将堆栈中各单元原有的数据(元素)依次向栈底方向移动一个单元,空出栈顶单元来存放新数据,这个操作称为堆栈压入(PUSH)。为了取得运算操作所必需的操作数,对堆栈要执行弹出(POP)操作。该操作从栈项单元取出数据,并将下面各单元所存的数据依次向栈顶方向移动一个单元,由紧挨栈顶的单元数据来补充栈顶单元。
真正实用的堆栈,对每压入(或弹出)一个元素时整个堆栈单元内容都下移(或上移)一个单元的做法作了改进。改进的措施是:在压入和弹出数据时,各堆栈单元的原内容都不移动,而作为数据“出入口”的栈顶单元地址加以变动,即栈底固定,栈顶位置动态变化。对栈顶的位置可使用一个寄存器来跟踪,这个保存栈顶单元地址的寄存器称为栈顶指示器(Stack Pointer,SP)或简称为堆栈指针。
数据进栈常采用从高地址向低地址的方向(称为自底向上生成堆栈)进行,即向堆栈压入数据时,SP的内容先自动递减而指向一个新的空栈顶单元,而后再把数据写入此栈顶单元;当数据弹出堆栈时,立即读出SP所指向的栈顶单元内容,而后再把SP内容自动递增而指向新的栈顶位置。即:
PUSH X ;(SP)-1→SP,(X)→(SP)
POP X ;((SP))→X,(SP)+1→SP
也有部分计算机采用自顶向下生成堆栈,即数据进栈是从低地址向高地址方向进行。堆栈结构除了在零地址指令格式中提供操作数外,另一个重要作用是实现程序调用。即在调用子程序时,能把返回地址、局部变量和中间结果等自动地压入堆栈。在子程序返回时,又能方便地把有关信息和返回地址弹出堆栈。对于子程序嵌套调用和递归调用,堆栈具有别的存取方式所无法比拟的优势。对于“中断”技术,堆栈更是不可缺少。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。