「ASM/startup」の編集履歴(バックアップ)一覧に戻る

ASM/startup - (2020/10/20 (火) 19:48:30) のソース

|開発環境|Microsoft Visual Studio Community 2019|
|実行環境|Microsoft Windows 10 Home (64bit)|
|プロジェクト テンプレート|空のプロジェクト(C++)|
|プロジェクト名|startup|
#table_zebra(t,#fee,#eef)

**asmファイルの追加

startup.asm
#highlight(asm){{
.model flat, c

NULL			equ	0
STD_OUTPUT_HANDLE	equ	-11

CommandLineToArgvW	proto stdcall :ptr, :ptr
ExitProcess		proto stdcall :dword
GetCommandLineW		proto stdcall
GetStdHandle		proto stdcall :dword
WriteConsoleW		proto stdcall :dword, :ptr, :dword, :ptr, :ptr
wsprintfW		proto c :ptr, :ptr, :vararg

main	proto c :dword, :ptr
print1	proto c :ptr, :dword

.data

fmt1		word	'a','r','g','c',':',' ','%','d',0ah,0
fmt2		word	'%','d',':',0
fmt3		word	'[','%','s',']',0ah,0

.data?

hConsole	dword	?

.code

startup proc
	local	argc:dword
	local	argv:ptr

	invoke	GetStdHandle, STD_OUTPUT_HANDLE
	mov	hConsole, eax

	invoke	GetCommandLineW
	mov	edx, eax
	invoke	CommandLineToArgvW, edx, addr argc
	mov	argv, eax

	invoke	main, argc, argv
	invoke	ExitProcess, eax
	ret
startup endp

main proc uses esi edi,
	argc:dword, argv:ptr		; int argc, word** argv

	invoke	print1, addr fmt1, argc

	mov	esi, argv		; word** p = argv
	xor	edi, edi		; int n = 0
@@:
	mov	eax, dword ptr [esi]	; while (*p)
	test	eax, eax
	je	@f
	invoke	print1, addr fmt2, edi
	invoke	print1, addr fmt3, dword ptr [esi]
	inc	edi			; n++
	lea	esi, dword ptr [esi+4]	; p++
	jmp	@b
@@:
	mov	eax, 0
	ret
main endp

print1 proc fmt:ptr, param:dword
	local	buf[256]:word
	local	written:dword

	invoke	wsprintfW, addr buf, fmt, param
	mov	edx, eax	; len
	invoke	WriteConsoleW, hConsole, addr buf, edx, addr written, NULL
	ret
print1 endp

end startup
}}

**ビルド

・リンカー
|システム|サブシステム|コンソール (/SUBSYSTEM:CONSOLE)|
#table_zebra(t,#fee,#eef)

**実行

&image(startup.png)