Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MIPS的lsb和msb是哪个方向?_Mips - Fatal编程技术网

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

mips的lsb(最低有效位)和msb(最高有效位)是哪个方向?
例如,如果我有一个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结果的上限和下限中