2016-04-11 9 views
0

mipsのlsb(最小符号ビット)とmsb(最上位ビット)の方向はどちらですか?
たとえば、32ビットの16進数の0x12345678を持っている場合、これは4ビット(最下位ビットと最上位ビット)の正しいビットでしょうか?
LSB = 0x00005678
MSB = 0x12340000MIPSのlsbとmsbの方向はどちらですか?

答えて

2

あなたはそれを実現していないかもしれませんが、あなたはトリックの質問をしてきました:MIPSはリトルエンディアンまたはビッグエンディアンのいずれかとして構成することができます。

、コードを介しているかを決定することができる:32ビット整数変数に1を割り当て、最下位ビットが0

+0

これはデフォルトです。デフォルトはありませんか? – localplutonium

+0

私は2つの32ビットint引数を取る関数を作成しようとしていますが、それぞれ16 lsbを取得し、32ビットint結果の上位と下位の両方に16ビットを格納します – localplutonium

0

スコット・ハンターはあなたを与えた他の全てのビットと、進み1なり正しい答え。しかし、あなたのコメントに基づいて:

私は、32ビットのint結果の上部および下部にそれぞれ格納の両方の16ビット

の16 LSBを取得する2つの32ビットのint型の引数を取る関数を作成しようとしています

あなたの関数はレジスタの値がすでにであるため、エンディアンが関係しないので、問題はと同じに関係なくエンディアンに関係なく発生します。ここで

はあなたの機能を実現するプログラムです。ここで

# 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 

しかし、ちょうどScottの答えに追加するには、ここにありますエンディアンを計算するプログラム。 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 
関連する問題