2016-12-11 55 views
1

私はASM/MIPSテクノロジを使用しています。MIPS命令を32ビット16進数に変換する方法

私はMIPS命令を32ビットの16進数に変換したいと思っています。 たとえば、$ t0、$ zero、$ t1を16進数に変更したいとします。

私は多くの解決策を見つけましたが、すべてが異なります。

答えて

2

MIPSサブ命令は2つのレジスタを減算し、その結果をレジスタに格納します。 sub $d,$s,$t

sub = function code 34 (see manual), 22 in hex, 100010 in bin (6 bits) 
$t0 = 8 in decimal, 8 in hex, 01000 in bin (5 bits) 
$zero = 0 in decimal, 0 in hex, 00000 in bin (5 bits) 
$t1 = 9 in decimal, 9 in hex, 01001 in bin (5 bits) 

$d = $s - $tは、だからあなたの命令のマシンコードが01001 01000 00000 100010 R形式の命令、オペコード、または「オペレーションコード」については

は常にゼロであることを意味します。 rs、rt、rdは2つのソースレジスタと1つのデスティネーションレジスタに対応しています。

したがって、ソースsub$t0,$zero,$t1は、16進表記で0x00094022に変換されます。

説明

すべてのMIPS命令は32ビットであり、16進数形式のマシンコードのように書くことができる32ビット数に変換します。

命令サブ(減算)は、オペコード0x22を有する。したがって、右端の数字は22でなければなりません(上の数字を参照)。

subは命令タイプRです。これは、命令によって使用されるすべてのデータ値がレジスタにある場合にR命令が使用されることを意味します。

すべてRタイプの命令は以下のフォーマットを有する:「OP」は、(この場合サブにおける)特定の命令のニーモニックである

OP rd, rs, rt 

を。 rs、rtはソースレジスタ、rdはデスティネーションレジスタです。言い換えれば

sub $t0, $zero, $t1 

は、あなたの命令が「0からT1を減算し、T0で結果を置く」を意味します。この場合、サブ命令をとして使用されています。

あなたは次のようにあなたがそれを行うことができる2つのレジスタの値を交換する場合:

.text 
.globl __start 
__start: 

sw  $t0, x 
sw  $t1, y 
lw  $t0, y 
lw  $t1, x 
.data 
x: 
.word 0x000000FF 
y: 
.word 0xABCDE080 

あなたは$ t1の中でも、$ t0の中にコンテンツを配置する場合、あなたはor命令を使用することができます。

lui $t0, 0x
or $t1, $zero, $t0 
+0

私は自分で試してみましたが、同じ結果があります。 しかし私はバイナリ(10010100000000100010)を渡しました。 あなたの説明は良かった、ありがとう。 しかし私には別の質問があります:$ t0と$ t1のレジストリを交換したいのですか?それをもう一度変換するか、それとも役に立たないのですか? – hiero

+0

私はxchg $ t0、$ t1を完了しました – hiero

+0

とても複雑です。 どうすればいいですか? xchg 8,9? – hiero

関連する問題