MIPS的lsb和msb是哪个方向?
mips的lsb(最低有效位)和msb(最高有效位)是哪个方向?MIPS的lsb和msb是哪个方向?,mips,Mips,mips的lsb(最低有效位)和msb(最高有效位)是哪个方向? 例如,如果我有一个32位十六进制十进制0x12345678,那么对于4位(最低和最高)有效位,这是否正确? LSB=0x00005678 MSB=0x12340000您可能没有意识到这一点,但您提出了一个技巧性问题:MIPS可以配置为little-endian或big-endian 您可以通过代码确定哪一个:将1分配给32位整数变量,1将是最低有效位的位置,所有其他位为0。您可能没有意识到这一点,但您提出了一个技巧性问题:M
例如,如果我有一个32位十六进制十进制0x12345678,那么对于4位(最低和最高)有效位,这是否正确?
LSB=0x00005678
MSB=0x12340000您可能没有意识到这一点,但您提出了一个技巧性问题:MIPS可以配置为little-endian或big-endian
您可以通过代码确定哪一个:将1分配给32位整数变量,1将是最低有效位的位置,所有其他位为0。您可能没有意识到这一点,但您提出了一个技巧性问题:MIPS可以配置为小端或大端
您可以通过以下代码确定:将1分配给32位整数变量,1将是最低有效位所在的位置,所有其他位为0。斯科特·亨特给了您正确的答案。但是,根据你的评论:
我试图创建一个函数,该函数接受两个32位int参数,每个参数获取16个lsb,并将16位存储到32位int结果的上限和下限中 我不认为endianness包含在它里面,因为你的函数已经在寄存器中有了值,所以不管endianness是什么,问题都是一样的 下面是一个实现您的功能的程序:
# 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
但是,为了补充Scott的答案,这里有一个程序来计算endianness。只需提取
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
斯科特·亨特给了你正确的答案。但是,根据你的评论:
我试图创建一个函数,该函数接受两个32位int参数,每个参数获取16个lsb,并将16位存储到32位int结果的上限和下限中 我不认为endianness包含在它里面,因为你的函数已经在寄存器中有了值,所以不管endianness是什么,问题都是一样的 下面是一个实现您的功能的程序:
# 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
但是,为了补充Scott的答案,这里有一个程序来计算endianness。只需提取
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
那么默认值是什么?没有默认值吗?我正在尝试创建一个函数,该函数使用两个32位int参数获取每个参数的16个lsb,并将这两个16位存储到32位int resultwell(默认值)的上限和下限中?没有默认值吗?我正在尝试创建一个函数,该函数接受两个32位int参数,每个参数获取16个lsb,并将16位存储到32位int结果的上限和下限中