在 MIPS 中扩展寄存器的问题标志
Trouble sign extending a register in MIPS
目前我有
lh $t1, 0($t1)
for 符号将 $t1 从 16 位扩展到 32 位,但这不起作用。有没有一种简单的方法来在 MIPS 中对扩展寄存器进行签名?
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
我理解你的问题的方式,即使你试图使用 lh
你实际上想要符号扩展半字 的值 $t1
而不是 $t1
指向的半字。
您可以通过两班倒来完成:
sll $t1, $t1, 16
sra $t1, $t1, 16
如果您从 0x8000 开始,您将在第一次转换后得到 0x80000000,在第二次转换后得到 0xffff8000。
如果你从 0x7fff 开始,你会在第一次转变后得到 0x7fff0000,在第二次转变后得到 0x7fff。
目前我有
lh $t1, 0($t1)
for 符号将 $t1 从 16 位扩展到 32 位,但这不起作用。有没有一种简单的方法来在 MIPS 中对扩展寄存器进行签名?
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
我理解你的问题的方式,即使你试图使用 lh
你实际上想要符号扩展半字 的值 $t1
而不是 $t1
指向的半字。
您可以通过两班倒来完成:
sll $t1, $t1, 16
sra $t1, $t1, 16
如果您从 0x8000 开始,您将在第一次转换后得到 0x80000000,在第二次转换后得到 0xffff8000。
如果你从 0x7fff 开始,你会在第一次转变后得到 0x7fff0000,在第二次转变后得到 0x7fff。