初期化・未初期化データセクションに配置せず、実行コードのセクションに持たせる、つまり実行コード内でstack領域に展開するコードを自動生成する。 pushstack.c: #code|c|> #include #include int main(int argc, char *argv[]) { int len, d; int i, j, k; char *src; char cbuf[4]; char *offset_label = "OFFSET"; if (2 > argc) { fprintf(stderr, "usage: %s push_string \n", argv[0]); return 1; } src = argv[1]; len = strlen(src); if (3 == argc) { offset_label = argv[2]; } printf("; '%s', 0 (%d = 0x%X bytes)\n", src, len + 1, len + 1); printf("%%define %s ebp - 0000h\n", offset_label); d = len / 4; if (len % 4) { d++; } for (i = 0, j = 0, k = 0; i < d; i++) { cbuf[0] = src[j++]; cbuf[1] = (j > len) ? 0 : src[j++]; cbuf[2] = (j > len) ? 0 : src[j++]; cbuf[3] = (j > len) ? 0 : src[j++]; printf("mov eax, 0%02X%02X%02X%02Xh\n", cbuf[3], cbuf[2], cbuf[1], cbuf[0]); printf("mov dword[%s + 0%Xh], eax\n", offset_label, k); k += 4; } return 0; } ||< 使い方: > pushstack abcdef STR1 ; 'abcdef', 0 (7 = 0x7 bytes) %define STR1 ebp - 0000h mov eax, 064636261h mov dword[STR1 + 00h], eax mov eax, 000006665h mov dword[STR1 + 04h], eax 出力をぺたりとnasmソースにはりつけ、STR1のマクロでEBPのoffsetを適当に調整してあげればOK。 UnicodeやMBCSには未対応。 "xor eax, eax"も入れてきちんとゼロクリアした方が良いかな? 後はお好みに応じて適当に改造して下さい。