【问题标题】:I'm not sure I have the correct results following a RISC-V code我不确定遵循 RISC-V 代码是否有正确的结果
【发布时间】:2023-03-21 17:35:01
【问题描述】:

我有这个 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

我有两个问题:

  1. 我做的对吗?
  2. 如果我不知道 X1,我可以从最后一行得到什么?

【问题讨论】:

  • F 是 1111(111 是 7)。尝试重做。

标签: riscv


【解决方案1】:

前五个指令最终将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——全是1——所以,~x1 & x2 的结果就是 ~x1 和 x1 & ~x2 都是 0s。上面的表达式可以进一步简化为 (~x1 + 1) & x1

总而言之,x2 被分配了x1 及其二进制补码之间的按位的结果。最后三个指令可以替换为:

neg x2, x1
and x2, x2, x1

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多