20:31 *Defolos join (Defolos!~Defolos@eaoska123225.adsl.ppp.infoweb.ne.jp) 20:31 *Names #lykeion: @Defolos 20:39 *wahiko join (wahiko!~wahiko@softbank219021026027.bbtec.net) 20:39 [wahiko] こんばんわ 20:43 [Defolos] こんばんはー 20:57 [Defolos] 今日は皆さん参加できないのかな? 21:00 [wahiko] そうですね 21:00 [Defolos] 21時になっちゃいましたが 21:00 [Defolos] どうしましょう^^; 21:02 [wahiko] もう少し待ちますか? 21:02 [Defolos] そうですねぇ 21:03 *yuushi_q join (yuushi_q!~yuushi_q@u7c189ce2.sec.ppp.nifty.com) 21:03 [Defolos] 20分辺りからはじめますか 21:03 [Defolos] こんばんは 21:03 [wahiko] こんばんわ 21:03 [yuushi_q] こんばんは 21:04 [Defolos] 参加者があまり振るわないので、20分ごろから開始したいと思いますが 21:04 [Defolos] よろしいでしょうか? 21:05 [yuushi_q] はい 21:05 [wahiko] はい 21:05 [Defolos] あ、後 21:06 [Defolos] 前回の講義が終わったあとに資料を修正しておきました 21:06 [Defolos] アカデメイアアップローだからダウンロードできますので、ご用意ください 21:07 [Defolos] http://security2600.sakura.ne.jp/up/img/509.zip ここです 21:07 [wahiko] 分かりました 21:14 *mudai join (mudai!~mudai@p5178-ipad08takakise.saga.ocn.ne.jp) 21:15 [Defolos] こんばんは 21:15 [mudai] 驕・l縺セ縺励◆縲・ 21:15 [mudai] encode? 21:15 [Defolos] あ、文字がおかしくなってますね 21:16 *mudai part (~mudai@p5178-ipad08takakise.saga.ocn.ne.jp) 21:18 *mudai join (mudai!~mudai@p5178-ipad08takakise.saga.ocn.ne.jp) 21:19 [Defolos] おかえりー 21:19 [mudai] hello! plz wait. 21:20 *mudai0 join (mudai0!~takaaki0@p5178-ipad08takakise.saga.ocn.ne.jp) 21:21 *mudai part (~mudai@p5178-ipad08takakise.saga.ocn.ne.jp) 21:21 [mudai0] こんにちは。 21:21 [Defolos] こんにちは 21:21 [wahiko] こんにちわ 21:21 [mudai0] すみません。遅れました。。汗 21:21 [Defolos] それではそろそろ時間になりましたので 21:21 [Defolos] はじめたいと思います 21:21 [mudai0] お願いします。 21:21 [Defolos] えと、まずは資料をダウンロードしてください 21:22 [Defolos] http://security2600.sakura.ne.jp/up/img/509.zip 21:22 [Defolos] mudaiさんはSSHサーバへの接続テストがまだ終わってませんね? 21:22 [mudai0] はい。 21:23 [Defolos] では資料を参照して、SSHクライアントをダウンロードしてください 21:23 [Defolos] 他の皆さんも一度、接続できるかテストしてください 21:23 [mudai0] linuxがあるのでクライアントはOKだと思います。 21:23 [Defolos] あ、linuxでしたか 21:23 [Defolos] では、glazheim.mydns.jpにsshで接続してください 21:24 [mudai0] こっちはwinです。 21:24 [mudai0] はい 21:24 [Defolos] アカウントはウィスで 21:24 [Defolos] 配布します 21:24 [mudai0] はい。 21:25 [Defolos] ログインできますでしょうか? 21:26 [mudai0] できません・・汗 21:26 [Defolos] Σ 21:26 [Defolos] エラーメッセージは出てますか? 21:27 [mudai0] パーミッションがおかしいらしいです。PUTTYで試してみます。。 21:27 [Defolos] お願いします 21:29 [mudai0] Aji75*;Ju9- 21:29 [mudai0] あう 21:29 [Defolos] yuushiさんはログインできますでしょうか 21:29 [Defolos] Σ 21:29 [mudai0] ごめんなさい。汗 21:30 [mudai0] Using keyboard-interactive authentication. 21:30 [mudai0] とでました。 21:30 [Defolos] あ、はい 21:31 [Defolos] パスワードは2回入力するのですが 21:31 [Defolos] できませんでしたか? 21:32 [yuushi_q] アカウントはどこにあるのでしょうか? 21:32 [mudai0] だめです。汗 21:32 [Defolos] yuusiさんも前回ログインできていませんでしたか? 21:34 [Defolos] ちょっとお待ちくださいね>無題さん 21:34 [mudai0] はい、 21:34 [Defolos] http://72.14.235.104/search?q=cache:IiWfMn6Nd0sJ:www2.bus.osaka-cu.ac.jp/~method/systems/index.php%3Fpassword+putty+Using+keyboard-interactive&hl=ja&ct=clnk&cd=1&gl=jp&lr=lang_ja 21:34 [Defolos] こんな感じになってるのでしょうか? 21:36 [yuushi_q] ログインできました 21:36 [Defolos] 了解しました 21:36 [Defolos] 申し訳ありませんが、少々お待ちください 21:36 [mudai0] 同じようなものが出ていました。もう一度トライしてみます。 21:37 [Defolos] お願いします 21:37 [mudai0] login as: mudai 21:37 [mudai0] Using keyboard-interactive authentication. 21:37 [mudai0] Password: 21:37 [mudai0] Access denied 21:37 [mudai0] Using keyboard-interactive authentication. 21:37 [mudai0] Password: 21:37 [mudai0] Access denied 21:37 [mudai0] Using keyboard-interactive authentication. 21:37 [mudai0] Password: 21:37 [mudai0] kono 21:38 [mudai0] このようなメッセージが出ます。 21:38 [Defolos] Σ 21:38 [Defolos] アクセス拒否になってますね・・・ 21:38 [Defolos] あ 21:38 [Defolos] もしかしたら 21:38 [Defolos] パスワードの打ち間違えかも 21:39 [mudai0] 俺ですか? 21:39 [Defolos] うん 21:39 [mudai0] がんばってみますw 21:40 [Defolos] いちど 21:41 [Defolos] guestでろぐいんしてみてください 21:41 [mudai0] おkです。 21:41 [mudai0] PASSは・・なしでいいんですか? 21:41 [Defolos] はい 21:42 [mudai0] だめです・・汗 21:42 [Defolos] おかしいですね・・・ 21:43 [mudai0] ほかの人の迷惑になりそうなので続けてください。 21:43 [Defolos] あ、linux 21:43 [Defolos] お持ちですよね 21:44 [mudai0] はい 21:44 [Defolos] ではそちらでコンパイル等をお願いします 21:44 [mudai0] はい。 21:44 [Defolos] では今回は前回できなかったコンパイルテストを行います 21:44 [Defolos] まず、vim test.c と打ってみてください 21:45 [wahiko] はい 21:45 [mudai0] okです。 21:45 [Defolos] vimはviの進化版みたいなもので、viは資料にも載っている通りテキストエディタです 21:45 [Defolos] 今回はこれの使い方もあわせて説明します 21:46 [Defolos] まず、viには編集モードとコマンドモードがあります 21:46 [Defolos] コマンドモードはコピーやペースト、アンドゥなどのコマンドを処理するモードで 21:46 [Defolos] 編集モードは文字の挿入などのテキスト編集を行うモードです 21:47 [Defolos] Escキーを押すと必ずコマンドモードになります 21:47 [Defolos] では、文字の挿入を行ってみましょう 21:47 [Defolos] 文字の挿入にはコマンドモードでiキーを押します 21:47 [Defolos] iを押したら、「int main(void){」と入力ください 21:48 [Defolos] できましたでしょうか 21:48 [wahiko] はい 21:49 [mudai0] おkです。。 21:49 [Defolos] ではエンターで改行を2回行い 21:49 [Defolos] }と入力します 21:49 [Defolos] 打ってもらった文字列はC言語のプログラムでもっとも基本となる部分です 21:50 [Defolos] まずはこれを保存してみましょう 21:50 [Defolos] Escキーを押してコマンドモードにしてください 21:50 [Defolos] 次に、「:wq」と打ってください 21:50 [Defolos] これで保存して終了します 21:50 [wahiko] 出来ました 21:50 [mudai0] おkです。 21:51 [Defolos] yuushiさんはできてますでしょうか? 21:51 [wahiko] 前回のは何が原因でしたか 21:51 [yuushi_q] OKです 21:51 [Defolos] ははは・・・ 21:51 [Defolos] 実はパーミッションが設定できてなくて 21:52 [Defolos] rootしか書き込めないようになってました 21:52 [wahiko] なるほどw 21:52 [Defolos] では、次にコンパイルをして見ましょう 21:52 [Defolos] これは資料にあるように、gcc -o test.exe test.c のようにします 21:52 [Defolos] -oは名前を変更するときに使うオプションです 21:53 [Defolos] これを省略すると「a.out」という名前の実行ファイルができます 21:53 [Defolos] 今回は実行ファイルはtest.exeとしてください 21:54 [Defolos] エラー無く終了したら、作った実行ファイルを実行してみてください 21:54 [Defolos] 実行するときは./test.exeのように、カレントディレクトリから指定する必要があります 21:55 [Defolos] ここまではOKでしょうか 21:55 [wahiko] OKでし 21:55 [mudai0] おkです、 21:55 [wahiko] です 21:56 [Defolos] たぶん実行しても何も行われないと思います 21:56 [Defolos] これは、Cプログラムのフレームを作っただけで、まだ中身の処理を何も記述していないからです 21:56 [yuushi_q] OKです 21:56 [Defolos] つぎに、これに肉付けをしていきます 21:56 [Defolos] vim test.cと入力ください 21:57 [Defolos] これで先ほど作ったソースコードが表示されますので、 21:57 [Defolos] 先頭に「# include 」と追加してください 21:59 [Defolos] 次に、main{}の中に「printf("test\n");」to 21:59 [Defolos] 入力してください 21:59 [Defolos] カーソルの移動は、一度コマンドモードにしてhで左 21:59 [Defolos] jで下、kで上、lで右に動きます 22:00 [Defolos] 追加できたら前と同じように保存してコンパイルしてみてください 22:01 [Defolos] あ。申し訳ありません 22:01 [Defolos] printf()の下の行にreturn 0;という記述も追加してください 22:02 [Defolos] ここまではOKでしょうか? 22:02 [mudai0] おkです。 22:02 [wahiko] okです 22:02 [Defolos] シェルはカーソルの上下キーで前に行ったコマンドを探せるので 22:02 [Defolos] ご活用ください 22:03 [Defolos] では同じように、実行してみてください 22:03 [Defolos] 今回は画面に「test」と表示されたと思います 22:03 [Defolos] これは、先ほど追加した命令が画面にtestと表示しろ という命令だからです 22:04 [Defolos] とまあ、C言語の基本的なところをおさらいする意味で、次に例題をやって見ましょう 22:04 [Defolos] あ、C言語を始めて触る方はいらっしゃいますか? 22:05 [mudai0] 反応ないと言うことは・・ 22:05 [wahiko] 経験があります 22:05 [Defolos] 皆さん経験あり、ですかね 22:05 [mudai0] 同じくです。 22:05 [Defolos] では先ほどの説明はかなり無駄だったようですね^^; 22:05 [yuushi_q] 経験ありです 22:05 [Defolos] それでは、例題0.1をやってみましょう 22:06 [Defolos] 与えられた2つの整数の最大公約数を求めるプログラムをC言語で作成せよ。 22:06 [Defolos] ということで、これはヒントを出すならユークリッドの互除法を使うと簡単です 22:06 [mudai0] あい 22:07 [Defolos] 最大公約数は両方の数値を割ることができる最大の数という意味です 22:07 [Defolos] 書き方の制約は特にありませんので、自由にやってもらって結構です 22:08 [Defolos] ユークリッドの互除法について簡単に説明しますと 22:08 [Defolos] ユークリッドが記した『原論』の中で紹介されているアルゴリズムです 22:08 [Defolos] これは最古のアルゴリズムだと言われています 22:08 [Defolos] アルゴリズムの手順自体はかなり簡単です 22:09 [Defolos] 1.xをyで割って、商をa1、あまりをb1とする 22:09 [Defolos] 2.yをb1で割って、商をa2、あまりをb2とする 22:09 [Defolos] 3.b1をb2で割って、商をa3、あまりをb3とする 22:09 [Defolos] ・・・ということを延々と繰り返していきます 22:09 *AquO_ join (AquO_!^aquo@101CTKP.ctktv.ne.jp) 22:09 [Defolos] すると、最終的には必ず割り切ることができる数値が見つかります 22:09 [Defolos] こんばんは 22:10 [AquO_] 遅くなってごめんなさい 22:10 [Defolos] それが最大公約数です 22:10 [mudai0] こんばんは! 22:10 [AquO_] こんばんは 22:10 [Defolos] あ、今例題0.1をやってますので、SSHにつないでください 22:10 [AquO_] 了解しました。ありがとうございます 22:11 [mudai0] 一応できました。 22:11 [Defolos] Σ 早いですね 22:11 [Defolos] では、テストデータを入力してみてください 22:11 [mudai0] ユークリッドがわからず調べてました。 22:11 [mudai0] はい。 22:12 [mudai0] 1と4と1とか出てきたんですけどあってるんですかね?汗 22:12 [Defolos] ちょっと待ってくださいね 22:12 [Defolos] 私もまだできてなくて^^; 22:13 [mudai0] ww 22:14 [Defolos] 正解です 22:14 [Defolos] mudaiさんはどういった方針で解答しましたか? 22:15 [mudai0] あまりを使ったやり方です。 22:15 [Defolos] 再帰を使ったりしてます? 22:15 [mudai0] while使ってます。再帰ってまだよくわからないですけど・・ 22:16 [Defolos] 再帰というのは自分の中から自分を呼び出すプログラムのことです 22:16 [mudai0] 多分つかってないと思います。関数とは違うんですよね? 22:17 [Defolos] 関数の中で自分と同じ関数を呼び出す手法ですね 22:17 [Defolos] たとえば 22:17 [Defolos] func(x){ func(3);}みたいな感じです 22:17 [mudai0] 使ってないです汗 22:17 [Defolos] ユークリッドの互除法では 22:18 [Defolos] 再帰を使うと5行ぐらいでかけるので、見通しが良くなるアルゴリズムの典型として 22:18 [Defolos] 再帰の説明では良く出てきます 22:18 [Defolos] できたらこっちの方にも挑戦してみてください 22:18 [mudai0] なるほど・・ 22:18 [mudai0] 了解です。 22:19 [Defolos] 他の皆さんはできてますでしょうか? 22:20 [AquO_] すみません。。。もう少しかかります。 22:20 [Defolos] 了解しました。あせらずに自分のペースでやってもらって結構ですので 22:21 [AquO_] ありがとうございます 22:21 [Defolos] 一応、ヒント的なものは適宜出していきますね 22:21 [mudai0] 再帰というのはmainの中から自分で作った関数を呼び出すことを言うのでしょうか? 22:22 [Defolos] mainの中では一度だけ再帰で使う関数を呼び出します 22:22 [Defolos] その後、 22:22 [Defolos] 再帰に使う関数を関数の中から呼び出します 22:23 [mudai0] なるほど・・ちょっと手を加えればいけそうですw 22:23 [Defolos] int func(void) 22:23 [Defolos] { 22:23 [Defolos] return func(); /* 自分自身を呼び出す */ 22:23 [Defolos] } 22:23 [Defolos] こんな感じのものでsね 22:23 [Defolos] 再帰を使うときの注意ですが、必ず停止するようにしなければなりません 22:24 [mudai0] 桶です。そのままmainの中にwhileでだらだら書いてました。 22:24 [Defolos] 呼び出しっぱなしで終了条件が無いものは無限に呼び出し続けて、アルゴリズムの停止性条件に違反しますからね 22:25 [mudai0] この場合必ず1はでるので終了はされますよね? 22:25 [Defolos] whileでやるのも正解のひとつですので、それはそれで問題ないですよ〜 22:25 [wahiko] できました 22:25 [Defolos] この場合は多分終了します 22:25 [Defolos] あ、できた方はテストデータを入力してみてください 22:25 [wahiko] はい 22:25 [Defolos] ヒント;まず、0以下の数値を排除します 22:27 [Defolos] ヒント;a,bの二つの変数を用意し、aにはx/yを、bにはそのあまりを入れます。もしbが0になれば終了です 22:28 [Defolos] ヒント;割り切れていないようなら、xをy 22:29 [Defolos] ヒント;に変更し、yを先ほど出したあまりに換えます 22:29 [Defolos] ヒント;これをぐるぐるまわすといつか処理が終わるはずです 22:30 [Defolos] 以上でヒントは終わりです。 22:30 [Defolos] 40分で一度正解を提示したいと思います 22:31 [mudai0] 再帰っぽくなりました。 22:31 [Defolos] お、できましたか 22:32 [mudai0] 関数名を何にしようか迷ったんですがsaidaikouyakusuで落ち着きました。 22:32 [Defolos] ^^; 22:32 [Defolos] 英語の名前にしようとすると、つづり間違いが怖いですよね・・・ 22:33 [mudai0] そうですw日本語だと一目でわかりますw 22:33 [mudai0] 他人に見られたときが恥ずかしいです。(日本語) 22:33 [Defolos] 確かに・・・ 22:34 [Defolos] 私は無理にカッコつけて、英語の名前を使うから綴り間違いが多いです 22:34 [mudai0] 英語のつづり間違うのも恥ずかしいですけど恥ずかしさでは日本語が勝ってると思います笑 22:34 [Defolos] ^^; 22:35 [Defolos] 今のところできちゃった、って方いらっしゃいますか? 22:35 [mudai0] 今のところおkです。 22:36 [AquO_] 再帰を使っているのですが、返り値でmainに値を返した際に、変な値をはく原因を探っています。 22:36 [Defolos] なるほど 22:37 [AquO_] どうやら、サブルーチン内ではうまく計算が出来ているのですが、なぜか返すと変な値が。。。 22:37 [Defolos] 変数の型はあってますか? 22:38 [AquO_] 基本的にintしか使ってないはずです。 22:39 [Defolos] 分からない問題などはIRCで掲載して、皆で悩むのも手かな、と思ってるのですが 22:39 [AquO_] 了解です。 22:39 [AquO_] そのまま、貼り付ければよいでしょうか?? 22:39 [Defolos] はい 22:40 *AquO_ #include 22:40 *AquO_ int main(){ 22:40 *AquO_ int i=1234, j=987; 22:40 *AquO_ int A=0; 22:40 *AquO_ printf("Answer : %d \n", A); 22:40 [AquO_] } 22:40 [AquO_] 貼り付ける際に最後の括弧を忘れていました。。。 22:40 [Defolos] ^^; 22:41 [AquO_] えっと。。。何かお気づきの点はありますか。。。 22:41 [Defolos] んー、Aがサブルーチンですか? 22:42 [AquO_] えっと、デバッグの行が入って読みにくいと思うのですが 22:42 [AquO_] int function(int i, int j)がサブルーチンで、main()の中で呼び出しています 22:43 [Defolos] あれ?全部表示されてないかも・・6行じゃないですよね 22:43 [AquO_] いや。。。 22:44 [AquO_] 結構長いですよ。。。20行ぐらいです 22:44 [mudai0] 再帰呼び出しってこういうことを言うんですね・・汗 22:46 [AquO_] mudai0さんもお気づきの点があれば教えてください 22:48 [Defolos] なんでだろう 22:49 [Defolos] どう表示されましたか? 22:49 *AquO_ (1234, 987, 247) 22:49 *AquO_ (987, 247, 246) 22:49 *AquO_ (247, 246, 1) 22:49 *AquO_ (246, 1, 0) 22:49 *AquO_ (246, 1, 0) 22:50 [AquO_] printfで吐いているものが多少違いますが、ロジックは変わっていません 22:51 *AquO_ #include 22:51 *AquO_ int main(){ 22:51 *AquO_ int i=1234, j=987; 22:51 *AquO_ int answer; 22:51 *AquO_ answer=function(i,j); 22:51 [Defolos] おかしいですねぇ。。。 22:51 [AquO_] これが、最新のソースです。 22:52 [Defolos] んー 22:52 [Defolos] プロトタイプ宣言入れてみてもだめでしょうかねぇ 22:53 [Defolos] とりあえず、時間ですので、いったん解答例を挙げてみますね 22:53 [AquO_] 了解しました。 22:53 [wahiko] はい 22:53 [mudai0] お願いします! 22:53 [Defolos] まずは再帰を使わない例です 22:53 [Defolos] #include 22:53 [Defolos] 22:53 [Defolos] int euclid(int x, int y); 22:53 [Defolos] 22:53 [Defolos] int main(void){ 22:53 [Defolos] int x, y, z; 22:53 [Defolos] scanf("%d %d", &x, &y); 22:53 [Defolos] printf("%d\n", euclid(x,y)); 22:53 [Defolos] return 0; 22:53 [Defolos] } 22:53 [Defolos] 22:53 [Defolos] int euclid(int x, int y){ 22:53 [Defolos] 22:53 [Defolos] int q, r; 22:53 [Defolos] 22:53 [Defolos] if(x == 0 || y == 0){ 22:53 [Defolos] return 1; 22:53 [Defolos] } 22:53 [Defolos] if(x < 0){ 22:53 [Defolos] x =- x; 22:53 [Defolos] } 22:53 [Defolos] if(y < 0){ 22:53 [Defolos] y =- y; 22:53 [Defolos] } 22:53 [Defolos] while(1){ 22:53 [Defolos] q = x / y; 22:53 [Defolos] r = x - (q * y); 22:53 [Defolos] if(r == 0){ 22:53 [Defolos] break; 22:53 [Defolos] } 22:53 [Defolos] x = y; 22:53 [Defolos] y = r; 22:53 [Defolos] } 22:53 [Defolos] return y; 22:53 [Defolos] } 22:54 [Defolos] 大変みにくくて申し訳ないです 22:54 [Defolos] まず、0の時はエラーを吐くようにしています 22:54 [Defolos] 不の値が入力されたときは-から-を引いて、+になるようにしています 22:55 [Defolos] 後はアルゴリズムに従って、割ってあまりを求めて、入れ替えてループさせています 22:55 [mudai0] なるほどwそういう処理だったんですね・・ 22:55 [Defolos] 終了条件はあまりが0になったときで 22:55 [Defolos] そのときのyが最大公約数です 22:55 [Defolos] では、次に再帰の方を見てみましょうか 22:56 [Defolos] #include 22:56 [Defolos] 22:56 [Defolos] int euclid(int x, int y); 22:56 [Defolos] 22:56 [Defolos] int main(void){ 22:56 [Defolos] int x, y, z; 22:56 [Defolos] scanf("%d %d", &x, &y); 22:56 [Defolos] printf("%d\n", euclid(x,y)); 22:56 [Defolos] return 0; 22:56 [Defolos] } 22:56 [Defolos] 22:56 [Defolos] int euclid(int x, int y){ 22:56 [Defolos] if(y == 0){return x;} 22:56 [Defolos] else{return euclid(y, x%y);} 22:56 [Defolos] } 22:56 [Defolos] これです 22:56 [mudai0] みじけぇ・・ 22:56 [Defolos] yが0のとき、つまり前の計算結果であまりが0になったときですね 22:56 [Defolos] そのときに終了します 22:57 [Defolos] それ以外のときはxのところにyをいれ、yのところにはx/yのあまりを入れます 22:57 [Defolos] これで最終的にはあまりが0になったときにxの値が帰って行って、最大公約数がもとまるわけです 22:57 [Defolos] 貼り付けたものはちゃんと見えてますでしょうか? 22:57 [mudai0] おkです。 22:58 [wahiko] OK 22:58 [AquO_] 大丈夫です 22:58 [yuushi_q] OKです 22:58 [Defolos] えと、一応答えを提示したので、次に移りたいと思いますが、 22:58 [Defolos] うまく動かなかったところなどはメモに残しておいて 22:59 [Defolos] 次に進みましょう 22:59 [mudai0] はい 22:59 [AquO_] はい 22:59 [Defolos] では、次にアセンブリについて説明します 23:00 [Defolos] アセンブリは低級言語で、機械語を一対一にニモニックと呼ばれるアルファベットの仮名に置き換えただけの言語でs 23:00 [Defolos] 先ほどやってもらったC言語とは大きく異なり、人が読むのには少々の苦労が必要となります 23:01 [Defolos] アセンブリにもいくつか異なる言語があります 23:01 [Defolos] 代表例ではMicrosoft社が開発したMASMや 23:01 [Defolos] MASMのLinux移植版のNASM 23:02 [Defolos] 情報技術者試験用のCASLLなどがあります 23:02 [Defolos] 今回はGNUが開発したGASを使ってアセンブラの基本的なところを学びたいと思います 23:03 [Defolos] GASを選択したり理由は、gccでコンパイル可能な点と、gdb(デバッガ)で出力されるコードがGASであり、利用する機械が多いと判断したためです 23:03 [Defolos] では、次にGASの基本的なところについて見ていきましょう 23:04 [Defolos] まず、GASではどこからプログラムが始まるのかを指定する必要があります 23:04 [Defolos] これをエントリポイントと呼び、.global mainと書きます 23:04 [Defolos] その下のmain:というラベルからプログラムが始まります 23:05 [Defolos] これはC言語のgoto文やcase文でも使うラベルのようなものです 23:05 [Defolos] C言語のメイン関数だと思ってもらえるとしっくり来るかもしれませんね 23:05 [Defolos] 次に、ディレクティブについて説明します 23:06 [Defolos] これは、アセンブラ(コンパイラ)に、それがどのようなものかを指定する役割を持ちます 23:06 [Defolos] たとえば、.textだと、これに続くものは文字列だと指定できるわけです 23:06 [Defolos] 同じように、数値であれば.dataを前に指定します 23:07 [Defolos] C言語で言うところの、int,charのようなものですね 23:07 [Defolos] では、次に命令について説明します 23:08 [Defolos] アセンブリでは、C言語のように文字を表示する命令やコサインを計算するような命令は存在しません 23:08 [Defolos] データを他の場所に移す、引き算をする、足し算をするといった、小さな命令をたくさん組み合わせて行いたい処理を実現します 23:09 [Defolos] C言語での代入処理を、まずは説明します 23:09 [Defolos] 代入にはmov命令を使います 23:09 [Defolos] movは、次に指定されたモノを、その次に指定されたものの中へ入れます 23:10 [Defolos] 資料の例ではmovl $4, %eaxとなっていますね 23:10 [Defolos] つまり、$4を%eaxに入れるという命令だと分かります 23:11 [Defolos] GASでは数値には$をつける決まりになっていますので、5だったら$5のように書きます 23:11 [Defolos] 次の%eaxですが、これはeaxレジスタを表しています 23:11 [Defolos] レジスタとはC言語の変数のようなものです 23:11 [Defolos] 違いは、レジスタはCPU内に存在する高速低容量の記憶領域であるという点だけです 23:12 [Defolos] movlのlについてですが、これは32ビットであるということを表しています 23:13 [Defolos] 一般的なCPUは32ビットで動作しています 23:13 [Defolos] この32ビットというのはレジスタの容量に直接関係してきます 23:14 [Defolos] 以前は16ビットのレジスタが使われていたので、そのときの後方互換のためにlやbといった記号をつけてレジスタが何ビットであるかを指定するのです 23:14 [Defolos] 今回は32ビットのコンピュータでテストするので、32ビットを表すlをつけておきます 23:14 [Defolos] では次に、データの宣言についてです 23:14 [AquO_] その前にちょっと 23:14 [Defolos] はい 23:14 [AquO_] 聞きたい事が 23:15 [Defolos] なんでしょうか 23:15 [AquO_] movと表記すれば32bitで動くアセンブリコードになるのでしょうか? 23:15 [AquO_] 32->16 23:15 [Defolos] 厳密に申しますと、mov命令にlを指定しただけではダメです 23:16 [Defolos] 一番初めに、ディレクティブで.code32を指定してやると 23:16 [AquO_] なるほど。。。 23:16 [Defolos] それ以降のコードが32ビットで動くものだとアセンブラが解釈し、32ビットで動作してくれます 23:16 [Defolos] 説明不足でした、申し訳ありません 23:16 [mudai0] もし64bitCPUの場合は・・どうなるのでしょうか? 23:17 [wahiko] code64? 23:17 [Defolos] 今のところ、.code64というディレクティブは見たこと無いので、まだ32ビットでしか動かない可能性もありますね・・・ 23:17 [mudai0] 了解です。 23:17 [Defolos] 他に質問はございませんか? 23:17 [AquO_] 大丈夫です。ありがとうございます 23:18 [Defolos] では、データの宣言について説明しますね 23:18 [Defolos] データの宣言は、C言語の変数の宣言のようなものです 23:18 [Defolos] msg: .ascii "hello" のように指定します 23:19 [Defolos] msg:というのはラベルで、今後このデータにアクセスするときのための表札です 23:19 [Defolos] つぎの.asciiディレクティブですが、 23:19 [Defolos] これはアスキー文字列を表しています 23:20 [Defolos] ascii以外にも.stringなどのディレクティブでも同じ意味を持ちますが 23:20 [Defolos] 近年asciiというディレクティブがでてきたそうですので、こちらを使っています 23:20 [Defolos] その次の"hello"は実際の文字列です 23:21 [Defolos] ここまでで、GASについての簡単な説明は終わりです 23:21 [Defolos] 今回はコンパイルテストが目的ですので 23:21 [Defolos] 詳しいことはシェルコード開発のところでもう一度説明します 23:21 [Defolos] ここまでで質問はありますか? 23:22 [mudai0] 今のところおkです。 23:22 [Defolos] 無いようでしたら、次に移りますね 23:23 [Defolos] コンパイルの行い方はちょっと飛ばして、次の例題0.2の説明に入ります 23:23 *AquO_ quit (Ping timeout) 23:23 [Defolos] Σ 23:23 [mudai0] !! 23:23 *AquO_ join (AquO_!^aquo@101CTKP.ctktv.ne.jp) 23:23 [Defolos] おかえりー 23:23 [mudai0] おけーり 23:23 [wahiko] おかえり 23:23 [Defolos] えと、続けますね 23:23 [AquO_] 申し訳ないです 23:24 [Defolos] 例題0.2は標準出力に「Hello!」と表示するプログラムをアセンブリで作れというものです 23:24 [Defolos] 標準出力はディスプレイのことです 23:24 [Defolos] 出力にはwriteシステムコールを用います 23:24 [Defolos] 先ほどアセンブリには高級な命令はないと言いましたが 23:25 [Defolos] システムコールというOS側が用意してくれた命令を利用する仕組みは存在しています 23:25 [Defolos] システムコールはごく簡単に言えばC言語の関数のようなものです 23:26 [Defolos] アセンブリでシステムコールを利用する方法ですが 23:26 [Defolos] まず、システムコールには第一引数、第二引数・・・・といった引数が必要です 23:26 [Defolos] この引数をアセンブリではレジスタで代用しています 23:27 [Defolos] つまり、eaxを第一引数、ebxを第二引数、ecxを第三引数とみなします 23:28 [Defolos] システムコールを使うときは、第一引数にシステムコール番号を入れ 23:28 [Defolos] ebx以降のレジスタにシステムコールの第一引数以降を設定します 23:28 [Defolos] すべての引数の設定が終わったら 23:28 [Defolos] システムコール割り込みをOSに発信します 23:29 [Defolos] そするとOSはシステムコールを実行したいのだなと理解してくれて、システムコールが実行されます 23:29 [Defolos] ここまではOKでしょうか 23:30 [wahiko] はい 23:30 [mudai0] おkですけど、いったいどういったソースコードになるのか想像が沸きません。 23:30 [Defolos] それについては、私と一緒にやってもらう形式にしますのでご安心ください 23:30 [mudai0] 了解です! 23:30 [AquO_] 僕も大丈夫です 23:31 [Defolos] では、vim hello.sと打ち込んでください 23:31 [Defolos] GASのソースコードは.sとする決まりになっていますので 23:31 [Defolos] C言語のときのように.cにしないようにお気をつけください 23:32 [Defolos] では、まず一番上に.code32と打ってください 23:32 [Defolos] 次に、エントリポイントを指定します 23:32 [Defolos] .globl main 23:32 [Defolos] main: 23:32 [Defolos] と打ってください 23:33 [Defolos] では、ここで一度資料をご覧ください 23:33 [Defolos] writeシステムコールで出力を行いますので、writeのプロトタイプを載せています 23:33 [Defolos] ssize_t write(int fd, const void *buf, size_t count); とありますね 23:34 [Defolos] 戻り値は今のところは無視してください 23:34 [Defolos] まず、第一引数はファイルディスクリプタ、つまり標準出力だと0ですね 23:34 [Defolos] 第二引数は文字列のアドレスです 23:35 [Defolos] 第三引数は文字列の長さですね 23:35 [Defolos] また、システムコール番号は4だと分かっていますので、 23:35 [Defolos] アセンブリに置き換えて考えると 23:36 [Defolos] eaxに4を、ebxに0を、ecxに文字列のアドレスを、edxに6を入れれば良いと分かります 23:36 [Defolos] これらの設定が終わったらint $0x80でシステムコール割り込みを発生させれば 23:36 [Defolos] 画面に文字列が表示されます 23:37 [Defolos] では、次にデータの宣言を行いましょう 23:37 [Defolos] msg: .ascii "Hello!" と次の行に打ってください 23:38 [Defolos] その上に、データであることを示すために.dataディレクティブをつけてください 23:39 [mudai0] 上の行ってことですか? 23:39 [Defolos] はい 23:39 [Defolos] あ、申し訳ないです、ちょっと間違えてました 23:39 [Defolos] .global main とmain:の行を 23:40 [Defolos] msg: ~~の次の行以降に移動させてください 23:41 [Defolos] このmain:の後ろ以降に先ほどの引数を設定する処理を書きます 23:41 [Defolos] まずはeaxに4を設定してみましょう 23:42 [Defolos] 先ほど説明したおとり 23:42 [Defolos] movl $4, %eax でOKです 23:43 [Defolos] GASではスペースの数などは特にこだわらないので 23:43 [Defolos] 適当な枡開けてもらって結構です 23:43 [Defolos] ただ、改行は変なところでしないようにご注意ください 23:44 [Defolos] また、コメントは#から改行までをコメントとします 23:44 [Defolos] 次に、第二引数を競って強います 23:44 [Defolos] 設定します 23:44 [Defolos] あ、ミスです 23:45 [Defolos] 第一引数でした 23:45 [Defolos] 第一引数は0ですので、第一引数を格納するebxに0を設定します 23:45 [Defolos] これも同じようにebxに0を代入してもらえればOKです 23:46 [Defolos] ここまでは大丈夫でしょうか 23:46 [mudai0] おkです。 23:46 [wahiko] はい 23:46 [AquO_] 大丈夫です 23:46 [Defolos] 途中経過を示しますと、次のようになっているはずです 23:46 [Defolos] .code32 23:46 [Defolos] 23:46 [Defolos] .data 23:46 [Defolos] msg: .ascii "Hello!" 23:46 [Defolos] 23:46 [Defolos] .global main 23:46 [Defolos] main: 23:46 [Defolos] 23:46 [Defolos] movl $4, %eax 23:46 [Defolos] movl $0, %ebx 23:47 [mudai0] おkです。 23:47 [Defolos] では次に行きますね 23:47 [Defolos] 次は第二引き数ですね 23:47 [Defolos] 第二引数には文字列のアドレスを設定することになっていました 23:47 [Defolos] アドレスをどうやって代入するかと申しますと 23:48 [Defolos] 先ほどのラベルを使います 23:48 [Defolos] ラベルはアドレスを示す表札のようなものですので 23:48 [Defolos] これを数値として認識させてレジスタに代入すればよいのです 23:48 [Defolos] つまり、$msgとすると 23:49 [Defolos] アドレスを数値として認識してレジスタへ代入することができます 23:49 [Defolos] movl $msg, %ecx のようにタイプします 23:49 [Defolos] 次に第三引数です 23:50 [Defolos] 第三引数には出力したい文字数を設定します 23:50 [Defolos] Hello! は6文字ですので 23:50 [Defolos] 6を設定します 23:50 [Defolos] もし「Hel」しか表示したくないのなら3を設定します 23:50 [Defolos] では同じように代入処理を書いて見ましょう 23:51 [Defolos] movl $6, %edx のようになりますね 23:51 [Defolos] ここまでで、引数の設定は完了しました 23:51 [Defolos] ですので、OSにシステムコールを実行してよ〜 という要求を出してみます 23:52 [Defolos] これにはint $0x80という命令を使います 23:52 [Defolos] システムコール割り込みをOSが感知すると 23:52 [Defolos] まずeaxの中身を読み込み 23:52 [Defolos] どんなシステムコールを実行したいのかを読み取ります 23:53 [Defolos] 後はそのシステムコールの引き数に従ってebx以降のレジスタを参照します 23:53 [Defolos] では、最後に 23:53 [Defolos] ret と書いてください 23:53 [Defolos] これは、ここまででプログラムは終わりですよと指し示すものになります 23:54 [Defolos] 書き終わったら、保存してvimを閉じてください 23:54 [Defolos] コードとしては次のようになっていると思います 23:54 [Defolos] .code32 23:54 [Defolos] 23:54 [Defolos] .data 23:54 [Defolos] msg: .ascii "Hello!" 23:54 [Defolos] 23:54 [Defolos] .global main 23:54 [Defolos] main: 23:54 [Defolos] 23:54 [Defolos] movl $4, %eax 23:54 [Defolos] movl $0, %ebx 23:54 [Defolos] movl $msg, %ecx 23:54 [Defolos] movl $6, %edx 23:54 [Defolos] int $0x80 23:54 [Defolos] ret 23:54 [Defolos] これをコンパイルするには、gccを使います 23:55 [Defolos] GASはGNUが開発したので、同じGNUが開発したgccでコンパイルできるわけです 23:55 [Defolos] gcc hello.s と入力してください 23:55 [Defolos] エラー無く終了しましたでしょうか? 23:55 [mudai0] ok 23:56 [yuushi_q] OK 23:56 [Defolos] では、./a.outと入力して 23:56 [Defolos] 実行してみてください 23:56 [wahiko] でましたOKです 23:56 [Defolos] Hello!defolos@glazheim:~$ のように表示されたと思います 23:57 [Defolos] 改行は指定していないので、このように続けて表示されます 23:57 [Defolos] 皆さんうまく表示されていますか? 23:58 [mudai0] okベイベー 23:58 [yuushi_q] 表示されました 23:59 *AquO__ join (AquO__!=aquo@210.233.192.101) 23:59 [Defolos] おかえりー 23:59 [mudai0] おかえー 00:00 [Defolos] aquoさんもちゃんと表示されていましたか? 00:00 [wahiko] お(ry 00:00 [AquO__] すみません。ちゃんと表示されました 00:00 [Defolos] OKそうですね 00:00 *AquO_ quit (Ping timeout) 00:00 [Defolos] これが、アセンブリの基礎のところです 00:01 [Defolos] 今回の目的であるコンパイルの実験はうまくいきましたので 00:01 [Defolos] これで今回の講義は終わりとします 00:01 [Defolos] お疲れ様でした 00:01 [AquO__] お疲れ様でした。ありがとうございました 00:01 [wahiko] お疲れさまです 00:01 [Defolos] 後は質問とかございましたら 00:01 [Defolos] 受け付けますー 00:01 [wahiko] 次回はどこまでしますか? 00:02 [Defolos] 次回ですか 00:02 [Defolos] 次回はハードウェアやらの知識の確認をしようと思っていますので 00:02 [Defolos] メモリとCPUの解説あたりを行うよう低です 00:02 [Defolos] 予定です 00:03 [wahiko] 有難うございます 00:03 [mudai0] えと・・接続できないのはどうしたらよいでしょうか? 00:03 [Defolos] それについては、次回までにどうにかしておきますTT 00:04 [Defolos] 何で入れないんだろうなぁ・・・ 00:04 [mudai0] ついでに・・wこのIRCはエンコードは何にしたらいいんでしょうか?linuxでは文字化けしちゃって・・ 00:04 [Defolos] んー 00:05 [Defolos] わかんないですね^^; 00:05 [mudai0] んじゃ今から色々試して見ますw 00:05 [Defolos] euc-jpかなぁ? お願いします 00:05 [Defolos] あと、私から質問してもいいでしょうか 00:05 [mudai0] どぞ・・ 00:05 *AquO__ quit (Ping timeout) 00:06 [Defolos] 今回の教え方はどうでしたか? 不平不満とかあると教えてもらえるとありがたいです 00:07 [mudai0] アセンブラのソースコードの説明については一度ずらっと表示してもらってそれを説明するタイプにしたほうがいいと思います。 00:07 [Defolos] なるほど 00:07 [Defolos] 確かに今回の方法は冗長すぎましたね 00:08 [Defolos] 他には教える内容が薄いとか、教え方が下手とかないでしょうか^^; 00:08 [mudai0] あとは別にありません。丁寧でよい感じでしたw 00:08 [Defolos] ありがとうございます