汇编心得(三) 调用子程序

 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

 

posted @ 2012-04-19 20:23  windynightst  阅读(461)  评论(0编辑  收藏  举报