天天看點

數字電路設計之ARM的thumb指令中的POP和PUSH指令

我們先來了解一下什麼是PUSH和POP指令。低寄存器和可選的LR進棧以及低寄存器和可選的PC出棧。

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

        reglist就是八位的,哪一位上為1就說明把那一個号數的通用寄存器PUSH到棧裡面。如8’11000000就是把第一和第二個通用寄存器放入棧中。同理,POP就是把相應的寄存器的值出棧賦給通用寄存器還有PC。

       PUSH {reglist}

       POP {reglist}

       PUSH {reglist,LR}

       POP {reglist,PC}

       其中:reglist:低寄存器的全部或其子集。括号是指令格式的一部分,它們不代表指令清單可選。清單中至少有1個寄存器。Thumb堆棧是滿遞減堆棧,堆棧向下增長,且SP指向堆棧的最後入口。寄存器以數字順序存儲在堆棧中。最低數字的寄存器存儲在最低位址處。POP {reglist,PC}這條指令引起處理器轉移到從堆棧彈出給PC的位址,這通常是從子程式傳回,其中LR在子程式開頭壓進堆棧。這些指令不影響條件碼标志。

指令示例:

       PUSH {R0,R3,R5}

       PUSH {R1,R4-R7}

       PUSH {R0,LR}

       POP {R2,R5}

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