为何执行LSL r3, r4, r5后r3=AA000000?(r4=0x71AA0000,r5=0x8)
ARM LSL 指令移位位数的误区解析
你混淆了移位位数的定义:ARM的LSL指令中,第二个操作数(这里是r5的值)表示的是二进制移位的位数,而非十六进制位的数量。
具体拆解你的例子:
r4的值为0x71AA0000,转换成32位二进制是:01110001 10101010 00000000 00000000r5的值是0x8,即十进制的8,意味着要对r4执行左移8个二进制位的操作- 左移8位后,原寄存器的高8位(二进制
01110001,对应十六进制0x71)会被移出32位寄存器范围而丢弃,剩余部分左移后补0,最终结果就是0xAA000000,与实际执行结果一致。
你的误区在于把0x8当成了十六进制位的数量,误以为只需左移4个二进制位(1个十六进制位=4个二进制位),但ARM指令的移位操作始终以二进制位为单位计数,0x8就是8个二进制位,因此会丢掉8位的高位内容,而非4位。
内容的提问来源于stack exchange,提问作者Bigbootyfish
相关产品推荐
相关产品推荐

