1

IDA Proを使用して次のCコードを逆アセンブルしています。ただし、以下の逆アセンブルを見ると、不完全に見えます。データはスタックにロードされているように見えても(Cコードに従って)初期化されることはありませんが、00401040にあるプロシージャ(nullsub_1)はデータを使用しませんか?私は正しい評価をしていますか、それとも何かが足りませんか?Visual C++6/2005を使用してCコードをコンパイルしました。

#include <stdio.h>
#include <windows.h>

struct a
{
    char s[10];
    BYTE b;
    int i;
};

a al;
void init(a);
void main()
{
    init(al);
};

void init(a c)
{
    for(int j = 0; j < 10; j++) c.s[j] = 'A';
    c.b = 10;
    c.i = 10000;
};


.text:00401000 ; int __cdecl main(int argc,const char **argv,const char *envp)
.text:00401000 _main           proc near               ; CODE XREF: start+AFp
.text:00401000
.text:00401000     argc            = dword ptr  4
.text:00401000     argv            = dword ptr  8
.text:00401000     envp            = dword ptr  0Ch
.text:00401000
.text:00401000                 mov     ecx, dword_4084C0
.text:00401006                 mov     edx, dword_4084C4
.text:0040100C                 sub     esp, 10h
.text:0040100F                 mov     eax, esp
.text:00401011                 mov     [eax], ecx
.text:00401013                 mov     ecx, dword_4084C8
.text:00401019                 mov     [eax+4], edx
.text:0040101C                 mov     edx, dword_4084CC
.text:00401022                 mov     [eax+8], ecx
.text:00401025                 mov     [eax+0Ch], edx
.text:00401028                 call    nullsub_1
.text:0040102D                 add     esp, 10h
.text:00401030                 retn
.text:00401030 _main           endp
.text:00401030
.text:00401030 ;     
.text:00401031                 align 10h
.text:00401040
.text:00401040
.text:00401040
.text:00401040 nullsub_1       proc near               ; CODE XREF: _main+28p
.text:00401040                 retn
.text:00401040 nullsub_1       endp
4

1 に答える 1

4

ソース コードには、メモリへの書き込み以外の副作用はありません。コンパイラは、これらの書き込みを無駄なものとして排除します。

(リリースではなく) デバッグ モードでコンパイルするか、一部のコンパイラの最適化をオフにすると、うまくいく可能性があります。

または、として定義された変数へのアクセスはvolatile保持されるため、コードに追加できvolatileます。

于 2012-08-04T05:46:05.417 に答える