開発環境 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
添付ファイル