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