• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:アセンブリ言語について。)

アセンブリ言語とは?

A1200hd40の回答

  • A1200hd40
  • ベストアンサー率52% (337/648)
回答No.2

言語と云うと、ピンと来ないかも知れませんね。 16ビットの演算器が有るとすると、そこには16個のスイッチが並んでいます。 各スイッチのon/offが、各ビットの0/1なのです。 その状態は言語と云うより、一度に受け付けうる「状態」に過ぎません。 その状態の組み合わせを、「順次」処理して行くのが演算装置です。 引数持ち命令の状態を受け付けると、規定の引数の受付状態になり、組み合わせての動作が発生します。 予め取り決めた規則に則って、コードを一括翻訳/変換(コンパイル)するのがコンパイラ。 ココで云う、変換規則が、いわゆる高級言語。 CやFortran、RubyにPerlなんかが知られてますね。 インタープリタ言語は、その手順が逐次的処理で、同時通訳的なモノをイメージすると良いでしょう。 かつてのBasicやphp言語なんかが当てはまります。 アセンブリ:組み立て部品 それで、演算器の「仕様書・命令表に定義されている規則」に従い、命令の列を組み上げていく(アセンブル)のが、アセンブラ。 それぞれの機械の仕様によって、その動作の仕組みが異なるため、共通性に欠け、それぞれについて覚えていくワケにも行きませんから、仕様書・命令表上の「各動作に簡単な単語を割り当てたモノ」がニモニック。 ニモニックを入力して、「組み上げていく」からアセンブラ。 ニモニックなら、同じ動作の場合、ほぼ同じように書けて、理解がし易くなります。(ま、レジスタやら、固有命令やらなんやらの仕様はそれぞれなんで、そこまでですが。) >なぜ、低水準言語というのが存在しているのでしょうか? コレが、素の機械(語?)データなら、入力する数値自体が違って来ますので、双方の仕様書・命令表と突き合わせてコードを記述していかなければなりません。 と云う事は、汎用性が無く、知識の伝達や応用が困難になります。 >なぜ、機械語データは、0と 1だけではないのでしょうか? ヒント:文字数。 $0xは、16進数の接頭辞のようなモノです。 その昔は&hとか云ってました。 確かに、ビットのon/offの列は、例えば0101010110101010と、なるでしょうけれども、場所取りすぎますよね? 16進数にしてしまえば、コンパクトに表現できます。 16bitも4桁の16進数で表現できますから。 ちなみに前述の値は、55AAです。 どうでもイイ事では有りますが、KolibriOSやMenuetOSなんて、アセンブラで組まれたOSも在ったりしますね。 動作が軽く、サイズが小さい事が「売り」のようです。

zasx1098
質問者

補足

No.1の方の回答で、機械語データが、0と1だけではないのはなぜでしょうか?教えていただけないでしょうか?すみません。

関連するQ&A

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

    (機械語データ) (アセンブリ言語) 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 で、右側のアセンブリ言語のニーモニックとオペランドについて解説していただけないでしょうか?すみません。

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

    >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だけではないのでしょうか?教えていただけないでしょうか?すみません。

  • アセンブリのプログラムです。

    アセンブリのプログラムで質問があります。cのプログラムのオブジェクトファイルを生成して、objdumpというコマンドでアセンブリ言語を表示させてみたのですが、全然分からなくて、困っています 。どうか、アセンブリプログラムの、解説をよろしくお願いします。できれば、1文1文解説してもらえるとありがたいです。あと、スタックの動き、確保などの解説もあるとありがたいです。よろしくお願いします。 cのプログラム int fact(int p) { if(p<=1) return 1; else return fact(p-1); } アセンブリのプログラム push %ebp mov %esp,%ebp sub $0x8,%esp cmpl $0x1,0x8(%ebp) jg 15 <_fact+0x15> movl $0x1,-0x4(%ebp) jmp 24 <_fact+0x24> mov 0x8(%ebp),%eax dec %eax mov %eax,(%esp) call 0 <_fact> mov %eax,-0x4(%ebp) mov -0x4(%ebp),%eax leave ret nop nop nop

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

    つまり、0と1とmovやaddなどが対応しているのが、ニーモニックであり、ニーモニックの集まりがアセンブリ言語という事でしょうか?教えていただけないでしょうか?すみません。

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

    (機械語データ) (アセンブリ言語) 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 こちらのアセンブリ言語の命令がわかるおすすめの書籍を知らないでしょうか? 教えていただけないでしょうか?すみません。

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

    これが何をしているのか教えていただけないでしょうか?すみません。 これの事です。 (機械語データ) (アセンブリ言語) 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

  • アセンブリの基本ですが分からないので教えてください

    mov %esp, %ebp と movl $0x80484ee, (%esp) という二つの命令があります。 1番目のは「espレジスタに入っている値をebpレジスタにコピー」 2番目のは「0x80484eeをespレジスタに入っている値(アドレス)にコピー」 これで合ってますでしょうか?

  • コンパイラ、ELF形式のアセンブリ言語

    コンパイラの授業で、課題がでたのですが、全然分からなくて、困っています。どうか、解答、解説をよろしくお願いします。問題は以下です。 オブジェクト・プログラムを出力するコンパイラで、以下のプログラムをコンパイルしてみて、その入り口処理、出口処理の内容と、スタック・フレームの構成され方を調べなさい。 int fact(int p) { if(p<=1) return 1; else return fact(p-1); } 自分で一応、以下のようにオブジェクト・プログラムを出力してみました。 $ objdump -d a.o a.o: file format pe-i386 Disassembly of section .text: 00000000 <_fact>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 ec 08 sub $0x8,%esp 6: 83 7d 08 01 cmpl $0x1,0x8(%ebp) a: 7f 09 jg 15 <_fact+0x15> c: c7 45 fc 01 00 00 00 movl $0x1,-0x4(%ebp) 13: eb 0f jmp 24 <_fact+0x24> 15: 8b 45 08 mov 0x8(%ebp),%eax 18: 48 dec %eax 19: 89 04 24 mov %eax,(%esp) 1c: e8 df ff ff ff call 0 <_fact> 21: 89 45 fc mov %eax,-0x4(%ebp) 24: 8b 45 fc mov -0x4(%ebp),%eax 27: c9 leave 28: c3 ret 29: 90 nop 2a: 90 nop 2b: 90 nop アセンブリの知識は、少しはあるのですが、入り口処理、出口処理の内容と、スタック・フレームの構成され方が全然分からないです。どうか、解答、解説をよろしくお願いします。

  • アセンブリ言語の宿題がわかりません。

    爆弾を解除するプログラムです。exeファイルしか与えられていません。 phase1から5まであり、それぞれにインプットを求められ、正しいインプット(解除コード)を入力すると解除できます。 間違ったコードを入力すると爆発してしまいます。1,2は解けましたが、3で躓きました。objdumpしてみて、あるstring(恐らくglobal定数)と同じインプットをすれば解除できると踏んだのですが、どうしてもその特定のstringがわかりません。 以下にobjdumpした内の一部を載せておきました。都合上最小限のコードだけ載せざるを得ませんでしたので、 下記URLに、exeファイル、逆アセンブルファイル、phase1,2のanswerをアップロードしております。お時間があれば是非ご協力をお願いします。 環境 OS:ubuntu 9.04 デバッガ:Gnu DeBugger 08048424 <_IO_getc@plt>: 8048424: ff 25 10 a0 04 08 jmp *0x804a010 804842a: 68 20 00 00 00 push $0x20 804842f: e9 a0 ff ff ff jmp 80483d4 <_init+0x18> 08048723 <phase_3_of_5>: 8048723: 55 push %ebp 8048724: 89 e5 mov %esp,%ebp 8048726: 57 push %edi 8048727: 56 push %esi 8048728: 53 push %ebx 8048729: 83 ec 1c sub $0x1c,%esp 804872c: a1 30 a0 04 08 mov 0x804a030,%eax 8048731: 89 04 24 mov %eax,(%esp) 8048734: e8 eb fc ff ff call 8048424 <_IO_getc@plt> 8048739: bb 00 00 00 00 mov $0x0,%ebx 804873e: 8d 75 e6 lea -0x1a(%ebp),%esi 8048741: eb 04 jmp 8048747 <phase_3_of_5+0x24> 8048743: 88 44 33 ff mov %al,-0x1(%ebx,%esi,1) 8048747: a1 30 a0 04 08 mov 0x804a030,%eax 804874c: 89 04 24 mov %eax,(%esp) 804874f: e8 d0 fc ff ff call 8048424 <_IO_getc@plt> 8048754: 83 f8 0a cmp $0xa,%eax 8048757: 74 06 je 804875f <phase_3_of_5+0x3c> 8048759: 43 inc %ebx 804875a: 83 fb 0f cmp $0xf,%ebx 804875d: 75 e4 jne 8048743 <phase_3_of_5+0x20> 804875f: c6 45 f3 00 movb $0x0,-0xd(%ebp) 8048763: 8d 75 e6 lea -0x1a(%ebp),%esi 8048766: bf e4 8b 04 08 mov $0x8048be4,%edi 804876b: b9 0d 00 00 00 mov $0xd,%ecx 8048770: fc cld 8048771: f3 a6 repz cmpsb %es:(%edi),%ds:(%esi) 8048773: 0f 97 c2 seta %dl 8048776: 0f 92 c0 setb %al 8048779: 38 c2 cmp %al,%dl 804877b: 74 0c je 8048789 <phase_3_of_5+0x66> 804877d: c7 04 24 03 00 00 00 movl $0x3,(%esp) 8048784: e8 31 fe ff ff call 80485ba <explode> 8048789: 83 c4 1c add $0x1c,%esp 804878c: 5b pop %ebx 804878d: 5e pop %esi 804878e: 5f pop %edi 804878f: 5d pop %ebp 8048790: c3 ret

  • アセンブリ言語は原始プログラムですか?

    質問(1) アセンブリ言語というのは、 add $S1, $S2 みたいなやつですよね? wikipediaで「ソースコード(ソースプログラム、原始プログラム)」の注釈1,2を読むと、 注1:【機械語の命令に記述するアセンブリ言語(アセンブラ)が存在するが、このアセンブラ用の文字列で記述されたプログラムはソースコードとは呼ばれないのが普通である。】 注2:【アセンブリ言語で書かれたプログラムはソースコードと呼ばれない】 と書かれてあります。 でも、 他の教材では アセンブリ言語で書かれたプログラム(原始プログラム) と書かれています。 どっちが正しいのでしょうか? 質問(2) 目的プログラム(オブジェクトプログラム)とは、 IT用語辞典によると 【オブジェクトプログラムとは、ソースプログラム(人間が認識できるプログラム言語で高水準言語など?)をコンパイラで機械語に翻訳したプログラムのことである】 とありますが、 ソースプログラムをコンパイラで翻訳するとアセンブリ言語になるんではないのですか? そのアセンブリ言語をアセンブラで翻訳して機械語になるのではないのでしょうか? どなたかご教授ください。 お願いします。