開発環境 |
Microsoft Visual Studio Community 2019 |
実行環境 |
Microsoft Windows 10 Home (64bit) |
プロジェクト テンプレート |
空のプロジェクト(C++) |
プロジェクト名 |
uselibc |
asmファイルの追加
uselibc.asm
includelib libcmt.lib
includelib legacy_stdio_definitions.lib
.model flat, c
;extern c printf:proc ; for call
printf proto c :ptr byte, :vararg ; for invoke
.data
fmt1 byte 'argc: %d', 0ah, 0
fmt2 byte '%d: %s', 0ah, 0
.code
main proc uses esi edi,
argc:dword, argv:ptr ptr byte ; int argc, char** argv
invoke printf, addr fmt1, argc
mov esi, argv ; char** p = argv
xor edi, edi ; int n = 0
@@:
mov eax, dword ptr [esi] ; while (*p)
test eax, eax
je @f
invoke printf, addr fmt2, edi, eax
inc edi ; n++
lea esi, dword ptr [esi+4] ; p++
jmp @b
@@:
xor eax, eax
ret
main endp
end
/*
C++ (x86 msvc v19.27) /O2
*/
#include <stdio.h>
int main(int argc, char** argv)
{
printf("argc: %d\n", argc);
char** p = argv;
int n = 0;
while (*p) {
printf("%d: %s\n", n, *p);
n++;
p++;
}
}
ビルド
システム |
サブシステム |
コンソール (/SUBSYSTEM:CONSOLE) |
uselibc.lst から抜粋
.
00000000 main proc uses esi edi,
argc:dword, argv:ptr ptr byte ; int argc, char** argv
00000000 55 * push ebp
00000001 8B EC * mov ebp, esp
00000003 56 * push esi
00000004 57 * push edi
invoke printf, addr fmt1, argc
00000005 FF 75 08 * push dword ptr ss:[ebp]+000000008h
00000008 68 00000000 R * push OFFSET fmt1
0000000D E8 00000000 E * call printf
00000012 83 C4 08 * add esp, 000000008h
00000015 8B 75 0C mov esi, argv ; char** p = argv
00000018 33 FF xor edi, edi ; int n = 0
0000001A @@:
0000001A 8B 06 mov eax, dword ptr [esi] ; while (*p)
0000001C 85 C0 test eax, eax
0000001E 74 15 je @f
invoke printf, addr fmt2, edi, eax
00000020 50 * push eax
00000021 57 * push edi
00000022 68 0000000A R * push OFFSET fmt2
00000027 E8 00000000 E * call printf
0000002C 83 C4 0C * add esp, 00000000Ch
0000002F 47 inc edi ; n++
00000030 8D 76 04 lea esi, dword ptr [esi+4] ; p++
00000033 EB E5 jmp @b
00000035 @@:
00000035 33 C0 xor eax, eax
ret
00000037 5F * pop edi
00000038 5E * pop esi
00000039 C9 * leave
0000003A C3 * ret 00000h
0000003B main endp
実行
最終更新:2020年10月20日 06:52