コンパイラによる最適化

 コンパイラによる最適化で思ったようにクラック出来なかった原因を探るため、

次のようなコードを書いてみた。

#include <stdio.h>
#include <string.h>

int main()
{
    int i = 256;
    int j = 1024;
   
    return 0;
}

VC++でコンパイルし、出力されたアセンブリコードを見てみる。

最初は最適化オプションオフ。



教科書どおりだ。

次に最適化オン。



i=256などとしても以後使用されないので領域確保しても無駄である。

なので変数の代入はおろか、領域確保さえ行われない。

昨日書いたコードが最適化によってうまく動かなかったのはこういう事情があったようだ。

コンパイル時点で変数の要不要が判断できないようなプログラムを書けばいいかな、と思ったがそれだけではだめなようだ。

ローカル変数の格納場所が教科書どおりではないかも。

ゆっくり読み解かないと。
ジャジャガッチ | アセンブリ言語 | 21:43 | comments(0) | trackbacks(0) |

VC++でバッファオーバーフロー実験

VC++でコンパイルしたプログラムに対してバッファオーバーフローを利用したクラックができるか試してみた。

出来ない。

最適化オプションを切ってみた。

出来た。

最適化はそういうところにも影響するのか。

ついでに他のあやしげなオプションも全部オフにしてみた。

VC++で出力したアセンブリ言語はわけわからんと思ってたが、これなら読めそう。

暇なときに解読しよう。
ジャジャガッチ | アセンブリ言語 | 21:59 | comments(0) | trackbacks(0) |

アセンブリ言語:リターンアドレスの確認

 久々のアセンブリ言語。

C言語をディスアセンブルして勉強。

main関数から他の関数を呼び出すと、復帰するためにリターンアドレスを記憶しておく必要がある。

通常、これはベースポインタ(ebp)の指すアドレスの次のアドレスに入っている。

これを確認した。

fサブルーチンをcallして制御が移ったところで止めている。

この状態でebpの指すアドレスの次を確認すると・・・



ちゃんと戻り先が記憶してある。
ジャジャガッチ | アセンブリ言語 | 20:19 | comments(0) | trackbacks(0) |

離散フーリエ変換

 今日はちょっくら離散フーリエ変換についてまとめていた。

GSLを使えば簡単に実装できる。

#include <stdio.h>
#include <stdlib.h>
#include <gsl/gsl_fft_complex.h>
#include <gsl/gsl_complex_math.h>
#include <gsl/gsl_complex.h>
#include <gsl/gsl_math.h>
#include <math.h>
#define N 1024
#define f 100.0
#define PATH1 "C:¥¥Users¥¥gacchi¥¥Desktop¥¥gnuplot¥¥binary¥¥real.txt"
#define PATH2 "C:¥¥Users¥¥gacchi¥¥Desktop¥¥gnuplot¥¥binary¥¥imag.txt"

void Set_Data(double *data,gsl_complex *c)
{
    for(int i=0;i<N;i++)
    {
        data[2*i] = c[i].dat[0];//実部セット
        data[2*i+1] = c[i].dat[1];//虚部セット
    }
}

void Sine(gsl_complex *c)
{
    for(int i=0;i<N;i++)
    {
        c[i].dat[0] = sin(2.0*M_PI*f*(double)i/(double)N);
        c[i].dat[1] = 0.0;
    }
}

void Set_Comp(gsl_complex *c,double *data)
{
    for(int i=0;i<N;i++)
    {
    GSL_SET_COMPLEX(&c[i],data[2*i],data[2*i+1]);
    }
}


int main()
{
    gsl_fft_complex_wavetable *wt;
    gsl_fft_complex_workspace *ws;
    double data[2*N];//実数と複素数分
    gsl_complex c[N];

    wt = gsl_fft_complex_wavetable_alloc(N);//fftで使用する三角関数表作成。引数はデータ数(複素数1つで1データ)。

    ws = gsl_fft_complex_workspace_alloc(N);

    Sine(c);
    Set_Data(data,c);
    gsl_fft_complex_forward(data,1,N,wt,ws);//フーリエ変換の実行。実行結果はdataに格納されている。
    Set_Comp(c,data);

    FILE *fp = fopen(PATH1,"w");
    FILE *fp2 = fopen(PATH2,"w");
   
    for(int i=0;i<N;i++)
    {
        fprintf(fp,"%d %f¥n",i,c[i].dat[0]);
        fprintf(fp2,"%d %f¥n",i,c[i].dat[1]);
    }

    fclose(fp);
    fclose(fp2);

    gsl_fft_complex_wavetable_free(wt);
    gsl_fft_complex_workspace_free(ws);
    return 0;
}

ジャジャガッチ | 数学 | 15:41 | comments(0) | trackbacks(0) |

フーリエ光学

 フーリエ光学面白い。

今日はフレネル回折積分を計算して、レンズ前後の二つの焦平面が
フーリエ変換の関係にあることを証明した。

焦平面で完全に位相がそろっている場合は実関数のフーリエ変換になっていて、

位相分布がある場合は複素関数のフーリエ変換になっている。

凸レンズに平行光をいれるとスポットになるのは定数のスペクトルは空間周波数0(DC成分)
のところだけが0でない値を持つからだ。

ここらへんのことはヘクトの13章にわかりやすく解説してある。
ジャジャガッチ | 物理 | 15:47 | comments(0) | trackbacks(0) |
1/1PAGES | |

02
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
--
>>
<<
--
PR
RECOMMEND
RECENT COMMENT
MOBILE
qrcode
OTHERS
Since 2013/09/17
LATEST ENTRY
CATEGORY
ARCHIVE
LINKS
PROFILE
SEARCH