アセンブラ言語の算術演算についての質問と解説

このQ&Aのポイント
  • アセンブラ言語の算術演算について質問があります。具体的には、実機検証画面でアドレス8008でGR2の値が-32750になる理由について教えてください。
  • また、アドレス8012が指しているのか、それとも内容の「20」が指しているのかも知りたいです。
  • さらに、書籍内の問題であるプログラムの実行結果や修正する箇所についても教えてください。
回答を見る
  • ベストアンサー

プログラムの算術演算で教えて下さい。

お世話になっております。 とある試験問題のアセンブラ言語について、算術演算が理解できず困っておりますので投稿させて頂きました。 この問題を解決できないと、先に進めない状態となっており、困っております。 【前提】 実機を使用してアセンブルしながら値の確認を行っているのですが、下記の問題において、アドレス8008でGR2の値が下記の様に表示されています。 【GR2】 アドレス:#8012 算術:-32750 論理:32786 1000 0000 0001 0010 また、問題集の解説には下記の様に記載されています(一部抜粋)。 「1回目のGR2は#8012、GR3は#8016です。CPA命令は算術10進数で比較しますから、変換するとGR2が-32750、GR3が-32746です。GR2やGR3に設定したのはラベルのアドレスでしたね。」 【ご質問】 GR2の値が、なぜ「-32750」になるのか?を教えて下さい。 また、これは"8012を指しているのでしょうか?それとも内容の「20」を指しているのでしょうか? 今、私が理解できるのは、 ・実機検証画面の2進数「1000 0000 0001 0010」は、16進数の「8012」を示している ・アドレス8008行によって#8011番地にONEが加算、つまり#8011+1=#8012番地を対象とする ところまでは理解できるのですが、その先どう計算したら良いのかがわかりません。 現在数百ページある書籍の内70ページ程を読み進めたところですが、全体的に算術演算がよく理解できていない様に感じてはいます。 が、書籍を読んでもいまいち理解が難しいため、お伺いします。 【書籍内問題】 (1)下記プログラムを実行した結果、ANS番地に格納される値を10進数で答えなさい。 (2)下記プログラムは誤りがあります。誤っている箇所を修正しなさい。 ■アセンブルリスト  ※-------------------------------- ご覧のブラウザ環境によってスペース等の表示が変わる可能性がありますので、 区切りで「/」を入れております。 見やすくしただけで、問題自体に「/」はございません。 ※-------------------------------- ADDR: メモリ内容  /プログラム  : /REI7004 / START 8000: 1210/0000 /LAD /GR1,0 8002: 1220/8011 /LAD /GR2,DATA 8004: 1230/8016 /LAD /GR3,ENDDATA 8006: 2012/0000 /LOOP /ADDA /GR1,0,GR2 8008: 2020/8010 /ADDA /GR2,ONE 800A: 4423/ /CPA /GR2,GR3 800B: 6100/8006 /JMI /LOOP 800D: 1110/8016 /ST /GR1,ANS 800F: 8100/ /RET 8010: 0001/ ONE /DC /1 8011: 000A/ DATA /DC /10 8012: 0014/ DC /20 8013: 001E/ DC /30 8014: 0028/ DC /40 8015: 0032/ DC /50 8016: ENDDATA /DS /0 8016: 7FFF/ ANS /DS /1 : END 以上となります。 ド素人の質問で申し訳ありませんが、ご回答頂ける方がいましたらよろしくお願いします。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

コンピュータがどうやって「負の値」を扱っているか、知っておくとよいでしょう。 http://ja.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E4%BB%98%E6%95%B0%E5%80%A4%E8%A1%A8%E7%8F%BE この場合は、2の補数表現を使っています。 http://ja.wikipedia.org/wiki/2%E3%81%AE%E8%A3%9C%E6%95%B0 ビットの列び 1000 0000 0001 0010 を 算術(2の補数表現で負を表わした2進数の値)と解釈すれば、(10進で)-32750 論理(正の2進数の値)と解釈すれば、(10進で)32786 となります。

san1126
質問者

お礼

ご回答ありがとうございます! もの凄く助かりました。 おかげさまで問題「GR2は#8012、GR3は#8016」が両方とも手計算で算出する事が出来ました。 ありがとうございます。 しかし、計算が大変ですね。 あくまで試験勉強なので、試験本番は手計算をしなければならないと思うとしんどいです..。 2の補数まで出した2進数→10進数への変換は、最後の方の桁(0111)は16384+8192+4096を手計算しなければならいなんて... ともかく、無事に解決できました。 ありがとうございました。

関連するQ&A

  • CASL(CASL2)でこんな問題があります。ぜひ教えてください。

    ・以下のプログラムを実行したときに,ANS0番地からANS6番地までの各番地に格納される値を16桁の2進数で答えよ。本プログラムのNUM番地からの7語には,それぞれ数値として格納されているものとする。 LAD GR1,O LOOP CPA GR1,LEN    JZE FIN LD GR2,NUM,GR1 LD GR0,CHAR,GR2 ST GR0,ANS0,GR1 LAD GR1,1,GR1 JUMP LOOP FIN RET NUM DC 1,3,5,6,4,2,0 LEN DC 7 CHAR DC'ABCDEFGHIJ' ANS0 DS1 ANS1 DS1 ANS2 DS1 ANS3 DS1 ANS4 DS1 ANS5 DS1 ANS6 DS1 END ・以下のプログラムを実行したときに,ANS番地に格納される値を,4桁の16進数で答えよ。本プログラムはNUM番地からの3語には,222が文字列として格納されているものにする。 START LAD GR0,0 LAD GR1,0 LOOP CPA GR1,CNT JZE NEXT LD GR2,NUM,GR1 AND GR2,COOOF ADDA GR0,GR2 LAD GR1,1,GR1 JUMP LOOP NEXT LD GR3,GR0 SLA GR3,7 ST GR3,WK1 SRA GR3,3 ST GR3,WK2 SRA GR3,1 ST GR3,WK3 SRA GR3,1 ST GR3,WK4 LD GR3,WK1 SUBA GR3,WK2 SUBA GR3,WK3 SUBA GR3,WK4 ST GR3,ANS RET NUM DC '222' CNT DC 3 C000F DC #000F WK1 DS 1 WK2 DS 1 WK3 DS 1 WK4 DS 1 ANS DS 1 END ・以下のプログラムを実行すると,ANS番地からの5語に,以下のような ビットパターンが格納される。 ANS+0番地 1000000000000000 ANS+1番地 0000000010000000 ANS+2番地 0000000000001000 ANS+3番地 0000000000000010 ANS+4番地 0000000000000001 このとき,(1)~(6)の空欄に適切な命令コードやオペランドを入れて, プログラムを完成させよ。 START   LAD  GRO,1   LAD  GR1,1 ((1)) GR2,LEN LOOP SUBA  GR2,=1   ((2)) FIN    ST  ((3))    SLL  ((4))       SLA  GR1,1    JUMP LOOP FIN  RET ANS  ((5))5 LEN  ((6))5    END ・20文字以内の文字列Sを入力し,Sの末尾にある文字※の個数だけ 文字#をSの先頭に追加し,かつSの末尾にある文字※を削除した文字列 Rを出力する。 入力する文字S CASLII※※※※ 出力する文字R ####CASLII こんな質問で非常にもし分けないのですが… 自分なりに色々考えましたが,どうもうまく行きません。 ご指導よろしくお願いします。 わかる範囲で構いませんのでロジックと解説をお願いします。

  • CASLII☆台形の面積 (急!!)

    上底12、下底9、高さ8の台形の面積を求めて答えを表示させる問題です。     START     LAD   GR1,0     LAD   GR2,0 NEXT  ADDA  GR2,M     LAD   GR1,1,GR1     CPA   GR1,N     JNZ   NEXT     SRA   GR2,1     ST   GR2,ANS     RET M   DC  21 N   DC   8 ANS  DS   1    END と考えました。 修正した方がいいと思われる点を教えてくださいm(__)m 答えが入る場所が、変な気がします。(・・;)

  • CASL2の問題について教えて下さい。

    CASL2を勉強したばかりで、いろいろ調べても分からず、下記の問題が解けなくて困っています。 どなたかお分かりの方いらっしゃいましたら教えて下さい。 よろしくお願いいたします。 下記のプログラムを実行すると、ANS番地からの6語に、以下のようなビットパターンが格納される。 ANS番地+0番地 0111111111111111 ANS番地+1番地 1111101111111111 ANS番地+2番地 1111111110111111 ANS番地+3番地 1111111111110111 ANS番地+4番地 1111111111111101 ANS番地+5番地 1111111111111110 このとき、(1)~(6)の空欄に適切な命令コードやオペランドを入れて、プログラムを完成させよ。 START LAD GR0,1 LAD GR1,1 LD GR2,LEN LOOP SUBA GR2,=1 JMI FIN LD (1) (2) GR3,WK ST (3) SLL GR0,0,GR1 LAD (4) JUMP LOOP FIN RET ANS DS 6 LEN DC (5) WK DC (6) END

  • CASLIIの解説

    以下のような問題があり、解答がありますが理解できません。 すみませんが、どなたか解説をお願いします。 ---------------------------------------------------------- ■問題  10進数の「5×20」の結果を求め、その結果をメモリに格納するプログラムを作成せよ。ただし、「5×20」の数を他の数に置き換えた時も掛け算が行えるプログラムにすること。 ■解答  SAMPLE START LAD GR1,0 LAD GR2,1 LD GR3,=5 LOOP LD GR4,C20 AND GR4,GR2 JZE NEXT ADDA GR1,GR3 NEXT SLA GR3,1 SLL GR2,1 JNZ LOOP ST GR1,ANS RET C20 DC 20 ANS DS 1 END

  • CASLIIのFINについて教えて下さい

    CASLIIの『FIN』とはどんなときに使うのか、どんな意味があるのか教えて下さい。下の2個の例のように、JUMPでFINに飛んだり、単なるラベルであったりしています。 ;100を初めて超える7の倍数 LAD GR1,0 LOOP CPA GR1,C1000 JPL FIN LAD GR1,7,GR1 JUMP LOOP FIN ST GR1,ANS RET C100 DC 100 ANS DS 1 END ;1000を16ビットの2進数で表した時1が立っている数 LAD GR1,0 LAD GR2,1 LOOP LD GR3,C1000 AND GR3,GR2 JZE ZEXT LAD GR1,1,GR1 NEXT SLL GR2,1 JNZ LOOP FIN ST GR1,ANS RET C1000 DC 1000 ANS DS 1 END

  • CASL2のDREGとは?

    学校でCASL2の授業を選択必修でとっている都内某K大生です。 その中の命令で、DREG というのがあるのですが、教材にそれが何であるのか書いておらず、 インターネットを駆使しても探し当てることができず、困っております。 例:2数の和:10+5 の結果をGR1に格納する   この問題を、結果が見えるように拡張せよ WA  START BGN BGN LAD   GR1,10      LAD   GR2、5      ADDA  GR1,GR2      DREG  ANS      RET ANS  DC    ’’      END  以上のような答えらしいのですが、 ・DREGとは何か? ・ANS DC ’’ の【’’】にはどのような意味があるのか?  (コマンドプロンプトで実行すると、意味ありげな空白が出てきます) が分からずに困っております。 教授に質問しても、DREGを使うという答えしかかえって来ません>_<; どなたか解説お願いいたしますm(_)m

  • CASLIIのADDAとADDLの演算

    次の問題があっているのかわかりません。 次のCASLIIプログラムの実行後のレジスタ(GR1,FR)とメモリ(AA,BB,CC番地) の内容を16進表示および符号付き10進表示せよ。 PGM START LD GR1,AA ADDA GR1,BB ST GR1,CC RET AA DC 32767 BB DC 1 CC DS 1 END 32767をGR1に入れて、1加算する。 だからGR1 = 32768 と思ったのですが、先生の書いた答えは -32768 でした。 PGM START LD GR1,AA ADDL GR1,BB ST GR1,CC RET AA DC #7FFF BB DC 1 CC DS 1 END #7FFFに1加算するので GR1=#8000 だと思います。 また自分で書いた板書に Arithmetic[ -32768, 32767](#8000,#7FFF) Logical[0,65535](#0000,#FFFF) とありました。 板書をとったのがだいぶ前なのでこれの意味をよく覚えていないのですが、 ADDA命令のときに扱える値の範囲は-32768,~32767 ADDL命令のときに扱える値の範囲は0~65535 ということなのでしょうか。 その場合、先ほどの問題のADDAの問題で 32767 + 1 をしたら範囲を超えてしまいます。 このような場合どうなるのでしょうか? ADDLの場合も範囲を超えてしまったらどうなるのですか? よろしくお願いします。

  • サブルーチンでの加算

    CASLIIの課題で、 主プログラムで、連続したN語の領域に格納されているデータの先頭番地をサブルーチンに渡し、サブルーチンでデータを加算し、主プログラムのANS番地に格納するプログラムを作成しなさい。 という問題が出ました。 サブルーチンでの加算法がよくわかりません。 どなたかご教示ください。 MAIN     START LAD GR0,TBL ST GR0,PARA LAD GR1,1 LD GR0,N ST GR0,PARA,GR1 LAD GR1,PARA CALL  SUBR ST GR0,ANS RET TBL DC 1,2,3,4,5,6,7,8,9,10 N DC 10 PARA DS 2 ANS DS 1 END

  • CASLの問題が分かりません。

    資格の勉強のためCASLIIを勉強しているのですが、問題がわからなく質問します。 ●10進数1000を16ビットの2進数で表現した時、その値の中に1が何個含まれているかを求め、その結果をメモリに格納するプログラムを作成せよ。 SAMPL  START ; 1が立っている数 LAD GR1,0 LAD GR2,1 LOOP LD GR3,C1000 AND GR3,GR2 ;1が立っているか調べる JZE NEXT ;1が立っていない場合ジャンプ LAD GR1,1,GR1 ;1を加算 NEXT SLL GR2,1 ;1ビットを左にずらす JNZ LOOP ;繰り返し ST GR1,ANS RET C1000 DC 1000 ANS DS 1 END このプログラムでAND GR3,GR2 の部分からよくわからなく、コメントの「1が立っているか調べる」とありますが、1が立っているとはどういう意味なんでしょうか?それ以降から理解できなく、解説をお願いします。

  • CASLII LAD命令 解らない箇所があります。(初歩)

    下記問題について解らない箇所があるのですが、そのプロセスを教えて頂ければ幸いです。 宜しく御願いします。 アドレス8007番地の、GR1 が解りません。 シュミレータで確認すると、#0015 となりますが、そのプロセスを教えて下さい。 ------------------------------------------------ GR1とGR3を16進数でトレースしなさい。 OSHIETE  START   8000  LAD  GR1,A 8002  LAD  GR1,#800C 8004  LAD  GR3,V2 8006  LD  GR1,GR3 8007  LAD  GR1,A,GR3 8009  RET   800A  V2  DC  2 800B  A  DC  #1111 800C  B  DC  #2222 800D  C  DC  #3333       END ------------------------------------------------ オペランドを矢印表記にします↓ OSHIETE  START   8000  LAD  GR1←A        (GR1 = #800B)  (GR3 = #????) 8002  LAD  GR1←#800C      (GR1 = #800C)  (GR3 = #????) 8004  LAD  GR3←V2        (GR1 = #800C)  (GR3 = #800A) 8006  LD  GR1←GR3        (GR1 = #800A)  (GR3 = #800A) 8007  LAD  GR1←A + GR3      (GR1 = #0015)  (GR3 = #800A) 8009  RET   800A  V2  DC  2 800B  A  DC  #1111 800C  B  DC  #2222 800D  C  DC  #3333       END