ページ 11

アセンブラを学習したいのですが・・

Posted: 2015年3月30日(月) 08:30
by だすてぃん
こんにちは。
アセンブラを学習するなら、まずはC言語を学べって言ってる人がいたので
苦しんで覚えるC言語って本を買ってちょくちょく覚えていってるのですが、だいたいどこまでC言語を覚えれば
アセンブラを理解できますか?

Re: アセンブラを学習したいのですが・・

Posted: 2015年3月30日(月) 09:25
by usao
>アセンブラを学習するなら、まずはC言語を学べ

これが何故なのかがわからないのでなんとも言えません.
(個人的には,逆のパターンならなんとなくわかる感じというか…)

まず,この言葉の真意というか理由をきちんと聞いておいた方が良いのではないでしょうか.

Re: アセンブラを学習したいのですが・・

Posted: 2015年3月30日(月) 10:03
by nullptr
アセンブラから学べっていうのはおそらく、Cすら満足にできないならアセンブラは書けないからでしょう。

アセンブラを勉強するなら、まず学ぶアーキテクチャを決めて、互換性のないアセンブラを勉強する事になります。そうなると、メモリの扱い方などと同時に学ぶ事が増えて、初心者には難易度が高くなります。
Cで環境などに依存しない状態でメモリ操作などを学んだ上で、環境依存の内容に踏み込む方が難易度が低いと私は思います。

どの程度までとは言いますが、「一通り」でしょうか。アセンブラ目的なら標準ライブラリなどの勉強は不要ですから、ライブラリなどを使わないような内容の仕様を渡されたら、自力でそれを書ける、というような程度ではないかと思います。

Re: アセンブラを学習したいのですが・・

Posted: 2015年3月30日(月) 10:55
by V30
こんにちは。

上記のお二方と似通っておりますけれど…

あくまでも私個人的な考え方ですが、C言語の基本命令だけで迷いなく普通にゲーム等のプログラムが組める
ようになれば、アセンブラも容易に学習できると思います。

どんな言語でも最終的にはマシン語に変換されて実行ファイルになるので、マシン語の記述そのものであるアセ
ンブリ言語を先に覚えておけば、後で一般的なプログラミング言語を学習する時に大いに役立つと思います。
つまりは、どうせ覚えるんだったら先にやった方が後から覚えるより効率がいいかも?って事です。

実行ファイルの中身は、メモリ間のデータ転送・2つのデータの演算や比較・実行位置のシフト等、CPUができ
る極限られた種類の命令のみで構成されています。
他の言語より覚える命令が遥かに少ない反面、CPU以外のデバイスについての知識が必要になるので、一筋縄
では行けないのも覚悟しなければなりません。

アセンブラは覚えてしまえばPC以外の機械制御等にも応用できるので、スキルアップにぜひ身に付けたい物で
もありますね。

CやBASICその他の昔からある言語は、CPUの命令に1対1だなぁと、過去から現在までつくづく思います。

Re: アセンブラを学習したいのですが・・

Posted: 2015年3月30日(月) 21:11
by だすてぃん
回答ありがとうございます(´Д`)
今勉強してることがアセンブラの勉強に意味ないのではないか?とも思っていたので
意味はあるということで安心しました
先は長いですがこの本をマスターしてからアセンブラ頑張りたいと思います

Re: アセンブラを学習したいのですが・・

Posted: 2015年3月31日(火) 00:59
by あごみつ
まず、アセンブラというのはアセンブリのコンパイラという意味です

それから、アセンブリというのはCPUローカルな命令セットで記述するプログラミング言語ですので、最初はx86などで学習すれば、命令のリファレンスさえあれば、どんなアーキテクチャにも対応できます

それと、恐らくお使いのC言語コンパイラは、コンパイル途中のアセンブリコードを出力できますので、簡単なコードを書いてアセンブリを吐かせれば理解の助けとなると思います
(標準ライブラリなんかを使うと、えげつなく長いコードが出てきますのできっとパニックになります。最初は

コード:

int main(void)
{
	int x = 1;
	int y = 2;
	int z = x + y;

	return 0;
}
くらいから始めるのがおすすめです)

C言語の学習が、必ずしもアセンブリの学習に役立つとは限りません
アセンブリの理解には、コンピュータでプログラムが実行される際の挙動の知識が必要です
例えば、C言語において変数に対する代入は = を使います、などと覚えてもアセンブリを理解できません

アセンブリにおいては、レジスタの知識が必須となります
C言語を学習するときに、常にレジスタの状態を意識するようにしていれば、アセンブリがとても簡単になります

まずはレジスタ、引いてはプログラムがどうやって実行されるのか、を理解するのが先決かと思います
そしてそれは、将来あなたがどんな言語を使っていようが、プログラムを作る時に必ず役に立ちます

Re: アセンブラを学習したいのですが・・

Posted: 2015年3月31日(火) 07:19
by ターボ
おはようございます。アセンブラを学びたいという事ですのでC言語の勉強をしなくても、情報処理のレベル2の国家資格に出てくるCASL2をやられてはいかがでしょうか?

出来ればCASL2とC言語両方勉強されて受験されるのをお勧めしますが。CASL2だけでも受験可能です。

両方と言うのは試験問題を見て簡単だと思う方を受験するときに選択できるからです。

せっかく勉強するなら漠然と勉強するより明確な目標があった方が良いと思いました。

CASL2は情報処理技術者試験におけるプログラミング能力試験のために仕様策定されたアセンブリ言語です。

↓のURLからシュミレータをダウンロードできます。
https://www.jitec.ipa.go.jp/1_10sitemap ... temap.html

学生さんなら国家資格の基本情報技術者試験はプログラマの登竜門と言われている資格ですので就職する時この資格を持っている人しか入社試験を受けれない会社とかもあるのでご検討されてはと思いました。

既にご存知でしたら失礼しました。

Re: アセンブラを学習したいのですが・・

Posted: 2015年3月31日(火) 09:34
by みけCAT
あごみつ さんが書きました:(標準ライブラリなんかを使うと、えげつなく長いコードが出てきますのできっとパニックになります。最初は

コード:

int main(void)
{
	int x = 1;
	int y = 2;
	int z = x + y;

	return 0;
}
くらいから始めるのがおすすめです)
標準ライブラリを使っても、えげつなく長いコードが出てくるとは限りません。
例えば、手元の環境(Windows 7 Home Premium SP1 64bit、gcc (GCC) 4.8.1、最適化オプションなし)で

コード:

#include <stdio.h>

int mein(void)
{
	puts("Hello");

	return 0;
}
※関数名がmeinなのはわざとです

というコードをコンパイルすると、

コード:

	.file	"test3.c"
	.section .rdata,"dr"
LC0:
	.ascii "Hello\0"
	.text
	.globl	_mein
	.def	_mein;	.scl	2;	.type	32;	.endef
_mein:
LFB10:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	subl	$24, %esp
	movl	$LC0, (%esp)
	call	_puts
	movl	$0, %eax
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
LFE10:
	.ident	"GCC: (GNU) 4.8.1"
	.def	_puts;	.scl	2;	.type	32;	.endef
となりました。このコードは、例示された

コード:

int main(void)
{
	int x = 1;
	int y = 2;
	int z = x + y;

	return 0;
}
のコンパイル結果である

コード:

	.file	"test1.c"
	.def	___main;	.scl	2;	.type	32;	.endef
	.text
	.globl	_main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
LFB0:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	andl	$-16, %esp
	subl	$16, %esp
	call	___main
	movl	$1, 12(%esp)
	movl	$2, 8(%esp)
	movl	8(%esp), %eax
	movl	12(%esp), %edx
	addl	%edx, %eax
	movl	%eax, 4(%esp)
	movl	$0, %eax
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
LFE0:
	.ident	"GCC: (GNU) 4.8.1"
よりも短いです。

[hr]
参考になりそうなサイトを紹介しておきます。
アセンブラ入門 : x86の基本的な命令が紹介されています。
Compiler Explorer : ブラウザ上でC++のコードをアセンブリ言語に変換できます。
オフトピック
おまけ : PIC(組み込み向け小型CPU)の命令セット
302.PICの命令とレジスタ一覧