ページ 11

アセンブラできる方いますか?

Posted: 2010年6月11日(金) 04:49
by 寅之助
アセンブラの勉強がしたいのでCで
#include <stdio.h>
int main(void)
{
printf("hello");
}
という入門書一ページ目レベルのものを作成し、
OllyDbgでアセンブラコードを見てみましたが
まったく理解不能でした。

Cではたかが5行程度ですがアセンブラだと
100行超えますね。。。

Cだってどうせコンパイルするときに
一度アセンブラに落ちるわけですから
アセンブラなんか使うより
最初からCを使ったほうがいいのではないですか?

アセンブラができる方はどのように勉強したのでしょう?
本屋とかに言ってもなぜかアセンブラの本はあまり目に付きません。

どこか詳しくかつ簡単に記載してあるサイトないでしょうか?

Re:アセンブラできる方いますか?

Posted: 2010年6月11日(金) 07:35
by たかぎ
> Cだってどうせコンパイルするときに
> 一度アセンブラに落ちるわけですから
> アセンブラなんか使うより
> 最初からCを使ったほうがいいのではないですか?

アセンブリ言語でなければ記述できないものがあります。
例えば、プログラムの起動直後にスタックポインタを設定する必要がありますが、これをCで記述することは原則として不可能です。
あるいは、マルチスレッドを実現するためにはコンテキストの切り替えが必要になりますが、これをCで実現することも原則として不可能です。
他にも、割り込みハンドラの記述やレジスタを直接操作するような処理を書くにはアセンブリ言語が不可欠になります。

> アセンブラができる方はどのように勉強したのでしょう?

どのようにといわれても、アセンブリ言語もCも基本的には勉強方法は変わりません。
一つアドバイスするとすれば、いきなりIA-32とかからやろうとすると挫折しますので、8ビットかせいぜい16ビット程度のマイコンから勉強する方が、場合によっては今やりたいことから見れば遠回りだと感じるかもしれませんが、結局は近道になります。

> どこか詳しくかつ簡単に記載してあるサイトないでしょうか?

半導体メーカーのサイトに行けば、ハードウェアマニュアル、ソフトウェアマニュアル、アプリケーションノートなどのドキュメントが公開されているはずです。
ただし、有効活用するには、コンピュータや電子工学に関する最低限の知識は必要になります。
画像

Re:アセンブラできる方いますか?

Posted: 2010年6月11日(金) 07:43
by ookami
ちょっと前まではコンパイラにも至らないところが多く、「アセンブラで書いた方が確実だし動作も速い」って事があったそうです。

最近ではコンパイラの性能も上がり、
> 最初からCを使ったほうがいい
という場合がほとんどのようです。

調べるなら大きめの図書館とか…ですかね。
ところでなぜアセンブラを勉強したいのですか?

Re:アセンブラできる方いますか?

Posted: 2010年6月11日(金) 12:56
by 寅之助
>たかぎさん
私はハード系にはホントに疎いのですが
それでも勉強できますでしょうか?

>ookamiさん
ゲームなどの解析をしたいのです。

Re:アセンブラできる方いますか?

Posted: 2010年6月11日(金) 13:00
by たかぎ
> 私はハード系にはホントに疎いのですが
> それでも勉強できますでしょうか?

ハードウェアを避けるつもりならアセンブラには手をだすべきではありません。
現在疎いのであれば、これから勉強すればよいだけのことです。

Re:アセンブラできる方いますか?

Posted: 2010年6月11日(金) 13:03
by 寅之助
>現在疎いのであれば、これから勉強すればよいだけのことです。
具体的には何を勉強すればいいのですか?
ハードというとどうしても自作PCとかを想像してしまうのですが・・・

Re:アセンブラできる方いますか?

Posted: 2010年6月11日(金) 13:18
by たかぎ
> 具体的には何を勉強すればいいのですか?

最低限、回路図が読めるようになりましょう。
多くの書店では、プログラミング関係と比較的近い棚にハードウェアの入門書があるはずです。

> ハードというとどうしても自作PCとかを想像してしまうのですが・・・

無意味とはいいませんが、自作PCではアセンブラの勉強には直結しません。

Re:アセンブラできる方いますか?

Posted: 2010年6月11日(金) 16:48
by Dixq (管理人)
自作PCとは全く関係ないですね…。ただパーツ買ってつけるだけで何の専門的知識もいらないです。


アセンブラを知るためにはまずCPUと回路の知識が不可欠です。
本屋さんでCPUの本にザッと目を通してみれば、今後勉強すべき事のイメージわいて来るんじゃないかと思います。

Re:アセンブラできる方いますか?

Posted: 2010年6月11日(金) 19:01
by 寅之助
自分で書けるようになれなくてもいいので
どんな処理が書かれているかみたなことだけでも
読めるようになりたいのです。

やはりハードの知識が必要でしょうか?

Re:アセンブラできる方いますか?

Posted: 2010年6月11日(金) 19:25
by YuO
> やはりハードの知識が必要でしょうか?

私は,ハードの知識はアセンブラの勉強自体には不要だと思っています。
ただし,CPUの構成などの知識は必要になりますが。

個人的な経験として,PC-9801時代にMASM 6を使っていました。
しかし,ハードの知識はほとんど無く,あったのは,ハードをI/Oポートを通して見た場合の知識でした。
ゲーム云々ということですし,ユーザーモードで動かすアプリケーションであれば,現状でもそのような感じの知識で十分だと思います。
# どうせハードウェア叩けないですし。


ところで,ライセンスにリバースエンジニアリングの禁止条項は当たり前のように付いてきていると思うのですが……。

Re:アセンブラできる方いますか?

Posted: 2010年6月11日(金) 19:57
by ookami
アセンブリコードは、極端に言えば、四則と代入とジャンプだけで書かれていて、数個しかないレジスタ(変数みたいなもの)を巧みに使いまわし、しかもコンパイラによる最適化がかかっていますから、元のソースコードからはいろんな意味で掛け離れています。

なので、「何のためにアセンブラを?」の答えが「ゲームでどんな処理が書かれているか」っていうのがちょっとピンと来ないのです。

人間ひとりひとりを観察して、「世界がどう動いているか考える」ようなものです。

Re:アセンブラできる方いますか?

Posted: 2010年6月11日(金) 20:26
by たかぎ
寅之助さんは、

> ゲームなどの解析をしたいのです。

といわれていますが、どんなプラットフォームで、どんな素性のゲームを、なぜ解析したいのかを明確にしていません。
また、「など」に何が含まれているのかもわかりません。

PCのような環境であれば、ハードウェアの知識はそれほど必要ありませんが、そうでなければ、I/Oポートひとつ叩くにしても、それがトライステートなのかオープンドレインなのか、正論理なのか負論理なのかなど、回路図から読み取らなければならないことは多々あります。
割り込み制御にしても、割り込み信号がエッジなのかレベルなのかは回路図から読み取らなければなりません。
これらはCを使っても同じですが、わざわざアセンブリ言語を使うのは、多くの場合、このような低水準な制御を行うためですからね。

また、解析といってもリバースエンジニアリングの話とは限らず、社内の既存のソースをメンテナンスするために解析するのかもしれませんし、自分で作ったプログラムの不具合を解析するのかもしれません。

そうした可能性を想定すれば、ハードウェアを理解することは不可欠です。

> 自分で書けるようになれなくてもいいので
> どんな処理が書かれているかみたなことだけでも
> 読めるようになりたいのです。

では、そのプログラムが誰がどのようにして書いたものなのでしょうか?

Re:アセンブラできる方いますか?

Posted: 2010年6月12日(土) 06:32
by 寅之助
今さっきまで入門サイトのようなものを見て勉強してきました。
そこで1つ気になったのですが、

http://itpro.nikkeibp.co.jp/article/COL ... ?ST=slfsys
ここのサイトで使われてるアセンブラと
http://www5c.biglobe.ne.jp/~ecb/assembl ... ler00.html
ここのサイトで使われてるアセンブラって同じですか?

上記のサイトだと
C言語で言う代入
a = 1;
はアセンブラだと
LD GR0,=1
と解釈したのですが、
下記のサイトでは
mov a,2
となりますよね?(五時間くらいしか見てないので違ってたらすみません。)

基本情報技術者などの情報処理系のアセンブラソースを見てみると
上記のサイトのような記述ですが、
>>1で記入したような自分で作ったC言語のハローワールドを逆アセすると
下記のサイトのような記述になってます。

これはどういうことでしょうか?

CとC++の違いみたいな感じでしょうか?

Re:アセンブラできる方いますか?

Posted: 2010年6月12日(土) 07:51
by toyo
LDやらmovというアセンブラの命令をニーモニックといいますがニーモニックはCとは違いCPUによってまったく異なるということです
レジスタに値を入れるにもLD(loadでしょうか)やmov(moveでしょうね)など異なりますし
ジャンプ命令もJMPだったりbrc(branch)だったり
それぞれのCPUに対応したニーモニックを覚えないといけないのがアセンブラの面倒なところですね

Re:アセンブラできる方いますか?

Posted: 2010年6月12日(土) 13:06
by hoge
一つ目のサイトは CASLというアセンブラでCOMETというCPUで動くものです。
これは実用的なものではなく情報処理試験などでしか見かけない簡易的なアセンブラです。
二つ目のサイトはx86という一般にもっともよく使われているCPUのものです。
他の人が書いているようにCPUによってアセンブラも変わります。
また同じCPUでも複数のアセンブラがあります。

Re:アセンブラできる方いますか?

Posted: 2010年6月12日(土) 13:36
by 寅之助
一言で「アセンブラ」と言ってもCPUによってアセンブラの種類が違うのですね。

それを聞くと厄介だと感じるようになりました。
アセンブラがハードと親密って言うのはそういうところなのでしょうか?

前者のサイトでレジスタなど勉強になりましが後者のサイトで使われるアセンブラにも関係するものなのでしょうか?
話しを聞くところ、私の目的とするアセンブラは後者のようですが、先に前者を勉強してしまったのでそこら辺が同じならいいですが、まったく違うようではアセンブラ初心者の私は頭がこんがらがりそうです。。。

Re:アセンブラできる方いますか?

Posted: 2010年6月12日(土) 13:45
by たかぎ
> 先に前者を勉強してしまったのでそこら辺が同じならいいですが、まったく違うようではアセンブラ初心者の私は頭がこんがらがりそうです。。。

おそらく、まったく違うと答えた方が適切なのでしょうね。

Re:アセンブラできる方いますか?

Posted: 2010年6月12日(土) 15:20
by softya
リバースエンジニアリングの件についてスルーされているのは気になりますが・・・。

>それを聞くと厄介だと感じるようになりました。
>アセンブラがハードと親密って言うのはそういうところなのでしょうか?

パソコン、家庭用ゲーム機毎、スマートフォンなど使われているCPUが全て違います。
なので、CPU毎にアセンブラ命令の記述方法は全く異なります。
代用可能な命令がない事もありますし、レジスタの数が全く違います。レジスタのビット数も違います。

>話しを聞くところ、私の目的とするアセンブラは後者のようですが、先に前者を勉強してしまったのでそこら辺が同じならいいですが、まったく違うようではアセンブラ初心者の私は頭がこんがらがりそうです。。。

実のところ、入門者向けなCASLに比べてx86系はかなり命令が複雑です。
更に、C++などのプログラムをコンパイラが最適化していた場合は、元のプログラムの動きを理解する事は非常に難しく熟練を必要とします。一つ一つの命令は分かっても1つの関数として何をしている処理なのかを理解することは大変困難だと言う事になりますね。
とにかく、長大なx86アセンブラのゲームのコードなど不毛に労力が必要なので私は解析したくありません。