- ベストアンサー
アセンブリ言語とは?
- アセンブリ言語とは、人間が機械語を直接扱うのではなく、命令単位に区切られた英単語を使用してプログラムを書くための言語です。
- アセンブリ言語を使うことで、機械語の直接書き込みでは理解しづらいプログラム構造を抽象化し、人間にとってより読み書きしやすくなります。
- アセンブリ言語は機械語に対応した1対1の命令を持ち、プログラムを機械語に変換することでCPUが実行できるようになります。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
>機械語データは、なぜ、0と 1だけではないのでしょうか? 実際は2進データであっても、「ヒト」にとっては「見づらい」ので16進数や8進数に変換して、圧縮表記します。 人間の目は機械のようにいきませんから、紛らわしい表記だと、普通に間違いが出ます。 64bitの2進データは、64文字使います。 64個の0/1を、きちんと順番を間違えずに記述するのは困難です。 (当たり前ですが、間違うと期待通りに動きません) 16bitなら4桁、32bitなら8桁、64bitなら16桁の16進で事足ります。 (ちなみに8bitで1Byteです) その昔は、雑誌に機械語ダンプリストが載ることも在ったのですよ。 マシン語モニタって、恐ろしく単純なプログラム使って打ち込んでくやつ。 こういう時にバイナリ(2進)表記だと、ページ数が相当ムダになりますよね。 それから0/1のビット列表記を入力することを考えてみてください。 そのうち目がチカチカしてきて、桁数数えるのにも疲れてしまい、頭もおかしくなってきます。 16進数は、0~9までの数字と、a~fまでのアルファベットで表現されます。 16進数の0fは10進数では15です。 16進の10は、10進では16です。 16進数等の表記に直すのは、「ヒト」のため、少しでも小さく表記して、なおかつ、間違わないようにするためです。
その他の回答 (8)
- ballville
- ベストアンサー率47% (233/487)
>相当熟練した人で無ければ、このデータ列を見るだけでプログラム構造を理解する、というわけに行きません 8ビットパソコン時代のキッズたちの多くは、普通にそういうことをやっていたんですが。 お小遣いでアセンブラを入手することは簡単ではないので、 ハンドアセンブルといって、方眼紙にニーモニックやオペランドを書き込んで、ニーモニック表と首っ引きで、人間アセンブラをやっていました。 そうこうするうちに、自然とニーモニックと機械語の対応を覚えたものです。
- chachaboxx
- ベストアンサー率23% (412/1777)
16進表記も2進表記も実行内容は同じです。 人が読みやすく理解しやすい表記に変換するだけのことであって、拘る本質はそこにはありません。 列挙された単純命令をいかに効率よく早く処理するかはどちらかというとコンパイラーの仕事になりますが、そもそもそんな処理が本当に必要なのかどうかは、人にしか判断できませんが、AIが進化すればそうでもないかもしれませんね。
- hahaha8635
- ベストアンサー率22% (800/3610)
スイッチ を 入れるか 入れないかです まず トランジスタ から始まります https://detail-infomation.com/bipolar-transistor/ 2種類あるのですが 理解しやすいNPN型だけ理解してください 3本あしがでていて Cにプラス-Eにマイナス につながっています 通常は電気が流れず ベースに電気を流すと C-E間に電気が流れます 電気を流していないとき を 0 電気を流しているとき を 1 とします それを組み合わせて 論理回路 というのが作られます http://www.gxk.jp/elec/musen/1ama/H14/html/H1404A08_.html A と B という信号を D という答えにして返す回路です これらをまた組み合わせて 加算器 https://ja.wikipedia.org/wiki/%E5%8A%A0%E7%AE%97%E5%99%A8 などの 四則計算機 や フリップフロップ https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%AA%E3%83%83%E3%83%97%E3%83%95%E3%83%AD%E3%83%83%E3%83%97 などの メモリが考え出されました 電気の流れで計算ができるようにしました 1ビット 一つの電気信号だけでは わかりにくいということで 4ビット1-10を表せる ものをひとまとまり にして 考え出され 4ビットに それぞれ 命令の意味を乗せ CPU4004になりました http://www.st.rim.or.jp/~nkomatsu/intel4bit/i4004.html やがてそれは 8008 8086 ・・・ となり 現在のCPUになります なので すべては電気を流しているか流していないをを クロックベースで処理していくので 0or1なのです
- _kappe_
- ベストアンサー率68% (1581/2304)
>機械語データは、なぜ、0と 1だけではないのでしょうか? 2進数とか16進数について調べてください。質問文に引用されている機械語データは16進数で書かれています。 2進数は数字の各桁を0と1の2種類だけで表します。10進数の5は2進数だと101、10進数の14は2進数だと1110です。 2進数だと桁数が大きくなって読みづらいので、代わりに16進数(各桁を0〜9とA〜Fの16種類で表す、アルファベット部分は大文字でも小文字でも意味は違わない)を使うことがよくあります。16は2の4乗であるため、16進数の1桁でちょうど2進数の4桁を表せるからです。たとえば10進数の154を2進数で表すと10011010の8桁ですが、これを4桁ずつに1001 1010と区切って16進数に直せば9Aの2桁になります。2進数と16進数の間の変換は16パターンを覚えればいいだけなので簡単です。 質問文に引用されている機械語データの最後にあるc3は2進数に書き直せば11000011です。
- t_ohta
- ベストアンサー率38% (5238/13705)
> で、機械語データは、なぜ、0と 1だけではないのでしょうか?教えていただけないでしょうか?すみません。 CPUは電気がONかOFFかの2つの状態の違いで動作しています。 その電気がONかOFFかを記録上人間が判りやすく表現するために0と1と表現したからです。 これを二進数と呼んでいます。 ↓これを読むとCPUの仕組みが理解できると思いますよ https://books.rakuten.co.jp/rb/1598842/
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>で、機械語データは、なぜ、0と 1だけではないのでしょうか? コンピュータ内部では「オフ」と「オン」、「ローレベル」と「ハイレベル」つまり「0」と「1」だけです。 例えば mov $0x616b6157,%eax は 1011100001010111011000010110101101100001 というオンとオフの羅列でメモリに記憶されます。 でも、0と1の羅列では「人間が見て判りにくい」ので、16進数で表記する事にしました。 人間が見て判りやすいくする為だけに、以下のように2進数4桁(4ビット)を16進数1桁で表したのです。 0000 ⇒ 0 0001 ⇒ 1 0010 ⇒ 2 0011 ⇒ 3 0100 ⇒ 4 0101 ⇒ 5 0110 ⇒ 6 0111 ⇒ 7 1000 ⇒ 8 1001 ⇒ 9 1010 ⇒ A 1011 ⇒ B 1100 ⇒ C 1101 ⇒ D 1110 ⇒ E 1111 ⇒ F そして、16進数2桁分、つまり「8ビット分」を「1バイト」とする事にしました。これも「人間が見て判りやすくする為」です。 なので 1011100001010111011000010110101101100001 というオンオフの羅列を、2進数として扱い、その2進数を16進数で表せば b8 57 61 6b 61 という5バイトになる訳です。 この「16進数で表記する」のは「人間が判りやすくするため」なので、コンピュータそのものには何の意味もありません。 では、何のために「人間が判りやすくするため」なのかと言うと、昔のコンピュータでは、アセンブラが生成した機械語コードを「人間が手作業でメモリに書き込みする必要があったから」です。 「人間が手作業でメモリに書き込みする」時に、2進数の羅列のままでは、1桁ズレたり、1桁見落としたり、ミスが増えます。 それに、0と1だけでは「紙に書いた時に、スペースを食い過ぎる」という理由もあります。 なので、ミスを減らすため「2進数8個分、つまり、16進数2桁分を、16進表記のままメモリに書き込む」ように工夫をしました。 その為、アセンブラでコード生成する時に「生成したコードを16進表記で併記する」ようになったのです。 生成したコードを直接にコンピュータのメモリに格納して、その場で実行するだけなら、16進表記でコードを表記する必要はありません。 表記するのは、あくまでも「人間が見て、判りやすくするため」です。コンピュータそのものにはまったく不必要なのです。 アセンブラも、高級言語も、16進数表記も、すべて「人間が見た時に、理解しやすいようにするため」なのです。 コンピュータ内部では、人間に理解しやすくする必要は無いので「オフとオンの羅列」だけで、何の問題もありません。 本当は、オフとオン、ローとハイの羅列だけで、何の問題もないのです。
- bardfish
- ベストアンサー率28% (5029/17766)
>機械語データは、なぜ、0と 1だけではないのでしょうか? 0と1だけですよ。 2進数って聞いたことありますか? 2進数だと人間が理解しやすい形式(文字のことですね)にしたときに長大な字数になってしまうので1桁の2進数をビットと呼ぶことにして、ビットをある程度まとめて8進数とか16進数に「置き換え」たものを使用しているのが一般的です。 複数桁の2進数を10進数や16進数に直す計算方法はちょっと調べればすぐ見つかるので説明は省きます。パソコンやスマホの電卓アプリの中には変換する機能が備わったものもあります。個人的には関数電卓の方が手軽で使いやすいです。 ついでに、文字コード(ANKとかASCIIコード、JISやS-JIS)も通常は16進表記が一般的です。2進数で表記されたら無駄に長ったらしくなってプログラムのコードとして埋め込む場合も無駄でミスしやすい。 と、ここまで書いていて気づいたのですが・・・ 2進数で表記するとミスしやすく、ミスが発覚してもミスした場所を見つけにくくなってしまうというのもありますね。 基本的には「人間の都合に合わせて変化してきた」のが理由だと思います。
- wormhole
- ベストアンサー率28% (1626/5665)
>機械語データは、なぜ、0と 1だけではないのでしょうか? 0と1だけですよ。 それを4こ、8こ、16こ、32こ、64ことまとめて扱って表現できる幅を増やしてるだけで。 ふだん扱ってる数字だって0~9の10個しかないけど、それを2こ、3こ組み合わせることで10とか100とか表現してるでしょ? と書きましたけど、今までの経緯から、あなたが正直理解できる気はしていません。 たぶん理解するには色々基礎知識が足りてないです。
補足
16bitなら4桁、32bitなら8桁、64bitなら16桁の16進で事足ります。 (ちなみに8bitで1Byteです) なぜ、こうなるのでしょうか?教えていただけないでしょうか?すみません。