目前我有
lh $t1, 0($t1)
用于将$t1从16位扩展到32位的符号,但这不起作用。有没有一种简单的方法可以在MIPS中对扩展寄存器进行签名?
我理解你的问题的方式,即使你试图使用lh
,但你实际上想签名扩展$t1
的半字值,而不是$t1
所指向的半字。
你可以通过两个转变来实现这一点:
sll $t1, $t1, 16
sra $t1, $t1, 16
如果你从0x8000开始,那么在第一次移位后会得到0x80000000,在第二次移位后得到0xffff8000
如果你从0x7fff开始,那么在第一次移位后会得到0x7fff0000,在第二次移位后得到0x7ff。
lh
确实有效,但您需要确保从中加载的内容是由.half
定义的,而不是由.word
定义的,因为宽度和小端因素:
main:
la $t5,myhalf
lh $t1,0($t5)
nop
.data
myhalf: .half 0x8000 # this works
# these do _not_
myword: .word 0x80000000
myword2: .word 0x8000