トップ 最新 追記

yoggy's diary

〜せかいのすみっこから〜


2007-08-06

C->アセンブラのメモ

とりあえずCでコードを書いてみる。

 $ vi test1.c

   int f1(int a, int b)
   {
     int c;
     c = a + b;
     return c;
   }

   int main(int argc, char *argv[])
   {
     int a, b, c;
     a = 1;
     b = 2;
     c = f1(a, b);
     return 0;
   }

 $ ls
 test1.c

次に、-g付きでコンパイル

 $ gcc -g -o test1 test1.c
 $ ls -F
 test*     test1.c

objdumpを使って、できた実行ファイルを見てみる。 -dは逆アセンブルするオプション。-Sは対応するソースコードを表示(gcc -gでコンパイルする必要あり)。

 $ objdump -Sd ./test1 | lv
                ・
                ・
                ・
   08048354 <f1>:
   int f1(int a, int b)
   {
    8048354:       55                      push   %ebp
    8048355:       89 e5                   mov    %esp,%ebp              #ベースポインタ(%ebp)の設定
    8048357:       83 ec 04                sub    $0x4,%esp              #スタックポインタ(%esp)の設定
     int c;
     c = a + b;
    804835a:       8b 45 0c                mov    0xc(%ebp),%eax         #変数aの値を%eaxに代入
    804835d:       03 45 08                add    0x8(%ebp),%eax         #変数bと%eaxを足す。結果は%eaxに入る
    8048360:       89 45 fc                mov    %eax,0xfffffffc(%ebp)  #%eaxを変数cに代入
     return c;
    8048363:       8b 45 fc                mov    0xfffffffc(%ebp),%eax  #returnの値は%eaxで渡す決まりなので、
   }                                                                     #変数cの値を%eaxへ代入
    8048366:       c9                      leave
    8048367:       c3                      ret                           #callした次のアドレスへ戻る。
                                                                         #ここでは0x8048398に戻る
   08048368 <main>:

   int main(int argc, char *argv[])
   {
    8048368:       55                      push   %ebp
    8048369:       89 e5                   mov    %esp,%ebp               #ベースポインタ(%ebp)の設定
    804836b:       83 ec 18                sub    $0x18,%esp
    804836e:       83 e4 f0                and    $0xfffffff0,%esp
    8048371:       b8 00 00 00 00          mov    $0x0,%eax
    8048376:       29 c4                   sub    %eax,%esp               #スタックポインタ(%esp)の設定
     int a, b, c;
     a = 1;
    8048378:       c7 45 fc 01 00 00 00    movl   $0x1,0xfffffffc(%ebp)   #変数aに1を代入
     b = 2;
    804837f:       c7 45 f8 02 00 00 00    movl   $0x2,0xfffffff8(%ebp)   #変数bに2を代入
     c = f1(a, b);
    8048386:       8b 45 f8                mov    0xfffffff8(%ebp),%eax   #f1()を呼ぶときの引数を準備
    8048389:       89 44 24 04             mov    %eax,0x4(%esp)          #変数a,bの値をスタックに代入している
    804838d:       8b 45 fc                mov    0xfffffffc(%ebp),%eax
    8048390:       89 04 24                mov    %eax,(%esp)
    8048393:       e8 bc ff ff ff          call   8048354 <f1>            #関数f1()を呼ぶ。
    8048398:       89 45 f4                mov    %eax,0xfffffff4(%ebp)   #戻り値は%eaxに入ってるので、それを変数cに代入
     return 0;
    804839b:       b8 00 00 00 00          mov    $0x0,%eax
   }
    80483a0:       c9                      leave
    80483a1:       c3                      ret
    80483a2:       90                      nop
    80483a3:       90                      nop
    80483a4:       90                      nop
                  ・
                  ・
                  ・

見るポイント

  • ローカル変数がどのようにスタック上に割り当てられているか?
  • 関数呼び出しを行う際の引数の渡し方
  • 関数呼び出しを行った際の%ebp, %espの使われ方
    • f1()の先頭で%espをスタックへpushした後に、%ebp.%espを設定している部分
    • leaveを使って%ebp, %espを前の状態に戻している

2007-08-07

HackerJapan9月号は8月8日発売です!

明日発売のハッカージャパン9月号に、チームチドリで執筆したCTFの予選参戦記が掲載されます。おたのしみにー。


2007-08-08

分解

メモリの増設とHDDの換装。分解はスクレイパーと細長いドライバがあれば意外と簡単w

画像の説明


2007-08-16

TwitterとPC-OP-RS1とPlaggerで暑い日々を涼しく過ごす?

最近、非常に暑い日が続いて自宅に帰ったときに部屋が超暑いので、 Twitterに「あついー」と書いたら、自宅のエアコンをONする仕掛けを Plaggerで作ってみました。

エアコンの制御には、BUFFALOの赤外線学習リモコン PC-OP-RS1を使いました。

config.yamlはこんな感じで。

 plugins:
   - module: CustomFeed::Twitter
     config:
       username: twitterのユーザ
       password: twitterのパスワード

   - module: Filter::Rule
     rule:
       - module: Fresh
         mtime:
           path: /Users/yoggy/plagger/fresh.tmp
           autoupdate: 1

   - module: Filter::Rule
     rule:
       expression: $args->{entry}->{title} =~ /あついー/

   - module: Publish::Pipe
     config:
       command: /Users/yoggy/plagger/irrc -d /dev/cu.usbserial-0000080c aon

単純に「あついー」という文字列が書いてあったら、 PC-OP-RS1を制御するirrcコマンドを実行しているだけです。

CustomFeed::Twitterの入手先はこちらから

PC-OP-RS1をコントロールするためのirrcコマンドについてはこちら

現在Mac miniで動かしているのですが、MacでPC-OP-RS1を 使えるようにするための手順はこちら。

念のために、これを動かすときは自己責任でお願いします。 Twitterの調子が悪くてエアコンがつかなかったり、部屋に誰もいないときに クーラーから水が落ちてきて水浸しになったりしても知りませんw


トップ 最新 追記

2003|01|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|
2010|01|02|03|