找回密码
 注册
关于网站域名变更的通知
查看: 378|回复: 1
打印 上一主题 下一主题

ARM的thumb指令中的POP和PUSH指令

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-12-8 09:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
我们先来了解一下什么是PUSH和POP指令。低寄存器和可选的LR进栈以及低寄存器和可选的PC出栈。7 F- J) j( w% R: y

        指令格式:如果是16位的thumb指令,那么PUSH指令格式就是{7‘b1011010,LR,reglist}

        reglist就是八位的,哪一位上为1就说明把那一个号数的通用寄存器PUSH到栈里面。如8’11000000就是把第一和第二个通用寄存器放入栈中。同理,POP就是把相应的寄存器的值出栈赋给通用寄存器还有PC。

       PUSH {reglist}
# B& a1 D3 H: s  H) S       POP {reglist}
* ~( M6 ?" V" z6 _5 G% X( @       PUSH {reglist,LR}3 ^7 f* c1 L/ ]2 c1 Z! A# ?: e1 M6 \
       POP {reglist,PC}4 r! i1 P3 N) ]( b! Y6 s4 }
       其中:reglist:低寄存器的全部或其子集。括号是指令格式的一部分,它们不代表指令列表可选。列表中至少有1个寄存器。Thumb堆栈是满递减堆栈,堆栈向下增长,且SP指向堆栈的最后入口。寄存器以数字顺序存储在堆栈中。最低数字的寄存器存储在最低地址处。POP {reglist,PC}这条指令引起处理器转移到从堆栈弹出给PC的地址,这通常是从子程序返回,其中LR在子程序开头压进堆栈。这些指令不影响条件码标志。4 c1 ?5 Y. U; _) a8 ~
指令示例:
9 n* Z8 N. s! P! T2 m2 K       PUSH {R0,R3,R5}4 J3 ?  @2 T. @
       PUSH {R1,R4-R7}
" K5 n* f/ G, }6 {% }       PUSH {R0,LR}6 ^# ?# Q6 v  `6 r- b
       POP {R2,R5}$ t4 l9 a+ e4 [9 Q6 y& Q

       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指令。

  k: x$ j& w! f  @  \8 ~& ^

该用户从未签到

2#
发表于 2020-12-8 10:47 | 只看该作者
ARM的thumb指令中的POP和PUSH指令
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-9-21 04:16 , Processed in 0.109375 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表