Programming

HOME Programming

整数8を7倍する

※使用しているマイクロプロセッサは「MC68020/68030」
0011 000 000 111 100
0000 0000  0000 1000
0011 001 000 000 000
1110 010 101 000 001
1001 001 101 000 000

直訳すると、
int a;
a=8;
int b=a;
b=b*8;
a=b-a;
みたいな感じ。

以下、一行ずつ左から順に解説していきます。

0011 000 000 111 100
データレジスタ[000]に数値を代入。
ただし、具体的な数値の指定は二行目。

0011はワードデータ転送命令。
000 000は格納場所の指定。
最初の000はデータを転送するアドレス、次のはデータレジスタ直接修飾であることを示す。
111 100は、獲得場所の指定。即値修飾を表す。
要は、代入する数値は次の行を参照してくれってこと。

0000 0000 0000 1000
数値の8を表す。
それだけ。

0011 001 000 000 000
データレジスタ[001]にデータレジスタ[000]の数値を代入。

0011は、さっきも出てきたワードデータ転送命令。
001 000は格納場所の指定。
さっきがデータレジスタの000だったから、今度は001。
000 000は、獲得場所の指定。
1,2行目で、数値を代入したところ、つまりデータレジスタ[000]ね。

1110 010 1 01 0 00 001
データレジスタ[001]の値を左に3ビット算術シフト(つまり8倍)。

1110がシフト命令。
010は何ビットシフトするかを表す即値。
この010は二進数で2だけど、ここでは3を表す。
なぜって、000が1ビットシフトを表すことになってるから。
ここはミソかもしれない。
次の1はシフトする方向で左を表す。0だったら右にシフト。
01はシフトするデータのサイズ、つまりワードを表す。
ちなみに00だったらバイト、10だったらロングワード。
次の0は二番目の塊(010)の部分が即値とレジスタのどちらであるかを示す。
0だと即値、1だとレジスタ。
00はシフトの種類を示す。00は算術、01は論理、10は循環。
001はシフトするレジスタのアドレス。
前の行で8を代入した場所。

1001 001 1 01 000 000
データレジスタ[000]にデータレジスタ[001] マイナス データレジスタ[000]の値を代入。
ある数を8倍して、そこから元の数を引いた値は、元の数の7倍になるって寸法。

1001が減算命令。
001はデータレジスタのアドレス。
今は、8が3ビット左にシフトされたので64が入っている。
1は、格納場所が2番目と5,6番目の塊のどちらであるかを示す。
ここでは、5,6番目の塊が指定している部分を格納場所に指定している。
この値が0だと、二番目の塊で指定されたデータレジスタに演算結果が格納されることになる。
次の01は演算するデータのサイズ。シフトのところで出てきたのと一緒。
000 000が引く数、そしてここでは演算結果の格納場所でもある。
データレジスタ[000]のことね。
データレジスタの値の推移
アドレス
1行目2行目3行目4行目5行目
000不定88856
001不定不定86464