• 締切済み

CPUと2進数の足し算。

+24 A[0 0 0 1 1 0 0 0 ] F[0 0 0 0 0 0 0 0] -24 A[1 1 1 0 1 0 0 0 0 ] F[0 0 0 0 0 0 0 1] +8 B[0 0 0 0 1 0 0 0 ] -8 B[1 1 1 1 1 0 0 0 ] AレジスターへBレジスターを足す。 -24+(-8) A[1 1 1 0 0 0 0 0 ] F[0 0 0 0 0 0 1 0] +32 A[0 0 1 0 0 0 0 0 ] F[0 0 0 0 0 0 1 1] Fレジスターの下位が1bitなのでー32でよいのでしょうか? とくにFレジスターのbitの動きがわかりません。 あるいは、数値の±は別のところで識別しているようでもある。

みんなの回答

  • info22
  • ベストアンサー率55% (2225/4034)
回答No.5

#2、#3です。 フリーソフトのZ80シミュレータ(Windows XPで動作確認済み)でA,Fレジスタの変化を確認できます。 http://www.vector.co.jp/soft/win95/util/se091567.html インストールしてニーモニックでコマンドを入力してステップ実行することで Z80のすべてのレジスタの動作が確認できます。 最初の質問だと ORG 8000H LD A,8 NEG LD B,A XOR A LD A,24 NEG ADD A,B NEG END をステップ実行してA、Fレジスタの変化を確認できます。 このプログラムは「*.z80」の拡張子で保存しておいけば再読み込みして実行できます。 A#2の補足の掛け算、割り算の演算もニーモニックでプログラムしてやれば動作が確認できます。 整数の掛け算、割り算には、2の補数を使いませんね。 通常、符号と絶対値(正の整数、符号なし2進数)に分けて、 正整数同士の掛け算、割り算として加算または減算で計算し、符号は符号だけで処理します。 (参考URL)Z80命令一覧(ニーモニック、フラグの変化、マシン語、コマンド動作解説)

参考URL:
http://msx.ms/z80_____.txt
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

#2, #3 を見て「Z80 だと最初に書いてあればより簡単に (かつ直接的に) 答えが得られる」ということは理解できましたね? 何が重要な情報であるかというのは確かに判断しにくいのですが, 判断できないときには「可能な限り全て出す」という方針でいくといいことが多いです. で, Z80 なら数値の正負は #3 の「サインフラグ」で判断することになります. これが 0 なら非負 (0 か正), 1 なら負です. あと, PV フラグは加減算のあとでは「オーバーフローフラグ」として働き, 「符号付き整数として見たときに計算結果が 8ビット符号付き整数で表すことができない」場合に 1 が立ちます. これらを組合せて, 「最終的な結果が正か負か」「オーバーフローが起きたかどうか」を判断します.

noname#111804
質問者

補足

私は、かなり初期ロットに近い Intelの4bitCPU”i4004"をもっている。 昨年、某大学際にこれをもってでかけた。 パソコンクラブが一教室を使ってロボットのデモをやっていた。 私は傍にいた大学生にこれをみせながらはなしかけたのだ。 そしたら、表面に小さく刻印してある"i4004”のもじを 目ざとく見つけて興奮して私に話しかけてきたのだ。 私はうれしかった。なぜならこんな経験ははじめてであったから。 いつもは、見せてもほとんど知らないので反応がないのだ。 この大学生はマイコンマニアであることがすぐにわかった。

  • info22
  • ベストアンサー率55% (2225/4034)
回答No.3

#2です。 Z80なら Fレジスターはフラグレジスタですね。 各ビットの割付は以下の通りになっています。 A#2で最下位ビット(LSB)はCarry(桁上がりビット)ですね。 演算結果の正負は7ビット目(MSB)に割り付けられていますね。 LSBのすぐ上の1ビット目は減算した時に1が立つ。 2ビット目がオーバーフロー(アンダーフロー)が起こった時1が立つ。 ということです。 (A#2の回答はZ80ということがわかっていなかったので推測結果でしたので、上記(または下図)のように訂正下さい。 (下図は等幅フォントで表示させて見てください) 7 6 5 4 3 2 1 0 ┌─┬─┬─┬─┬─┬─┬─┬─┐ │S│Z│/│H│/│PV│N│C│ └─┴─┴─┴─┴─┴─┴─┴─┘ ・S:サインフラグ 演算の結果が負だったら1 ・Z:ゼロフラグ 演算の結果が0だったら1 ・H:ハーフキャリーフラグ ・P/V:パリティ/オーバーフローフラグ 演算の結果がオーバフローしたら1 ・N:減算フラグ 減算を行ったら1が立つ ・C:キャリーフラグ 演算の結果、最上位ビットから桁上げがあったら1

参考URL:
http://rryu.sakura.ne.jp/compfund/backnumber/compfund018.txt
noname#111804
質問者

補足

フリーソフトの紹介ありがとうございます。 これだと Aレジスター、FレジスターのBitの動きよくわかりますね。

  • info22
  • ベストアンサー率55% (2225/4034)
回答No.2

> Fレジスターの下位が1bitなのでー32でよいのでしょうか? 良いと思います。最下位(LSB)の1は符号ビットと思います。 >とくにFレジスターのbitの動きがわかりません。 LSBのすぐ上のビットはオーバーフローまたはアンダーフローの検出に使われているのではないかと思われます。マイナスの数とマイナスの数を加えて1(マイナスビット)が立ってマイナスの結果ということだと思います。 つまり計算結果がマイナスで正常で、その結果がマイナスの「-32」ということでしょう。 >あるいは、数値の±は別のところで識別しているようでもある。 別の所ではないでしょう。FレジスタのLSBが符号ビットでしょう。

noname#111804
質問者

補足

Z80マップ http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Z80-CPU_register_set.png +24 A[0 0 0 1 1 0 0 0 ] F[0 0 0 0 0 0 0 0] (+24)x(+8) =24+24+・・・+24(8回)・・・・・(1) の演算をやり、PCカウンターで8回を認識したら 計算完了。こたえは正値なのでFレジスターの MSB=0でしょうね。 ところが 24x(-8) =のとき計算できない。 ゆえに(1)式で計算し、Fレジスターの MSB=1にしているのでは? 除算は 24/8 =24-8-8-8( 3回)=0・・・・・(2) なので、答えは3 ところが 24/-8 =が計算できない。 なので、(2)式で計算し正解は”ー3”としているのではないだろうか? なお、スーパーコンピュータでよく使うパラメーター Flopsの元祖はこのPCカウンターではないだろうか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

情報が少なすぎ. 「Fレジスタ」って何? その「下位が 1bit である」とはどういうこと? 「Fレジスタの bit の動き」って, 何を言ってるの? そんなの, 説明ないの?

noname#111804
質問者

補足

コメントありがとうございました。 8bitCPUのZ80の構成がそのようになっているのです。 AレジスターはAccumuratorレジスターです。 Aレジスターはちょうどそろばんのようなものです。 数値を次々と入れてきます。 FレジスターはFlagレジスターではないかと思います。 なぜ8bitも必要かといえば、これによって 1万回くらいの足し算が可能になっているのではないでしょうか?

関連するQ&A

専門家に質問してみよう