アセンブリ言語で、最大公約数を求めるプログラムを

つくらなければならないんですが、

まぁ...だいたいできたんですが...ちょっとわからないトコが

ありまして...

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,

このQ&Aに関連する最新のQ&A

A 回答 (6件)

 補数とはですね、「与えられた数を、定められた数から引くことによって得られる数」という意味です。

定められた数には、基数のべき乗か、それより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種情報処理、あるいは基本情報処理試験用のテキスト(問題集ではない)に、たいていは解説されていると思いますので、一度足を運んでみてはいかがですか?
    • good
    • 0
この回答へのお礼

詳しい解説ありがとうございました。

この「補数」の本質はあまり理解することはできなかったものの、
定義はつかめたので、今後、詳しく習うかもしれないときの基盤となったと思います。

P.S.
>「与えられた数を、定められた数から引くことによって得られる数」
この定義にのっとって数でいろいろ遊んでたら、2進数において
全ビット反転させて、1足せば符号がかわると発見したんですかねぇ...

それとも、2進数において全ビット反転させて、1足せば符号がかわる、
ということから拡張してこの体系ができたんですかねぇ...

いずれにしても先人たちは数字遊びが好きですねぇ...

あっ、追伸かいててまたギモンが...
2の補数とかって、符合が変わるっていう有用性が明らかに存在するようですけど、
一般的な補数って何かの役に立ったりしているんですか?
余計な質問ですが、ヒマがあったらでいいので、おねがいします。

お礼日時:2001/06/03 15:04

>いずれにしても先人たちは数字遊びが好きですねぇ...


全くですよね。

>2の補数とかって、符合が変わるっていう有用性が明らかに存在するようですけど、
>一般的な補数って何かの役に立ったりしているんですか?
これは数学全般にいえることですよね。
実際に必要になってみないと、何言ってるのか分からない(笑)
公式暗記、問題のケース分け作業の繰り返しになっちゃう。

・・・というわけで、私も「補数」が何の役に立っているのか、2進数の符号反転という一面しか知らないんです。中途半端ですいません、、、(汗)
カテゴリを数学に移して、質問されてみてはいかがですか?
    • good
    • 0
この回答へのお礼

くだらない質問に付き合っていただき、ありがとうございました。

そうですね。

大事なことは、なんの役に立つのか、ではなく、どう役に立てるか、ということでしたね。
ちょっとウッカリしてると、何のためにベンキョウしてるのかすぐ忘れちゃいますね。
イカンイカン。

お礼日時:2001/06/05 20:50

> ビット反転さして、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をとってください)

「補数」の完全制覇は難しくても、これならだれでも覚えられますよね。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございました。

みなさんのおかげで、最大公約数を求めるプログラムはメデタク完成したわけなんですが...

ところで、ちょっと気になったのですが、補数、とはいったい何なんですか?
そういえば、昔、センセがチラッと口にしたことがあったような気がします。
そのときはタシカ...
「全ビット反転させたモノが1の補数、それに1加えたものが2の補数。」
とだけ言って後は何も言いませんでした。補数の本質って何ですか?
どういう意味が込められているのですか?

かなりオクワシソウナ印象を受けたので、
よかったら教えてくださるとありがたいでス。
(サワリだけでもいいんです。ちょっと気になってしまって...)

お礼日時:2001/06/01 22:27

アセンブラによりますが、そのものズバリNEGって命令があったりしませんか?


符号反転命令です。
まっとうなアセンブラなら持ってる命令ですが…。
仮想アセンブラなハズしてます。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

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

お礼日時:2001/05/30 00:34

NOT命令が一番ですが次の手としてEORも使えます。


オール1とEORをとれば全ビット反転するはずです。EORは排他的論理和です。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございました。

ところで、オール1とは、いったい何ですか?

お礼日時:2001/05/30 00:29

NOT演算で反転できます。


ここはx86の例。

MOVAL, 3H
NOTAL

 3Hは00000011なのでNOTを実行すると11111100つまり-4。
 あとは1を足せば-3になりますね。
    • good
    • 0
この回答へのお礼

そうでしたか、NOTで反転できたんですか。
さっそく明日、ガッコで試してみます。

それでは。ありがとうございました。

お礼日時:2001/05/30 00:24

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qコード変換(漢字)のサンプルプログラム

始めまして!
困っています、御力添えをお願いします。
UNIX(SouOS5.8)でのコード変換(SJIS→EUC、EUC→SJIS)のコーディング(サンプルソース:C言語)をどなたか教えて頂けないでしょうか?
お願いします。

Aベストアンサー

下記URL参照。

参考URL:http://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/kanjicod.html

Q素数を求めるプログラム(アセンブリ言語)

アセンブリ言語で素数を求めるプログラムを作っているのですが、どうしても内容が理解できなくて困っています。
難しいのは、多分理解できないので、できるだけ簡単なプログラムソースを書いて頂けないでしょうか?
または、それがあるページを教えてください。

Aベストアンサー

C言語でとりあえず素数のアルゴリズムを起こし(Webに豊富なサンプルがあると思います)ASM形式に移植する方法はどうでしょうか?

○まずは簡単なASMサンプルをアセンブル(Cで言うところのコンパイル)して実行できる一連の手順を憶える。

○ASMの作法を学ぶ。2,16進数の理解、CPUのレジスター構成、ニーモニック(命令)、スタックの仕組み(PUSH&POP)、PC(プログラムカウンター)の仕組みなど。

*:プログラムはどれでも(どの言語も?)似たような構造をもっています。プログラムの最小に分けると「代入」「比較」「繰り返し」の構造が見えてくると思います。

参考URL:http://www.arch.cs.kumamoto-u.ac.jp/project/kite/kiteasm/

Qまったくの初心者ですが、独学でプログラムを学びたい。

 パソコン中級者でプログラム初心者です。
 独学でプログラムを学びたいんですが、どうやったら独学で学べますか?

Aベストアンサー

一通りは自分のレベルにあった本で学習して下さい。これで基礎ができます。なんでもそうですが、基礎が大事です。全てを理解する必要はありません。あ~、こういうことがあるんだという目次を自分の頭の中につくるぐらいで良いです。全てを完全に覚えて、使いこなすなんて無理な話です。

その後、自分が作りたいと思うプログラムに挑戦して下さい。いきなりきっちりしたものを作るのではなく、簡易型のようなものと割り切ってかまいません。作成は、先に本を読んで自分の頭に作った目次から、ここを読めばできそうだというところ見つけながら開発します。欲が出てきて、ここはこうしたいと思うはずです。その時は、ネットなりで捜したり、質問したりして解決していきます。

作りながら、調べながら、上達していきます。妥協せずにがんばってみることも大事です。実現できないことでも、その理由を自分で納得することは大きな前進です。

一番の上達の早道は優秀なソースをたくさん読むことです。ソース全部ではなくても、実装に必要な部分のソースは、掲示板などに書かれていることがたくさんあります。
私も、あ~、こういう書き方があるんだって、勉強になることがありますよ。

以上、押し付けがましいようですが、がんばって下さい。

一通りは自分のレベルにあった本で学習して下さい。これで基礎ができます。なんでもそうですが、基礎が大事です。全てを理解する必要はありません。あ~、こういうことがあるんだという目次を自分の頭の中につくるぐらいで良いです。全てを完全に覚えて、使いこなすなんて無理な話です。

その後、自分が作りたいと思うプログラムに挑戦して下さい。いきなりきっちりしたものを作るのではなく、簡易型のようなものと割り切ってかまいません。作成は、先に本を読んで自分の頭に作った目次から、ここを読めばでき...続きを読む

Q最大公約数を再帰で求める(pascal)

入力した整数値の最大公約数を出力するプログラムを再帰呼び出しの形式で作れ、という課題が出ました。
再帰でない形式は下のように作れたのですが、再帰形式がどうしてもできません。どなたかご教授ください。

function gcd(a,b:integer):integer; {関数部}
var tmp:integer;
begin
if a<b then
begin
tmp:=b;
b:=a;
a:=tmp
end;
repeat
tmp:=b;
b:=a mod b;
a:=tmp
until b=0;
gcd:=a
end;

repeat {計算部、i=n=入力した個数、max=入力できる最大数}
i:=i+1;
n:=n+1;
data[i]:=x;
writeln('値:');
readln(x);
until (x=0) or (i=max);
if i>=2 then
begin
p:=gcd(data[1],data[2]);
if i>=3 then
begin
for i:= 3 to n do
begin
p:=gcd(p,data[i])
end;
writeln('最大公約数:',p)
end
else
begin
writeln('最大公約数:',p)
end;

入力した整数値の最大公約数を出力するプログラムを再帰呼び出しの形式で作れ、という課題が出ました。
再帰でない形式は下のように作れたのですが、再帰形式がどうしてもできません。どなたかご教授ください。

function gcd(a,b:integer):integer; {関数部}
var tmp:integer;
begin
if a<b then
begin
tmp:=b;
b:=a;
a:=tmp
end;
repeat
tmp:=b;
b:=a mod b;
a:=tmp
until b=0;
gcd:=a
end;

repeat {計算部、i=n=入力した個数、max=入力できる最大数}
i:=i+1;
n:=n+1...続きを読む

Aベストアンサー

gcd の再帰的な定義を素直にプログラムにすれば, そのまま再帰的な関数になります.

Qおすすめのプログラム開発の入門書を教えてください。

おすすめのプログラム開発の入門書を教えてください。

私はC++でWindows環境で動くパッケージソフトの開発をしています。
今までプログラマとして働いてきましたが、自ら望んでこの職種についたわけではなかったこと、元々文系でパソコンに苦手意識もあり、プログラムがあまり好きではありません。
転職を考えたりもしたのですが、プログラム開発の表面しか知らずに好きじゃないと決めつけていたことに気づき、プログラム開発というものを勉強して、プログラム開発を知り、好きになっていきたいと思っています。

言語の入門書ではなく、プログラム開発の入門書を探しています。
ネットワークやデータベースなど、専門的な部分を除き、要件定義、設計、プログラム、テストなど、プログラム開発全体の入門書はないでしょうか?

今まで受け身だった自分を変えたいと思っています。
よろしくお願いします。

Aベストアンサー

あまりソフトウェア開発に関する書籍を読んだ事がないのであれば、下記の3つ辺りがおすすめです。

■ コードコンプリート
http://www.amazon.co.jp/dp/489100455X

筆者の言うコードコンストラクション(詳細設計から結合テスト辺り)の解説書。変数の命名に関する議論からデバッグ、リファクタリング、チューニング、コメントなどまで幅広く扱っています。特定のプログラム言語に依存しない原則・技術を、非常に基礎的な部分から学べる数少ない書籍です。


■ 達人プログラマ
http://www.amazon.co.jp/dp/4894712741

要件定義からプログラミングまで幅広い話題を扱っています。具体的なコードや手法に言及している部分も有りますが、原則・心得的なことが中心です。


■ プログラムはなぜ動くのか
http://www.amazon.co.jp/dp/4822281019

コンピュータがプログラムを動かすときに起こっていることを、分かりやすく解説しています。


■ 珠玉のプログラミング
http://www.amazon.co.jp/dp/4894712369

プログラムのアルゴリズムやテクニックを分かりやすく楽しめるように紹介した読み物です。

あまりソフトウェア開発に関する書籍を読んだ事がないのであれば、下記の3つ辺りがおすすめです。

■ コードコンプリート
http://www.amazon.co.jp/dp/489100455X

筆者の言うコードコンストラクション(詳細設計から結合テスト辺り)の解説書。変数の命名に関する議論からデバッグ、リファクタリング、チューニング、コメントなどまで幅広く扱っています。特定のプログラム言語に依存しない原則・技術を、非常に基礎的な部分から学べる数少ない書籍です。


■ 達人プログラマ
http://www.amazon.co.jp/dp/489471274...続きを読む

Qアセンブリ言語プログラムの課題

先日アセンブリ言語プログラムについての課題が出て、プログラムコードを書くことはできたのですが、「考察」の欄で詰まっています。
ここの過去の質問(http://oshiete1.goo.ne.jp/qa3089577.html)も見てみたのですがよく分かりません。

どのようなことを書けばいいのでしょうか?
「高級言語と違う点」とかでしょうか・・・。

Aベストアンサー

素直に考えたら「この課題をこうプログラムした理由」とか、
そのプログラム自体の解説とかじゃないかと。
たとえば、「●の部分はこういうアルゴリズムを用いて~」とか
アセンブラなので、そういうのがないとプログラミングの意図を伝えることは難しいでしょうし。

>「高級言語と違う点」とかでしょうか・・・。
授業の流れで「高級言語→アセンブリ」というながれがあってその上での課題であれば(たとえば以前同じ課題を別言語でやったとか)そういう視点は必要だとは思いますが、そうでないなら入らないんじゃないかと。

QWEBサイトを作る副業は可能ですか?

4月から社会人の男です。
お金を貯めたいので、土日祝日に家で出来る副業をしたいです。

副業に拘りはありませんが、どうせなら今まで学生のうちに培った技術を生かせたらいいなと思いました。

PHP、jQueryなどのプログラムやWEBデザインが出来ます。
アドバイスお願い致します。

Aベストアンサー

>どうせなら今まで学生のうちに培った技術を生かせたらいいなと思いました。
>PHP、jQueryなどのプログラムやWEBデザインが出来ます。
学生レベルのプログラマの知識なんて社会人レベルだと役立たない。
というかノウハウがなさ過ぎる。
まぁ定番はセキュリティー関係の処理でしょう。
PHPできます。JQueryできますって言うのはその言語だけの知識だよね?
まともなセキュリティーレベルの知識と対処法は知っているのかな?
#2の人も言っているけどそこで品質管理の問題が発生する。
動く物は作れるのは当たり前。
でも品質管理で通る物を作れるのはまた別の話。

Qc言語のプログラムをアセンブリに変換する質問です

c言語のプログラムをアセンブリに変換する質問です

http://www5.si.gunma-u.ac.jp/sado/compiler/ex08/ex5.pdf

上記のアドレスの5番の問題です

私が考えたコードがこれなのですが正解がないので

あっているかどうか心配です

実行環境がある方、もしくはアセンブリコードに

詳しい方チェックをお願いします

load r4 , #0 ## d = 0
load r1 , a ## r1 = a
load r3 , c ## r3 = c
cmp r1 , r4 ## a > d → a > 0 
jg Label ## a > 0 でないならLabelに分岐
mul r1 , r3 , r2 ## b = a * c;
sub r1 , r3 , r4 ## d = a - c
jmp Label2 ## Label2へ分岐
Label : mul r1 , r3 , r4 ## d = a * c
sub r4 , r1 , r2 ## b = a * c - a
add r1 , r3 , r4 ## d = a + c = d
Label2 : mul r2 , r4 , r1 ## a = b * d

c言語のプログラムをアセンブリに変換する質問です

http://www5.si.gunma-u.ac.jp/sado/compiler/ex08/ex5.pdf

上記のアドレスの5番の問題です

私が考えたコードがこれなのですが正解がないので

あっているかどうか心配です

実行環境がある方、もしくはアセンブリコードに

詳しい方チェックをお願いします

load r4 , #0 ## d = 0
load r1 , a ## r1 = a
load r3 , c ## r3 = c
cmp r1 , r4 ## a > d → a > 0 
jg Label #...続きを読む

Aベストアンサー

・条件分岐が逆
・演算結果をstoreしていない (その必要があるか否か設問からは分からない)

Qこれって、動的プログラムになるんでしょうか?検索ロボットの邪魔ですか?

ホームページをGoogle等、ロボット型の検索サイトが巡回して、検索サイトに登録されていくケースがある。という話を聞いたのですが、この場合、ホームページ内に動的プログラムが挿入されている場合、CGIやJavaの事だと思うのですが(その辺は詳しくないのですが)やはり、ランキング投票用のプログラム等が挿入されているページも動的ページに含まれて、ロボット型検索サイトの巡回の障害になってしまい、ロボットに巡回してもらいたい場合、不利になるのでしょうか?
ちなみにランキング登録用のプログラムはこんな感じです。
<a href="http://www.***.jp/***/***.cgi?id=***" target="_blank"> ***</a>
たぶん、登録しているサイトのCGIにアクセス?するためのリンクのようなので問題無さそうですが、確信がもてないので、説明頂けるとありがたいです。

Aベストアンサー

この場合、迷惑を被るのはスパイダー(ロボット)のほうではなく、ランキング集計プログラムのほうかと思います。
ロボットのほうは勝手に情報収集しているのですから、どんな情報を食わされてどのような動作をしようがwebmasterは道義的責任を感じる必要すらありません。

問題はランキングサイトの集計プログラムほうです。
ロボットのアクセスはそれが本当の投票ではないので、単純に投票を全件集計していたら『カラ票』というゴミが混入してしまいます。
とはいうものの、これも実は道義的にはランキングサイト側が対策すべきです。ランキング投票の水増しや妨害しようとする輩は必ず居るわけで、ランキングサイトが信用されるためには、その精度を上げるために何かしらの対策やルールを作っているはずです。その対策をする中で、技術的により簡単なロボット対策は、ロボットの投票を好ましくないと考えているのであれば盛り込んでいると思います。

ということでまとめると『気にしなくてよい』が結論になるかと思います。

Qアセンブリ言語とC言語

アセンブリ言語とC言語について調べているのですが、この二つ言語のプログラムについて実質的に同じと言えることはなんでしょうか?
また異なっていることはなんでしょうか?(たとえばアセンブリは低級言語であり、C言語は高級言語であるなどなんでもいいです。)
是非解答お願いします。

Aベストアンサー

共通点
オペレーティングシステム記述言語
必然的にしていた(いる)言語 アセンブリ言語
UNIXオペレーティングシステム用に考案された記述言語 C言語

(最も)違うところ
移植性 ポータピリティ
例えば hello world プログラム。オープン系では、ほとんどリコンパイル一発。
アセンブリ言語の場合、同じ機能を作るには、OS毎、cpu毎に書き直さないといけない。

専門的な話題になると、ITRONというOSの場合、
アセンブリ言語で書いてるものはCPU別にものが違う。
一方、C言語で書かれたITRONは、クロスプラットフォーム
になっているものが多い。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報