在汇编中,我想搜索一个字符串,替换一个单词,并显示新的字符串

时间:2013-04-24 10:34:26

标签: string assembly x86

我正在参加装配课程,我已经完成了大部分程序的编写,我只是在更换单词并显示新字符串时遇到了麻烦。问题要求一个句子,一个要查找的单词,以及一个用它来代替的单词。程序扫描字符串,替换单词的任何实例,并显示新字符串 例如:“天空是蓝色的。” 找到的词:“天空” 要取而代之的是:“海洋” 新字符串:“海洋是蓝色的。”

这是我到目前为止所做的:

.586
.MODEL FLAT

INCLUDE io.h            ; header file for input/output

.STACK 4096

.DATA
prompt1 BYTE    "String to Search: ", 0
prompt2 BYTE    "Word to Search For: ", 0
prompt3 BYTE    "Word to replace with: ", 0
target  BYTE    80 DUP (?)
key     BYTE    80 DUP (?)
strSub  BYTE    80 DUP (?)
trgtLength  DWORD   ?
keyLength   DWORD   ?
lastPosn    DWORD   ?
strSubLen   DWORD   ?
resultLbl BYTE  "The new sentence is: ", 0

.CODE
_MainProc PROC
    input prompt1, target, 80   ;input target string
    lea eax, target             ;address of target
    push eax                    ;parameter
    call strlen                 ;strlen(target)
    add esp, 4                  ;remove parameter
    mov trgtLength, eax         ;save length of target
    input prompt2, key, 80      ;input key string
    lea eax, key                ;address of key
    push eax                    ;parameter
    call strlen                 ;strlen(key)
    add esp, 4                  ;remove parameter
    mov keyLength, eax          ;save length of key
    input prompt3, strSub, 80   ;input word to search for
            lea eax, strSub             ;address of key
    push eax                    ;parameter
    call strlen                 ;strlen(strSub)
    add esp, 4                  ;remove parameter
    mov strSubLen, eax          ;save length of key

    mov eax, trgtLength
    sub eax, keyLength
    inc eax                     ;trgtLength - keyLength +1
    mov lastPosn, eax
    cld                         ;Left to Right comparison
    mov eax, 1                  ;starting position

    whilePosn:
        cmp eax, lastPosn       ;position <= last_posn?
        jnle endWhilePosn       ;exit if past last position

        lea esi, target         ;address of target string
        add esi, eax            ;add position
        dec esi                 ;address of position to check
        lea edi, key            ;address of key
        mov ecx, keyLength      ;number of position to check
        repe cmpsb              ;check
        jz found                ;exit of success
        inc eax                 ;increment position
        jmp whilePosn           ;repeat

    endWhilePosn:
        output resultLbl, [esi] ;display new sentence
        jmp quit

    found:
        sub edi, keyLength
        mov ecx, strSubLen
        lea esi, strSub
        cld
        rep movsb
        inc eax
        jmp whilePosn

    quit:
        mov     eax, 0  ; exit with return code 0
        ret
_MainProc ENDP


strlen  PROC
push ebp                    ;establish stack frame
mov ebp, esp
push ebx                    ;save EBX
sub eax, eax                ;length := 0
mov ebx, [ebp+8]            ;address of string

whileChar:
cmp BYTE PTR [ebx], 0       ;null byte?
je endWhileChar             ;exit if so
inc eax                     ;increment length
inc ebx                     ;point at next character
jmp whileChar               ;repeat

endWhileChar:
pop ebx                     ;restore registers
pop ebp
ret
strlen  ENDP
END

代码可以找到我要切换的单词,但实际上切换单词是骗我的。该书说目标字符串应该在EDI中,而要替换的单词应该在ESI中,但是他们给出的代码在ESI中有目标字符串,在EDI中有要替换的单词(就像我在这里)。 / p>

这本书在解释“rep”和“movs”指令方面做得非常糟糕,所以我90%确定我的“找到”代码块将成为问题所在。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

在处理x86程序集中的字符串时,必须快速掌握rep指令。如果没有,你可能会在第一个程序完成之前就过世。

可以在here(或here)中找到关于汇编中字符串操作的非常好的介绍,但您真正需要的是以下内容: