本文共 2060 字,大约阅读时间需要 6 分钟。
功能:定义不定长参数子程序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.incinclude user32.incincludelib user32.libinclude kernel32.incincludelib kernel32.libincludelib msvcrt.lib printf PROTO C :ptr sbyte, :vararg ;DbgPrint PROTO C :ptr sbyte, :vararg ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 数据段;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .constszMsg db 'yes', 0szFormat db 'ISR messageID %d %s (serviced=0x%2x)', 0;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 代码段;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .codemain 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 retmain endpMyPrint proc push ebp mov ebp, esp sub esp, 04h mov eax, dword ptr [ebp+08h] mov ecx, 1hL10: 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, ecxL40: 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 retMyPrint endpstart: call main invoke ExitProcess,NULL;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> end start ;import printf
转载地址:http://mzppi.baihongyu.com/