我不确定我是否按照 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 个问题:

  1. 我做的对吗?
  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 就是 ~x1x1 & ~x2 就是 0s.上面的表达式可以进一步简化为 (~x1 + 1) & x1.

综上所述,x2赋值为x1与其的补码[=49]按位的结果=].最后三个指令可以替换为:

neg x2, x1
and x2, x2, x1

你可能不知道 x1,但你知道 x2 最后的结果是 (~x1 + 1) & x1.