- ベストアンサー
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の意味がわからないために全く理解できません。 よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
2, 5, 3 という 3個の数字をこの順に読んだときに, あなたはどのようにしてこの数字の列が「253 という数値を表す」と理解しますか?
その他の回答 (5)
- Tacosan
- ベストアンサー率23% (3656/15482)
そういうことだと思います. 123 と 10進文字列で書いてあると「人間には読みやすいけど計算には不向き」なので, 「内部表現としての 2進数」(つまり 123 という数値) に変換する, ということでしょう.
お礼
何度も何度も相談いただきありがとうございました。 今後の勉強も頑張っていきたいと思います。
- Tacosan
- ベストアンサー率23% (3656/15482)
ここでやっているのは要するに 「123 という表現を, それが表す数値に変換する」 ということですね. 「10進数」とか「2進数」とかいう表現をしているために, かえって混乱されているのかもしれません.
お礼
つまり、123という表現が「10進数」であり 数値に変換すると「2進数」になるという見方でよろしい のでしょうか。
- nda23
- ベストアンサー率54% (777/1415)
入力はおそらく"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) ループでなく記述すると以上のようになります。
補足
そのように処理が行われるということはわかりました。 しかし、このプログラムは10進数を2進数に変換する プログラムです。(参考書にはそう書いてあります。) nda23さんの言っていることを解釈すると、これは123 となった時点で2進数に変換されているということで よろしかったのでしょうか?
- Tacosan
- ベストアンサー率23% (3656/15482)
すみません, 意味が分かりません. ・「(10)~(14) でレコードに入力している」というのはどういう意味でしょうか? ・「命令(4)のLD GR0,ILENというもので、GR0に二進数を変換して入力している」とはどういうことでしょうか? 「二進数を変換する」と書かれていますhが, この「二進数」とはなんですか? そして, それを何に変換するんですか?
お礼
すみません。 理解不足でした。 私もプログラミング初心者な物で、文字列を入力することで二進数に 変換されるとは知りませんでした。 レコードは文字を入力する領域であり、10倍してGR3を足すことで レコードに文字列が一つ一つ入力されているのだと思っていました。 そして、レコードに入力された10進数の数値を二進数に変換する プログラムなので、命令(4)で変換されているのだと思っていました。 おそらく、下記の方が解答されていらっしゃる解釈で問題ないと 思います。3度もかまっていただき、誠にありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
そう, そしてその計算は (2×10+5)×10+3 とすることができます. (10)~(14) では結局 GR4 = GR4×10+GR3 という計算をしていることになります. この 2つを見比べればわかるのではないでしょうか.
お礼
なるほど、(10)~(14) でレコードに入力しているのですね。 では、2進数に変換しているのは、LOOP2内での入力が完了したら 上記の命令(4)のLD GR0,ILENというもので、GR0に二進数を 変換して入力しているという解釈でよろしかったでしょうか。
お礼
2を100倍して残す、5を10倍して残す、そして、最後に、 3を含む三つを足します。