MIPS - 将Word转换为字节

时间:2015-04-04 19:36:25

标签: binary bit-manipulation mips binary-data spim

我(我认为)是一个简单的问题。

我在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 ####################################

我可以想到事后修复它的黑客方法,但有没有更好的方法可以做到这一点?

0 个答案:

没有答案