官术网_书友最值得收藏!

3.5 移位操作

常見的移位操作如下。

sll:邏輯左移(shift left logical),最高位丟棄,最低位補0,如圖3.10(a)所示。

srl:邏輯右移(shift right logical),最高位補0,最低位丟棄,如圖3.10(b)所示。

sra:算術右移(shift right arithmetic),最低位丟棄,最高位按照符號進行擴展,如圖3.10(c)所示。

圖3.10 移位操作

常見的移位指令如表3.4所示。

表3.4 常見的移位指令

關于移位操作指令,有以下3點需要注意。

RISC-V指令集里沒有單獨設置算術左移指令,因為sll指令會把最高位丟棄。

邏輯右移和算術右移的區別在于是否考慮符號。

  例如,源操作數為二進制數10 1010 1010。

  邏輯右移一位,變成[0]1 0101 0101( 最高位永遠補0)。

  算術右移一位,變成[1]1 0101 0101(需要按照源操作數進行符號擴展)。

在RV64指令集中,SLL、SRL以及SRA指令只使用rs2寄存器中低6位的數據做移位操作。

【例3-9】 如下代碼使用了SRAI和SRLI指令。

li t0, 0x8000008a00000000
srai a1, t0, 1
srli t1, t0, 1

在上述代碼中,SRAI是立即數算術右移指令,把0x8000 008A 0000 0000右移一位并且根據源二進制數的最高位需要進行符號擴展,結果為0xC000 0045 0000 0000。SRLI是立即數邏輯右移指令,把0x8000 008A 0000 0000右移一位并且在最高位補0,結果為0x4000 0045 0000 0000。

【例3-10】 如下代碼使用了SRAIW和SRLIW指令。

1   li t0, 0x128000008a
2   sraiw a2, t0, 1
3   srliw a3, t0, 1
4
5   li t0, 0x124000008a
6   sraiw a4, t0, 1

在第2行中,使用立即數算術右移指令,截取t0寄存器低32位的值(0x8000 008A)作為新的源操作數,然后右移一位并根據新的源二進制數的最高位需要進行符號擴展,結果為0xFFFF FFFF C000 0045。

在第3行中,使用立即數邏輯右移指令,截取t0寄存器低32位的值(0x8000 008A)作為新的源操作數,然后右移一位并進行符號擴展,結果為0x4000 0045。

在第6行中,使用立即數算術右移指令,截取t0寄存器低32位的值(0x4000 008A)作為新的源操作數,然后右移一位并根據新的源二進制數的最高位需要進行符號擴展,結果為0x2000 0045。

【例3-11】 下面的示例代碼使用了SLLIW指令。

1   li t0, 0x128000008a
2   slliw a3, t0, 1
3
4   li t0, 0x122000008a
5   slliw a4, t0, 1
6
7   li t0, 0x124000008a
8   slliw a5, t0, 1

在第2行中,使用立即數邏輯左移指令,截取t0寄存器低32位的值(0x8000 008A),然后左移一位,結果為0x114。

在第5行中,截取t0寄存器低32位的值(0x2000 008A),左移一位,結果為0x4000 0114。

在第8行中,截取t0寄存器的低32位的值(0x4000 008A),左移一位后為0x800 00114,由于最高位為1,需要進行符號擴展,結果為0xFFFF FFFF 8000 0114。

主站蜘蛛池模板: 舞阳县| 巴林左旗| 多伦县| 安化县| 河南省| 炉霍县| 荃湾区| 常熟市| 龙里县| 开平市| 达州市| 马关县| 梁平县| 道真| 会昌县| 福海县| 安徽省| 会理县| 临颍县| 武义县| 新巴尔虎左旗| 巴东县| 社旗县| 家居| 白河县| 象州县| 邛崃市| 囊谦县| 甘肃省| 桐乡市| 水富县| 铜鼓县| 五寨县| 康定县| 克什克腾旗| 延川县| 桑植县| 元朗区| 云霄县| 桐梓县| 苗栗县|