汇编学习心得(二)关于字符的处理

 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

 

posted @ 2012-04-18 19:16  windynightst  阅读(322)  评论(0编辑  收藏  举报