• ベストアンサー

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

アセンブリ言語で、最大公約数を求めるプログラムを つくらなければならないんですが、 まぁ...だいたいできたんですが...ちょっとわからないトコが ありまして... 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,

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

  • ベストアンサー
  • 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