アプリ版:「スタンプのみでお礼する」機能のリリースについて

このアセンブラのプログラムは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の意味がわからないために全く理解できません。

よろしくお願いします。

A 回答 (6件)

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

しますか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/27 23:58

そういうことだと思います.


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

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

お礼日時:2009/05/29 13:34

ここでやっているのは要するに


「123 という表現を, それが表す数値に変換する」
ということですね. 「10進数」とか「2進数」とかいう表現をしているために, かえって混乱されているのかもしれません.
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/28 23:54

入力はおそらく"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進数に変換されているということで
よろしかったのでしょうか?

補足日時:2009/05/28 22:13
    • good
    • 0

すみません, 意味が分かりません.


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

すみません。
理解不足でした。
私もプログラミング初心者な物で、文字列を入力することで二進数に
変換されるとは知りませんでした。

レコードは文字を入力する領域であり、10倍してGR3を足すことで
レコードに文字列が一つ一つ入力されているのだと思っていました。

そして、レコードに入力された10進数の数値を二進数に変換する
プログラムなので、命令(4)で変換されているのだと思っていました。

おそらく、下記の方が解答されていらっしゃる解釈で問題ないと
思います。3度もかまっていただき、誠にありがとうございました。

お礼日時:2009/05/28 20:29

そう, そしてその計算は


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

なるほど、(10)~(14) でレコードに入力しているのですね。

では、2進数に変換しているのは、LOOP2内での入力が完了したら
上記の命令(4)のLD GR0,ILENというもので、GR0に二進数を
変換して入力しているという解釈でよろしかったでしょうか。

お礼日時:2009/05/28 01:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!