EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
我们先来了解一下什么是PUSH和POP指令。低寄存器和可选的LR进栈以及低寄存器和可选的PC出栈。
4 f/ J, ?) Y6 L; |# @0 K0 N 指令格式:如果是16位的thumb指令,那么PUSH指令格式就是{7‘b1011010,LR,reglist} reglist就是八位的,哪一位上为1就说明把那一个号数的通用寄存器PUSH到栈里面。如8’11000000就是把第一和第二个通用寄存器放入栈中。同理,POP就是把相应的寄存器的值出栈赋给通用寄存器还有PC。 PUSH {reglist}
9 ~; {' W3 t0 [$ v4 R4 _ POP {reglist}: I* u: b5 b) ^ Y+ t. }/ P" K& b
PUSH {reglist,LR}
- ?4 p2 j( N- `: }; j& J POP {reglist,PC}
* H- g Y& b0 T9 T E 其中:reglist:低寄存器的全部或其子集。括号是指令格式的一部分,它们不代表指令列表可选。列表中至少有1个寄存器。Thumb堆栈是满递减堆栈,堆栈向下增长,且SP指向堆栈的最后入口。寄存器以数字顺序存储在堆栈中。最低数字的寄存器存储在最低地址处。POP {reglist,PC}这条指令引起处理器转移到从堆栈弹出给PC的地址,这通常是从子程序返回,其中LR在子程序开头压进堆栈。这些指令不影响条件码标志。# l! G6 D8 i. o
指令示例:; ?9 f$ w0 j5 T8 x2 G7 r
PUSH {R0,R3,R5}" R: q) l0 k1 q0 Y
PUSH {R1,R4-R7}
) I) W: E' _) l$ t PUSH {R0,LR}; E6 l1 `5 z1 a0 b
POP {R2,R5}
5 l) Q5 Q# ]* d" _# l POP {R0-R7,PC} 了解了之后我们就可以用verilog写一个POP和PUSH指令的实现。 首先定义好栈: reg [15:0]stack[255:0];//这个栈是256个大小为16位的寄存器组成。 reg [15:0]SP; //这就是堆栈指针,指向栈顶 具体实现的时候当每次要POP的时候计算为1的个数,然后SP相应减多少。PUSH的时候就加。这样就实现了POP和PUSH指令。
) G8 ]0 Y! K9 b3 ?& d/ u# Q |