1

私はacプログラムを書いており、mips 32ビット命令をデコードし、それらの機能からビット単位の部分を差し引いてシミュレートしています。ここで、署名された操作と署名されていない操作を区別する方法がわかりません。

たとえば、レジ​​スタ rd と rs が与えられた場合、乗算して結果を rd に入れる必要があります。

マルチ命令については、次のように簡単です。

reg[rd] = reg[rs] * reg[rt];

マルチ命令はどうあるべきですか?最初にレジスタの内容に対してビット演算を行う必要がありますか?

私もする必要があります:

-add、addu、-div、divu -sub、subu

それらすべての機能の違いは同じですか?

4

2 に答える 2

3

MIPS 乗算はオーバーフローできません。完全な 64 ビットの結果を伴う 32x32 ビットの操作です。

同様に、署名された結果と署名されていない結果の間にも大きな違いがあります。

これらを C で簡単にシミュレートするには、以下の C99 整数型が必要です<stdint.h>

uint32_t reg1, reg2; /* Use this type for the registers, normally */
uint32_t hi, lo; /* special MIPS registers for 64-bit products and dividends */    
/* Signed mult instruction: */
int64_t temp = (int64_t)(int32_t)reg1 * (int_64_t)(int32_t)reg2;
hi = (uint32_t)((temp>>32) & 0xFFFFFFFF);
lo = (uint32_t)(temp & 0xFFFFFFFF);

符号付き 32 ビット型への中間キャストは、符号付き 64 ビット型へのキャストが乗算の前に符号拡張されるように行われます。符号なし乗算も同様ですが、中間キャストが必要ない点が異なります。

/* Unsigned multu instruction: */
uint64_t tempu = (uint64_t)reg1 * (uint64_t)reg2;
hi = (uint32_t)((temp>>32) & 0xFFFFFFFF);
lo = (uint32_t)(temp & 0xFFFFFFFF);
于 2013-09-29T02:33:33.527 に答える