购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.7 堆栈访问指令

堆栈访问指令包括PUSH和POP,下面对这些指令进行详细说明。

1.PUSH<registers>

该指令将一个/多个寄存器(包括R0~R7及LR)保存到堆栈(入栈)中,并且更新堆栈指针寄存器。该汇编助记符指令的机器码格式如图4.30所示。

图4.30 PUSH<registers>指令的机器码格式

注: (1)registers(register='0':M:'000000':register_list)是一个或多个寄存器的列表,用逗号分隔,并且用{}符号包围。它标识了将要保存的寄存器集,按顺序保存。编号最小的寄存器到最低的存储器地址,编号最大的寄存器到最高的存储器地址。

(2)register_list的具体含义同图4.28。

指令PUSH{R0,R1,R2},其机器码为(B407) 16 ,该指令实现以下功能。

(1)(SP)=(SP)-4×进入堆栈的寄存器的个数。

(2)将寄存器R0的内容保存到(SP)所指向的存储器的地址。

(3)将寄存器R1的内容保存到(SP)+4所指向的存储器的地址。

(4)将寄存器R2的内容保存到(SP)+8所指向的存储器的地址。

(5)将SP的内容更新为步骤(1)计算得到的SP内容。

2.POP<registers>

该指令将存储器中的内容恢复到多个寄存器(包括R0~R7及PC)中,并且更新堆栈指针寄存器,该汇编助记符指令的机器码格式如图4.31所示。

图4.31 POP<registers>指令的机器码格式

注: (1)registers(registers=P:'0000000':register_list)是一个或多个寄存器的列表,用逗号分隔,并且用{}符号包围。它标识了将要加载的寄存器集。从最低的存储器地址加载到编号最小的寄存器,从最高的存储器地址加载到编号最大的寄存器。如果在<registers>中指定了PC,则该指令将导致跳转到PC中加载的地址(数据)

(2)register_list的具体含义同图4.28。

指令POP{R0,R1,R2},其机器码为(BC07) 16 ,该指令实现以下功能。

(1)将(SP)所指向的存储器的内容加载到寄存器R0中。

(2)将(SP)+4所指向的存储器的内容加载到寄存器R1中。

(3)将(SP)+8所指向的存储器的内容加载到寄存器R2中。

(4)将(SP)+4×出栈寄存器的个数的值更新寄存器SP。

思考与练习4.7:说明以下指令实现的功能。

(1)PUSH{R0,R4-R7}_________________________________

(2)PUSH{R2,LR}_________________________________

(3)POP{R0,R6,PC}_________________________________ 3mfKWng3UxnOVuu5XwuyJq7AGO310y8cY3XAoEe1Kum7dT3ap3EyG3EbUTqtMg0t

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开