• ベストアンサー

10進数を2進数に変換するプログラム

このアセンブラのプログラムはIN命令によって3桁のレコードに入力された10進数の値を2進数に変換するプログラムです。 INPUT START                      (1) RPUSH                      (2) IN IBUF,ILEN ;レコードを入力       (3)     LD GR0,ILEN                (4) JMI FIN2 ;ファイルの終わり      (5) LD GR1,=0   ;けた数のカウンタ      (6) LD GR4,=0   ;数値の初期化        (7) LOOP2 LD GR3,IBUF,GR1               (8) AND GR3,=#000F ;数字を数値に変換      (9) LD GR5,GR4;ここから↓4つの命令はGR4を10倍する (10) SLL GR5,3;                   (11) SLL GR4,1;                   (12) ADDA GR4,GR5;                  (13) ADDA GR4,GR3                   (14) ADDA GR1,=1                   (15) CPA GR1,GR0                   (16) JMI LOOP2                    (17) LD GR0,GR4                   (18) FIN2 RPOP                         (19) RET ILEN DS 1 IBUF DS 256 END (8)のLOOP2 LD GR3,IBUF,GR1の命令なのですが、「これはIBUFとGR1のアドレスをたしてGR3にその内容を格納する。」という意味であり、その後(14)で10倍されたGR4にたしています。 質問としては、この2進数に変換するプログラムでGR3とGR4の役割を教えていただきたいです。 GR1はレコードの桁数に使われている領域だとわかります。 個人的な解釈としては、GR4はレコードに入力する10進数の数値なのですが、GR4をなぜ10倍すると2進数に変換されるのかなどやGR3の意味がわからないために全く理解できません。 よろしくお願いします。

質問者が選んだベストアンサー

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

2, 5, 3 という 3個の数字をこの順に読んだときに, あなたはどのようにしてこの数字の列が「253 という数値を表す」と理解しますか?

rinnshan
質問者

お礼

2を100倍して残す、5を10倍して残す、そして、最後に、 3を含む三つを足します。

その他の回答 (5)

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

そういうことだと思います. 123 と 10進文字列で書いてあると「人間には読みやすいけど計算には不向き」なので, 「内部表現としての 2進数」(つまり 123 という数値) に変換する, ということでしょう.

rinnshan
質問者

お礼

何度も何度も相談いただきありがとうございました。 今後の勉強も頑張っていきたいと思います。

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

ここでやっているのは要するに 「123 という表現を, それが表す数値に変換する」 ということですね. 「10進数」とか「2進数」とかいう表現をしているために, かえって混乱されているのかもしれません.

rinnshan
質問者

お礼

つまり、123という表現が「10進数」であり 数値に変換すると「2進数」になるという見方でよろしい のでしょうか。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

入力はおそらく"123"のような文字列なのでしょう。 「2進数」と言っているのはコンピュータの内部形式を指していると 推測されます。人間が分かる"123"は内部形式では(1111011)bです。 処理内容は左から1桁ずつ数値化し、10倍しながら加算するという ことです。 A. "1"を数値の1にする(GR3←1) B. 0(GR4の初期値)を10倍してGR3を足す。(GR4←1) C. "2"を数値の2にする(GR3←2) D. 1を10倍してGR3を足す。(GR4←12) E. "3"を数値の3にする(GR3←3) F. 12を10倍してGR3を足す。(GR4←123) ループでなく記述すると以上のようになります。

rinnshan
質問者

補足

そのように処理が行われるということはわかりました。 しかし、このプログラムは10進数を2進数に変換する プログラムです。(参考書にはそう書いてあります。) nda23さんの言っていることを解釈すると、これは123 となった時点で2進数に変換されているということで よろしかったのでしょうか?

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

すみません, 意味が分かりません. ・「(10)~(14) でレコードに入力している」というのはどういう意味でしょうか? ・「命令(4)のLD GR0,ILENというもので、GR0に二進数を変換して入力している」とはどういうことでしょうか? 「二進数を変換する」と書かれていますhが, この「二進数」とはなんですか? そして, それを何に変換するんですか?

rinnshan
質問者

お礼

すみません。 理解不足でした。 私もプログラミング初心者な物で、文字列を入力することで二進数に 変換されるとは知りませんでした。 レコードは文字を入力する領域であり、10倍してGR3を足すことで レコードに文字列が一つ一つ入力されているのだと思っていました。 そして、レコードに入力された10進数の数値を二進数に変換する プログラムなので、命令(4)で変換されているのだと思っていました。 おそらく、下記の方が解答されていらっしゃる解釈で問題ないと 思います。3度もかまっていただき、誠にありがとうございました。

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

そう, そしてその計算は (2×10+5)×10+3 とすることができます. (10)~(14) では結局 GR4 = GR4×10+GR3 という計算をしていることになります. この 2つを見比べればわかるのではないでしょうか.

rinnshan
質問者

お礼

なるほど、(10)~(14) でレコードに入力しているのですね。 では、2進数に変換しているのは、LOOP2内での入力が完了したら 上記の命令(4)のLD GR0,ILENというもので、GR0に二進数を 変換して入力しているという解釈でよろしかったでしょうか。

関連するQ&A

専門家に質問してみよう