功能:定义不定长参数子程序MyPrint,使用printf打印输出到控制台 实现:获取参数的个数,我是通过字符串中'%'字符个数确定的 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 使用 nmake 或下列命令进行编译和链接: ; ml /c /coff Test.asm ; rc Test.rc ; Link /subsystem:console Test.obj Test.res ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .386 .model flat,stdcall option casemap:none ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; Include 文件定义 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib includelib msvcrt.lib printf PROTO C :ptr sbyte, :vararg ;DbgPrint PROTO C :ptr sbyte, :vararg ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 数据段 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .const szMsg db 'yes', 0 szFormat db 'ISR messageID %d %s (serviced=0x%2x)', 0 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 代码段 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .code main proc ;local @iMsgID dd 0 ;local @szMsg:db 'yes', 0 ;local @iServiced:dd 1 ;local @szFormat:db 'ISR messageID %d %s (serviced=0x%2x)', 0 push ebp mov ebp, esp mov ecx, 0 ;iMsgID mov edx, 1 ;iServiced push edx push offset szMsg push ecx push offset szFormat call MyPrint add esp, 10h pop ebp ret main endp MyPrint proc push ebp mov ebp, esp sub esp, 04h mov eax, dword ptr [ebp+08h] mov ecx, 1h L10: cmp byte ptr [eax], 0 je L30 cmp byte ptr [eax], 025h je L20 inc eax jmp L10 L20: inc ecx inc eax jmp L10 L30: mov edx, ecx L40: mov ebx, ecx dec ebx shl ebx, 2 add ebx, 08h mov eax, dword ptr [ebp+ebx] push eax dec ecx cmp ecx, 0 jne L40 shl edx, 2 mov [ebp-04h], edx call printf add esp, [ebp-04h] add esp, 04h pop ebp ret MyPrint endp start: call main invoke ExitProcess,NULL ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> end start ;import printf