新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 第1天-ARM匯編指令LSL/LSR/ASL/ASR

        第1天-ARM匯編指令LSL/LSR/ASL/ASR

        作者: 時間:2016-11-26 來源:網絡 收藏
        移位
        LSL
        ASL
        LSR
        ASR
        ROR
        RRX
        ARM 處理器組建了可以與數據處理指令(ADC、ADD、AND、BIC、CMN、CMP、EOR、MOV、MVN、ORR、RSB、SBC、SUB、TEQ、TST)一起使用的桶式移位器(barrel shifter)。你還可以使用桶式移位器影響在 LDR/STR 操作中的變址值。
        譯注:移位操作在 ARM 指令集中不作為單獨的指令使用,它是指令格式中是一個字段,在匯編語言中表示為指令中的選項。如果數據處理指令的第二個操作數或者單一數據傳送指令中的變址是寄存器,則可以對它進行各種移位操作。如果數據處理指令的第二個操作數是立即值,在指令中用 8 位立即值和 4 位循環移位來表示它,所以對大于 255 的立即值,匯編器嘗試通過在指令中設置循環移位數量來表示它,如果不能表示則生成一個錯誤。在邏輯類指令中,邏輯運算指令由指令中 S 位的設置或清除來確定是否影響進位標志,而比較指令的 S 位總是設置的。在單一數據傳送指令中指定移位的數量只能用立即值而不能用寄存器。
        下面是給不同的移位類型的六個助記符:
        LSL 邏輯左移 ASL 算術左移 LSR 邏輯右移 ASR 算術右移 ROR 循環右移 RRX 帶擴展的循環右移
        ASL 和 LSL 是等同的,可以自由互換。
        你可以用一個立即值(從 0 到 31)指定移位數量,或用包含在 0 和 31 之間的一個值的寄存器指定移位數量。
        邏輯或算術左移
        (Logical or Arithmetic Shift Left)
        Rx, LSL #n or Rx, ASL #n or Rx, LSL Rn or Rx, ASL Rn
        接受 Rx 的內容并按用‘n’或在寄存器 Rn 中指定的數量向高有效位方向移位。最低有效位用零來填充。除了概念上的第 33 位(就是被移出的最小的那位)之外丟棄移出最左端的高位,如果邏輯類指令中 S 位被設置了,則此位將成為從桶式移位器退出時進位標志的值。
        考慮下列:
        MOV R1, #12 MOV R0, R1, LSL#2
        在退出時,R0 是 48。 這些指令形成的總和是 R0 = #12, LSL#2 等同于 BASIC 的 R0 = 12 << 2
        邏輯右移
        (Logical Shift Right)
        Rx, LSR #n or Rx, LSR Rn
        它在概念上與左移相對。把所有位向更低有效位方向移動。如果邏輯類指令中 S 位被設置了,則把最后被移出最右端的那位放置到進位標志中。它同于 BASIC 的 register = value >>> shift。
        算術右移
        (Arithmetic Shift Right)
        Rx, ASR #n or Rx, ASR Rn
        類似于 LSR,但使用要被移位的寄存器(Rx)的第 31 位的值來填充高位,用來保護補碼表示中的符號。如果邏輯類指令中 S 位被設置了,則把最后被移出最右端的那位放置到進位標志中。它同于 BASIC 的 register = value >> shift。
        循環右移
        (Rotate Right)
        Rx, ROR #n or Rx, ROR Rn
        循環右移類似于邏輯右移,但是把從右側移出去的位放置到左側,如果邏輯類指令中 S 位被設置了,則同時放置到進位標志中,這就是位的‘循環’。一個移位量為 32 的操作將導致輸出與輸入完全一致,因為所有位都被移位了 32 個位置,又回到了開始時的位置!
        帶擴展的循環右移
        (Rotate Right with extend)
        Rx, RRX
        這是一個 ROR#0 操作,它向右移動一個位置 - 不同之處是,它使用處理器的進位標志來提供一個要被移位的 33 位的數量。


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 临高县| 吴川市| 巴马| 建瓯市| 鄂伦春自治旗| 岳池县| 济源市| 南通市| 清河县| 双辽市| 遂昌县| 永兴县| 济源市| 金阳县| 昭平县| 绥阳县| 三台县| 弋阳县| 杨浦区| 澎湖县| 成安县| 革吉县| 东平县| 丹东市| 安岳县| 伊川县| 中宁县| 上栗县| 东乌| 黎川县| 石屏县| 长岭县| 新化县| 沿河| 慈溪市| 台山市| 仁布县| 平塘县| 台中市| 凉城县| 龙口市|