我不确定我是否按照 RISC-V 代码得到了正确的结果
I'm not sure I have the correct results following a RISC-V code
我有这个 RISC-V 代码,问题是最后 x2 中的值可能是多少(我们不知道 x1 中有什么)。
ori X2, X0, 0xFFF
slli X2, X2, 12
ori X2, X2, 0xFFF
slli X2, X2, 8
ori X2, X2, 0xFF
xor X2, X2, X1
addi X2, X2, 1
and X2, X2, X1
我得到的结果是(每一步后 x2):
x2= 111 111 111
x2= 111 111 111 000 000 000 000
x2= 111 111 111 000 111 111 111
x2= 100 011 111 111 100 000 000
x2(*)=100 011 111 111 100 111 111
x2(final)= (X2`(*)X1+X2X1`+1)=X2`(*)X1
我有 2 个问题:
- 我做的对吗?
- 如果我不知道 X1,从最后一行我能得到什么?
前五个指令只是将 x2
设置为 0xffffffff
,因此您可以将它们替换为单个指令 addi x2, zero, -1
或仅伪指令 li x2, -1
。
最后三个指令是:
xor X2, X2, X1
addi X2, X2, 1
and X2, X2, X1
分配给 x2
的值是 ((x1 ^ x2) + 1) & x1。因为 a ^ b 等价于 ~a & b | a & ~b, 那么这个表达式可以表示为 ((~x1 & x2 | x1 & ~x2) + 1) & x1.
如上所述,x2
在这一点上是 0xffffffff
– 所有 1s – 因此, 的结果~x1 & x2 就是 ~x1 而 x1 & ~x2 就是 0s.上面的表达式可以进一步简化为 (~x1 + 1) & x1.
综上所述,x2
赋值为x1
与其的补码[=49]按位和的结果=].最后三个指令可以替换为:
neg x2, x1
and x2, x2, x1
你可能不知道 x1
,但你知道 x2
最后的结果是 (~x1 + 1) & x1.
我有这个 RISC-V 代码,问题是最后 x2 中的值可能是多少(我们不知道 x1 中有什么)。
ori X2, X0, 0xFFF
slli X2, X2, 12
ori X2, X2, 0xFFF
slli X2, X2, 8
ori X2, X2, 0xFF
xor X2, X2, X1
addi X2, X2, 1
and X2, X2, X1
我得到的结果是(每一步后 x2):
x2= 111 111 111
x2= 111 111 111 000 000 000 000
x2= 111 111 111 000 111 111 111
x2= 100 011 111 111 100 000 000
x2(*)=100 011 111 111 100 111 111
x2(final)= (X2`(*)X1+X2X1`+1)=X2`(*)X1
我有 2 个问题:
- 我做的对吗?
- 如果我不知道 X1,从最后一行我能得到什么?
前五个指令只是将 x2
设置为 0xffffffff
,因此您可以将它们替换为单个指令 addi x2, zero, -1
或仅伪指令 li x2, -1
。
最后三个指令是:
xor X2, X2, X1
addi X2, X2, 1
and X2, X2, X1
分配给 x2
的值是 ((x1 ^ x2) + 1) & x1。因为 a ^ b 等价于 ~a & b | a & ~b, 那么这个表达式可以表示为 ((~x1 & x2 | x1 & ~x2) + 1) & x1.
如上所述,x2
在这一点上是 0xffffffff
– 所有 1s – 因此, 的结果~x1 & x2 就是 ~x1 而 x1 & ~x2 就是 0s.上面的表达式可以进一步简化为 (~x1 + 1) & x1.
综上所述,x2
赋值为x1
与其的补码[=49]按位和的结果=].最后三个指令可以替换为:
neg x2, x1
and x2, x2, x1
你可能不知道 x1
,但你知道 x2
最后的结果是 (~x1 + 1) & x1.