MIPS的lsb和msb是哪个方向?

时间:2016-04-11 20:35:51

标签: mips

mips的lsb(最不重要的位)和msb(最高位)的方向是哪个?
例如,如果我有一个32位十六进制十进制0x12345678,这对于4(最少和最多)有效位是否正确?
LSB = 0x00005678
MSB = 0x12340000

2 个答案:

答案 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