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 :dword,:vararg
14 scanf PROTO C :dword,:vararg
15 gets PROTO C :dword
16 getchar PROTO C
17 ExitProcess PROTO,dwExitCode:DWORD ; exit program
18 exit EQU <INVOKE ExitProcess,0>
19
20 INCLUDELIB C:\asm\USER32.LIB
21 INCLUDELIB C:\asm\KERNEL32.LIB
22 INCLUDELIB C:\asm\MSVCRT.LIB
23
24 chr$ MACRO any_text:VARARG ;老师的神码
25 LOCAL txtname
26 .data
27 txtname db any_text,0
28 align 4
29 .code
30 EXITM <OFFSET txtname>
31 ENDM
32
33 .data
34 buf byte 256 dup(0)
35 .code
36 main PROC
37 invoke printf,chr$("Please input the string: ")
38 invoke scanf, chr$("%s"),offset buf
39 invoke getchar ;把scanf的回车换行清掉
40
41 lea EBX,buf ;lea 将buf 的 地址给ebx 同时 用 mov EBX, offset buf 可替换该句
42 BEGIN: CMP byte ptr [EBX],0
43 JZ XCHGL
44 CMP byte ptr [EBX],'a'
45 JB NEXT
46 CMP byte ptr [EBX],'z'
47 JA NEXT
48 SUB byte ptr [EBX],20H
49 NEXT: INC EBX
50 JMP BEGIN
51
52 XCHGL: LEA ESI,buf
53 MOV EDI,EBX
54 DEC EDI
55 EXCHANGE:CMP ESI,EDI
56 JAE OVER
57 MOV AL,[ESI]
58 XCHG AL,[EDI]
59 MOV [ESI],AL
60 INC ESI
61 DEC EDI
62 JMP EXCHANGE
63
64 OVER: invoke printf,chr$("The result is: %s",0dh,0ah),offset buf ; 关于buf前面的offset问题,我觉得应该是因为字符串在存储
65 ;还是以数组的形式存的,所以前面要加上offset取数组的首地 ;址,当buf不是字符串,而是整型数时,就不用offset了
66 invoke getchar
67 exit
68 main ENDP
69
70 END main