2017-07-26 121 views
0

我有麻烦的“XXXXXXX”搞清楚了这一点的第一个两个部分一点点我有如何操作位汇编语言MIPS32

add $t0, $v0, $0  # $t0 gets copy of input x 
sub $t1, $0, $t0  # $t1 gets mask1 that is "-x" 

,但其余的我感到困惑。我不想要一个确切的答案,但一个解释将非常有帮助!

UPDATE:

我能够使它发挥作用。这是解决方案。谢谢!

**move $t0, $v0**   # $t0 gets copy of input x 
**sub $t1, $zero, $t0**  # $t1 gets mask1 that is "-x" 

li $v0, 1 
move $a0, $t0 
syscall 

li $v0, 4 
la $a0, outLab1   
syscall    # print output label 1 
li $v0, 1 
**and $a0, $t0, $t1**  # $a0 gets "all bits of x cleared except the 
         rightmost 1" 
syscall 

not $t2, $a0   # $t2 gets mask2 that is "$a0 with all its bits 
         toggled" 

li $v0, 4 
la $a0, outLab2   
syscall    # print output label 2 
li $v0, 1 
**and $a0, $t0, $t2**  # $a0 gets "all bits of x with the rightmost 1 
          cleared" 
syscall 

li $v0, 10    # exit 
syscall 

回答

0
xxxxxxxxxxxxx #$a0 gets "all bits of x cleared except the rightmost 1" 

检查如何补工作,以及如何价值x外观(位)都在t0t1(-x)。有一个非常基本的按位操作,当应用于x-x时,将会产生刚刚设置的1位(特殊情况是0x80000000(-2147483648)输入,其中取反的值超出了32位有符号整数范围,+2147483648再次是0x80000000(在32位无符号整数中),即与32b有符号整数的-2147483648表示冲突。这就是为什么32b int只有范围-2147483648 to +2147483647)。

xxxxxxxxxxxxx # $t2 gets mask2 that is "$a0 with all its bits toggled" 

那么,只需切换每一位? (因为我不做MIPS编程,我不确定在MIPS上可以使用哪种指令,在x86上NOT可以使用)。因此,请检查MIPS指令集,可能是按位操作。在没有某种内置NOT的CPU上,您可以通过使用xor(有时称为eor)和常数设置所有位(C中为-1~0,汇编程序中通常为-1)来实现此操作。我认为在一些RISC CPU上,零寄存器可以被翻转+在单指令中使用,也可以作为-1的来源。我添加这个sh * t仅仅是为了向你展示,你需要在汇编时有点创意,注意到寄存器中的所有指令和值,为某些特定的算术结果采取一些捷径。

xxxxxxxxxxxx # $a0 gets "all bits of x with the rightmost 1 cleared" 

现在他们要求你清除最右边的1和保持所有其他位完好,原始值x的。我不明白如何在没有透露解决方案的情况下如何帮助您解决这个问题,因为如果您考虑一下您的t0t1t2目前包含哪些解决方案,那绝对是微不足道的。

也许你有问题看到这些值的二进制形式,所以它不会“跳到你”这些事情是如何工作的?尝试一些计算器,它也可以显示二进制形式,并检查计算/值以查看特定位(在十进制,十六进制和二进制之间来回切换,特别是十六进制< - > bin很好理解,那么您可以“看到“通过读取值的十六进制格式化来设置头中的特定位),然后重新读取基本按位操作的描述(and, or, xor),然后返回到此任务。