mips的lsb(最不重要的位)和msb(最高位)的方向是哪个?
例如,如果我有一个32位十六进制十进制0x12345678,这对于4(最少和最多)有效位是否正确?
LSB = 0x00005678
MSB = 0x12340000
答案 0 :(得分:2)
您可能没有意识到这一点,但您提出了一个技巧问题:MIPS可以配置为little-endian或big-endian。
您可以确定哪个通过代码:将1分配给32位整数变量,1将是最低有效位的位置,所有其他位为0。
答案 1 :(得分:0)
我正在尝试创建一个需要两个32位int参数的函数,每个函数获得16 lsb,并将16位存储到32位int结果的上部和下部
我不认为字节顺序会进入它,因为您的函数已经在寄存器中具有值,因此无论字节顺序如何,问题都是相同。< / p>
这是一个实现你功能的程序:
# swap -- combine two 32 bit integers lower 16 bits
.data
msg_nl: .asciiz "\n"
.text
.globl main
main:
li $a2,0x01020304
move $a0,$a2
jal print
li $a3,0x05060708
move $a0,$a3
jal print
move $a0,$a2
move $a1,$a3
jal swap
move $a0,$v0
jal print
li $v0,10
syscall
# swap -- combine lower 16 bits of two arguments into single 32 bit number
#
# arguments:
# a0,a1
#
# returns:
# v0 = ((a0 & 0xFFFF) << 16) | (a1 & 0xFFFF)
#
swap:
li $v0,0xFFFF # get mask
and $a0,$a0,$v0 # isolate lower 16 bits
and $a1,$a1,$v0 # isolate lower 16 bits
sll $v0,$a0,16 # retval = arg1 << 16
or $v0,$v0,$a1 # retval |= arg2
jr $ra
# print -- print a number in hex
print:
li $v0,34
syscall
la $a0,msg_nl
li $v0,4
syscall
jr $ra
以下是该程序的输出:
0x01020304
0x05060708
0x03040708
但是,只是为了补充斯科特的答案,这里有一个计算字节序的程序。只需提取endian
函数并将其添加到您的代码中:
# endian -- calculate endian
.data
endian_data: .word 0
msg_pre: .asciiz "machine is "
msg_big: .asciiz "big"
msg_little: .asciiz "little"
msg_fin: .asciiz " endian\n"
.text
.globl main
main:
li $v0,4
la $a0,msg_pre
syscall
jal endian
bnez $v0,main_big
la $a0,msg_little
j main_exit
main_big:
la $a0,msg_big
main_exit:
li $v0,4
syscall
la $a0,msg_fin
syscall
li $v0,10
syscall
# endian -- determine big-endian or little-endian
#
# RETURNS:
# v0 -- 0=little, 1=big
endian:
li $v0,1
sw $v0,endian_data
lb $v0,endian_data
jr $ra