1 TITLE MASM Template (main.asm) 2 3 ; Description: 4 ; 5 ; Revision date: 6 7 .686P ; Pentium Pro or later 8 .MODEL flat, stdcall 9 .STACK 4096 10 option casemap:none; 大小写不敏感 11 12 13 printf PROTO C :ptr byte,:vararg 14 scanf PROTO C :dword,:vararg 15 gets PROTO C :ptr byte 16 getchar PROTO C 17 ExitProcess PROTO :DWORD ; exit program 18 psum PROTO :DWORD 19 20 INCLUDELIB C:\ASM\USER32.LIB 21 INCLUDELIB C:\ASM\KERNEL32.LIB 22 INCLUDELIB C:\ASM\MSVCRT.LIB 23 24 exit equ <INVOKE ExitProcess,0> 25 26 chr$ MACRO any_text:VARARG ;老师的神码 27 LOCAL txtname 28 .data 29 IFDEF __UNICODE__ 30 WSTR txtname,any_text 31 align 4 32 .code 33 EXITM <OFFSET txtname> 34 ENDIF 35 36 txtname db any_text,0 37 align 4 38 .code 39 EXITM <OFFSET txtname> 40 ENDM 41 42 .data 43 count dword 0 44 .code 45 main PROC 46 invoke printf,chr$("Please input the count: ") 47 invoke scanf, chr$("%d"),offset count 48 invoke getchar ;注意用scanf后一定要有这个调用,去掉键盘缓冲区的回车符。 49 50 invoke psum,count 51 invoke printf,chr$("The result is: %d",0dh,0ah),EAX 52 invoke getchar 53 54 exit 55 main ENDP 56 57 psum PROC uses ECX,cnt:dword 58 local i:DWORD,sum:DWORD 59 MOV EAX,0 ;返回值在EAX,将EAX清零,使其中的数不会影响最后的求和 60 MOV ECX,cnt ;count 61 MOV i,ECX 62 CMP ECX,0 63 JZ L2 64 L1: ADD EAX,ECX 65 LOOP L1 66 L2: MOV sum,EAX 67 RET 4 ;默认返回一个一个地址即4个字节 68 psum ENDP 69 70 END main