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