我(我认为)是一个简单的问题。
我在MIPS中的寄存器中有一个值,我想将它从一个字转换为一个字节。
所以,例如: 我在寄存器$ t0
中的值为123456实际值将是: 00000000 00000001 11100010 01000000
然后我想将$ t0(01000000)最右边的字节的值放入$ t1。这将是值64。
我想这样做而不去记忆。我可以将它作为一个字节存储到堆栈并加载回来,但这似乎没必要。
我的一般想法是将位移到左边,然后移到右边,去掉"删除"位置31 ... 8的所有位。但是,它有明显的无法在不应该否定数字的情况下做到这一点。
以下是我有多接近的例子:
.text
main:
# START PROLOGUE ####################################
# Ignore all of this, irrelevent and I know the stack is too big
la $sp, -8($sp) # allocate space for old $fp and $ra
sw $fp, 4($sp) # save old $fp
sw $ra, 0($sp) # save return address
la $fp, 0($sp) # set up frame pointer
la $sp, -120($sp) # allocate stack frame: 120 = space for locals, temps in bytes
# END PROLOGUE ####################################
li $a0, 123456
li $v0, 1
syscall #would print out 123456, as it should
# Now say I want to load only a 'byte' of $a0 (convert a word to a byte)
sll $a0, $a0, 24
srl $a0, $a0, 24
syscall # Will print out 64, as it should
# However!
li $a0, 194
syscall # Prints out 194 as it should
sll $a0, $a0, 24
srl $a0, $a0, 24
syscall # Still prints out 194, but I want it to be -62 (signed)
# START EPILOGUE ####################################
la $sp, 0($fp) # (deallocate locals)
lw $ra, 0($sp) # (restore return address)
lw $fp, 4($sp) # (restore frame pointer)
la $sp, 8($sp) # (restore stack pointer)
jr $ra # return
# END EPILOGUE ####################################
我可以想到事后修复它的黑客方法,但有没有更好的方法可以做到这一点?