• ベストアンサー

アセンブリ言語の質問のコト

アセンブリ言語で、最大公約数を求めるプログラムを つくらなければならないんですが、 まぁ...だいたいできたんですが...ちょっとわからないトコが ありまして... acc(アキュムレータ)にはいってるデータが、負のバアイに、 それを正にかえたいんですが、どうしたらいいんでしょう? ビット反転さして、1足したらいいんじゃないか、ってのを思いついたんですが、 (これもあってるのかどうか自信ないんですけど...) ナンカ、反転さす命令がないみたいで...がっくシ... ということで、だれかお力ゾエをおねがい致しまス。 必要かどうかワカリマセンが、とりあえず、 ちょっとだけ命令を以下に挙げておきます。 (たしか、アセンブリ言語って、それぞれ違うっていっても、どれも結構  似てるんですよね...ぼくの頼りない知識がタシカなら...) ADD,SUB,INC,DEC,OR,EOR,AND,NOT, LSL,ASL,LSR,ASR,ROL,ROR,SWP JP,JPc,JPz,JPs,JPv,JP,JP,Call,Ret,

noname#4530
noname#4530

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.5

 補数とはですね、「与えられた数を、定められた数から引くことによって得られる数」という意味です。定められた数には、基数のべき乗か、それより1少ない値を使います。 ※以下、与えられた数をA、Aの基数をn、Aの桁数をkとします。 ※以下、aのb乗を、a^bと表します。 ※以下、n進数のAという表現を、A(n)と表します。   基数のべき乗を使って求めた補数を、「基数の補数」といいます。    Aの基数の補数は、n^k-A   基数のべき乗-1を使って求めた補数を、「基数-1の補数(減基数の補数)」といいます。    Aの減基数の補数は、(n^k-1)-A 具体的な例を挙げてみます。 1)300(10)の10の補数(基数の補数)  n=10 k=3 なので   10^3 - 300 = 1000 - 300 = 700 2)300(10)の9の補数(減基数の補数)   10^3-1 - 300 = 999 - 300 = 699 3)01001101(2)の2の補数  (10進数に直すと77)  n=2 k=8 なので   2^8 - 01001101 = 100000000 - 01001101 = 10110011   (1BYTEの符号付き10進数に直すと-77) 4)01001101(2)の1の補数   2^8-1 - 01001101 = 11111111 - 01001101 = 10110010   (1BYTEの符号付き10進数に直すと-78) ざっとなので、あまり伝わらないかもしれません。 第2種情報処理、あるいは基本情報処理試験用のテキスト(問題集ではない)に、たいていは解説されていると思いますので、一度足を運んでみてはいかがですか?

noname#4530
質問者

お礼

詳しい解説ありがとうございました。 この「補数」の本質はあまり理解することはできなかったものの、 定義はつかめたので、今後、詳しく習うかもしれないときの基盤となったと思います。 P.S. >「与えられた数を、定められた数から引くことによって得られる数」 この定義にのっとって数でいろいろ遊んでたら、2進数において 全ビット反転させて、1足せば符号がかわると発見したんですかねぇ... それとも、2進数において全ビット反転させて、1足せば符号がかわる、 ということから拡張してこの体系ができたんですかねぇ... いずれにしても先人たちは数字遊びが好きですねぇ... あっ、追伸かいててまたギモンが... 2の補数とかって、符合が変わるっていう有用性が明らかに存在するようですけど、 一般的な補数って何かの役に立ったりしているんですか? 余計な質問ですが、ヒマがあったらでいいので、おねがいします。

その他の回答 (5)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.6

>いずれにしても先人たちは数字遊びが好きですねぇ... 全くですよね。 >2の補数とかって、符合が変わるっていう有用性が明らかに存在するようですけど、 >一般的な補数って何かの役に立ったりしているんですか? これは数学全般にいえることですよね。 実際に必要になってみないと、何言ってるのか分からない(笑) 公式暗記、問題のケース分け作業の繰り返しになっちゃう。 ・・・というわけで、私も「補数」が何の役に立っているのか、2進数の符号反転という一面しか知らないんです。中途半端ですいません、、、(汗) カテゴリを数学に移して、質問されてみてはいかがですか?

noname#4530
質問者

お礼

くだらない質問に付き合っていただき、ありがとうございました。 そうですね。 大事なことは、なんの役に立つのか、ではなく、どう役に立てるか、ということでしたね。 ちょっとウッカリしてると、何のためにベンキョウしてるのかすぐ忘れちゃいますね。 イカンイカン。

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.4

> ビット反転さして、1足したらいいんじゃないか すごいですね。まさしくその通りです! ある数Aの2の補数を求めると、それが-Aになるのです。 ただ2の補数を求めるには、本当は「補数」をよく理解しておく必要があるのですが、これが結構覚え難いので、みな簡単な方法を使うのです。 それが「全ビット反転+1」なんです。 正確には「減基数の補数+1」という考え方に基づいた計算なのですが、2進数に限った場合、全ビットを反転させるだけで「減基数の補数」が求まります。 つまり、   NOT acc   INC acc でいいわけですね。 ymmasayanさんがおっしゃっていた、 > オール1とEORをとれば全ビット反転する のオール1とは、全ビットが1になった値、つまり-1のことです。 つまり、   EOR acc, -1   INC acc でもいい、というわけです。 (アセンブラによっては、いきなり-1とのEORをとれないものもあります。その場合、データレジスタに-1を転送して、EORをとってください) 「補数」の完全制覇は難しくても、これならだれでも覚えられますよね。

noname#4530
質問者

お礼

アドバイスありがとうございました。 みなさんのおかげで、最大公約数を求めるプログラムはメデタク完成したわけなんですが... ところで、ちょっと気になったのですが、補数、とはいったい何なんですか? そういえば、昔、センセがチラッと口にしたことがあったような気がします。 そのときはタシカ... 「全ビット反転させたモノが1の補数、それに1加えたものが2の補数。」 とだけ言って後は何も言いませんでした。補数の本質って何ですか? どういう意味が込められているのですか? かなりオクワシソウナ印象を受けたので、 よかったら教えてくださるとありがたいでス。 (サワリだけでもいいんです。ちょっと気になってしまって...)

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.3

アセンブラによりますが、そのものズバリNEGって命令があったりしませんか? 符号反転命令です。 まっとうなアセンブラなら持ってる命令ですが…。 仮想アセンブラなハズしてます。

noname#4530
質問者

お礼

回答ありがとうございました。 残念ながら、その命令はなかったです。 おもちゃのプロセッサ用のアセンブラなので... (※センセがおもちゃと言ってました。)

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

NOT命令が一番ですが次の手としてEORも使えます。 オール1とEORをとれば全ビット反転するはずです。EORは排他的論理和です。

noname#4530
質問者

お礼

アドバイスありがとうございました。 ところで、オール1とは、いったい何ですか?

noname#18951
noname#18951
回答No.1

NOT演算で反転できます。 ここはx86の例。 MOV AL, 3H NOT AL  3Hは00000011なのでNOTを実行すると11111100つまり-4。  あとは1を足せば-3になりますね。

noname#4530
質問者

お礼

そうでしたか、NOTで反転できたんですか。 さっそく明日、ガッコで試してみます。 それでは。ありがとうございました。

関連するQ&A

  • 機械語からアセンブリ言語への変換の仕方を教えてください

    CASLIIを学んでいるのですが、命令後の表(画像)を使って プログラムの一部 ADDA GR1,GR1 を手動で機械語 (16進)に変換すると、 2411 になるようなのですが、どのように変換するのでしょうか? ネットで調べてみたのですが”機械語の命令(変換)表で命令と語数を確認しながら,アセンブリ言語の表記にします。”と省略されていて詳しく解説してあるページが見つからなかったので、教えていただけませんか? ーーーーーーー 機械語の命令(変換)表 http://www.jitec.jp/1_13download/hani20061107.pdf (32 ページに機械語とアセンブリ言語の命令の対応表があります)

  • アセンブリ言語について。

    >2進数の羅列では人間にはあまりに読み書きしにくいからです。 >それを命令単位に区切って、英単語を元にした名前を与えたのが、 >アセンブリ言語です。 ニーモニックとは、その命令の名前の事です。 簡潔に要点がまとまっている、すばらしい説明ですね。その通りです。 これで理解できないなら、追加の説明のしようがありません。 (なお、このように、他人の発言は引用符を付けて引用すると、わかりやすくなります。是非そうしてください。) まあ具体例を挙げるならこんな感じ。 (機械語データ) (アセンブリ言語) b8 57 61 6b 61 mov $0x616b6157,%eax 53 push %ebx 50 push %eax ba 04 00 00 00 mov $0x4,%edx bb 01 00 00 00 mov $0x1,%ebx b8 04 00 00 00 mov $0x4,%eax 89 e1 mov %esp,%ecx cd 80 int $0x80 58 pop %eax 31 c0 xor %eax,%eax 5b pop %ebx c3 ret 人間がCPUを直接動かすプログラムを書こうとするとき、アセンブリ言語を使って書きます(右側の部分)。 mov $0x616b6157,%eax push %ebx push %eax mov $0x4,%edx mov $0x1,%ebx mov $0x4,%eax mov %esp,%ecx int $0x80 pop %eax xor %eax,%eax pop %ebx ret そしてこれをアセンブルすると、1対1対応した機械語のデータ列が出来ます。 それが b8 57 61 6b 61 53 50 ba 04 00 00 00 bb 01 00 00 00 b8 04 00 00 00 89 e1 cd 80 58 31 c0 5b c3 この部分。 機械語には改行なんてありませんから、実際は一連の b8 57 61 6b 61 53 50 ba 04 00 00 00 bb 01 00 00 00 b8 04 00 00 00 89 e1 cd 80 58 31 c0 5b c3 と言うデータ列になります。 これをCPUが実行していきます。 相当熟練した人で無ければ、このデータ列を見るだけでプログラム構造を理解する、というわけに行きません。 なので、人間が機械語レベルでプログラミングする際には、アセンブリ言語を使います。 ※この回答のプログラムはこちらから引用しました。 >31バイトでつくるアセンブラプログラミング アセンブラ短歌の世界 >https://book.mynavi.jp/support/pc/4946/c01_assembra.pdf で、機械語データは、なぜ、0と 1だけではないのでしょうか?教えていただけないでしょうか?すみません。

  • Z80について

    Z80のアセンブリ言語の命令でAレジスタの値を反転させるにはCPL命令を使えばいいんですが、その命令以外の命令を使ってAの値を反転させるにはどうすればいいでしょうか? どんな命令を使えばよろしいでしょうか?

  • PDP-11のアセンブラ課題

    学校の課題で出されたものです。 まだ勉強をはじめたばかりでどこから手をつけていいのかわかりません>< ○PDP-11のアセンブラは、MOV#1,R2を次のような2語の機械語に翻訳する。PDP-11は、これをど  のように解釈し、どのように実行するのか説明せよ 0001010111000010 0000000000000001 ○PDP-11のMOV命令を使用し、以下の命令のアセンブリ言語表現、機械語表現を示せ。 ・R5が示すアドレスにジャンプする命令 ・サブルーチンから戻る命令 ・R0をスタック上にプッシュする命令 ○次のプログラムをPDP-11のアセンブリ言語で作成せよ。 ・R0が示す番号以降のR2が示すバイト数をR1が示す番号以降に転送 ・R1(上位16ビット)R0(下位16ビット)が示す符号付32ビット値を符号反転 宜しくお願い致します。

  • アセンブリ言語の質問です

    「 100人分の試験点数がある。 一人分のデータは32bit 符号無し整数でそれが連続して格納されている.先頭のアドレスがEAXで与えられる時,全員の点数の合計をEAXに入れて戻るようなサブルーチンをアセンブリ言語で書きなさい。 • loop unrollingを使用して,ループ内容を4倍に展開して,条件分岐数を減らすこと • 他のレジスタの値は保存すること • 合計点はEAXレジスタに十分納まるものとする。 • 次のような命令を使ってよい。 ADD EAX, [EBX] 」 というような問題が出て自分で解答を作ってみたのですがこれでよいのでしょうか?詳しい方ご検討よろしくお願いいたします。 PUSH EBX(EBXをスタックにおいておく) PUSH ECX(ECXをスタックにおいておく) MOV ECX 25(ECXに25を代入。4回の操作を25回すれば100回になるからである。) label0:ADD EAX [EAX] ([EAX]をEAXに加算) ADD EAX [EAX+1]([EAX+1]をEAXに加算) ADD EAX [EAX+2]([EAX+2]をEAXに加算) ADD EAX [EAX+3]([EAX+3]をEAXに加算) MOV [EAX] [EAX+4]([EAX]を[EAX+4]に移動させる) EBX=EBX+1 (EBXはこのループを何回やったか、という数) CMP ECX EBX(25とEBXを比べる) JNZ:label0(比べてEBXが25になってないならば繰り返す。25になったら終了。) POP EBX(EBXをスタックから戻す) POP ECX(EBXをスタックから戻す)

  • アセンブリ言語について

    現在電気工学科の学生です。アセンブリ言語の講義を受けているんですが、試験で単位が取れる自信がありません。。。全くわからないことだらけです。C言語に関してはほんの触りだけ勉強したことがありますが、アセンブラ言語については全くの素人です。演習問題があるんですが、色々本等で探しても見つかりませんでした・・・私の努力不足かもしれませんが、問題の解答と解説を教えて欲しいです。 問題は→メモリアドレス3000H~30FFHの内容(データ)を2000Hから始まるメモリアドレスにコピー(格納)するプログラムをアセンブリ言語で書いてください!それとこの問題には参考のためにアセンブリ言語の命令の例があるんですが LD A、(BC) LD A、(DE) LD A、(HL) って書いてあるんですが、このBCやDE,HLはどんな意味があるんでしょうか?初歩的なことばかりで申し訳ありませんが、ご教授よろしくお願いします。

  • アセンブリ言語にて、

    アセンブリ言語にて、 「乗算Z←X×Yを、 ビットシフト(ROT命令ほか)で用いた計算手順と、 加算(ADD命令)の各長所、短所を比較しなさい」 という問題の答えがわかりません・・・ 教えていただけませんか?

  • アセンブリ言語について。

    以下のURLで、 https://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al … No.14のC 言語の write の仕様そのもので、第一引数はファイルディスクリプタですね。 (ファイルディスクリプタについては御自身で調べてみてください) 固定値として定義されているのは、標準ストリーム ファイルの  0 … 標準入力 (write では使われない)  1 … 標準出力  2 … 標準エラー出力 です。(3 以降は各プロセスでオープンされたファイルやソケットやデバイスを 指しており、固定値ではなくプロセス毎に異なる値となります。) 括弧の所がよくわかりません。教えていただけると幸いです。すみません。 ファイルディスクプリタとは、ファイルへの通り道につけられる番号でファイルを識別する目印のことでしょうか?プロセスとは処理のことでしょうか?詳しく教えていただけると幸いです。すみません。

  • アセンブリ言語について。

    アセンブリ言語の命令一覧を教えていただけないでしょうか?すみません。

  • アセンブリ言語について。

    アセンブリ言語と機械語は一対一で対応しているので、実行ファイルがあれば逆アセンブルすると 完全に元のアセンブリコードが復元できるのでしょうか?教えていただけないでしょうか?すみません。

専門家に質問してみよう