汇编如何比较字符串

时间:2017-03-24 07:24:57

标签: c string assembly comparison mixed

对于小型赋值,我们必须比较我们在C

中给出此代码的字符串
extern "C" {
    bool isStringEqual(const char *s1, const char *s2);
}

static char *testStrings[] = {
    "",
    "Test String 1",
    "Test String 2",
};
#define NUM_TEST_CASES  (sizeof (testStrings) / sizeof (char *))

int main()
{
    printf("CSIS\n\n");

    for (int i = 0; i < NUM_TEST_CASES; i++) {
        printf("Input string [%s] [%s] yields: %s\n ", testStrings[i], testStrings[i],
            isStringEqual(testStrings[i], testStrings[i]) ? "true" : "false");
    }

    printf("Input string [%s] [%s] yields: %s\n ", testStrings[1], testStrings[2],
        isStringEqual(testStrings[1], testStrings[2]) ? "true" : "false");

    system("PAUSE");

    return 0;
}

我们必须编写执行此逻辑的asm

;           while (*s1 != 0 && *s2 != 0) {
;               if (*s1 != *s2)
;               return false;
;           }
;           return true

之前我们之前做的是比较在C中输入的数字,然后在asm中进行一些比较和计算。那很好,我完全理解了这些,我在这里遇到麻烦的是理解给定的C和字符串是什么(它们看起来都像是#34;我和#34;对我来说或者可能是1和2 ??) 。 第二件事是找出我如何比较两个字符串。 我理解跳转和比较是如何工作的,并且可以使循环很好,只是不知道如何比较字符串......

这是我的asm运行但会使所有内容仍然打印出来

输入

 Input string [Test String 1] [Test String 1] yields: true
 Input string [Test String 2] [Test String 2] yields: true
 Input string [Test String 1] [Test String 2] yields: true
 Press any key to continue . . .

我的主持人:

isStringEqual PROC PUBLIC
    PUSH    ebp             ; save caller base pointer
    MOV     ebp, esp        ; set our base pointer
    PUSH    edi
    PUSH    esi             


;--------------------------------------------------------
;           while (*s1 != 0 && *s2 != 0) {
;               if (*s1 != *s2)
;               return false;
;           }
;           return true
;-----------------------------------------------------------  
  mov esi, [ebp+8]              ;get s1
    mov edi, [ebp+12]               ;get s2

    MOV ebx, 0                      ;move 0 into ebx
str_cmp_loop:
MOV al, [esi + ebx]             ;goes right to left for string
CMP al, [edi + ebx]             ;compares 
JNE str_ret_false
CMP al, 0
JE str_ret_true
INC ebx
JMP str_cmp_loop

str_ret_false:

PUSH eax
PUSH OFFSET fmt         ; push the string format
ADD esp, (2 * 4)        ; clear the stack
POP esi 
POP edi
MOV esp, ebp            ; deallocate locals
POP ebp              ; restore caller base pointer
RET

str_ret_true:

PUSH eax
PUSH OFFSET fmt         ; push the string format
ADD esp, (2 * 4)        ; clear the stack
POP esi 
POP edi
MOV esp, ebp            ; deallocate locals
POP ebp                  ; restore caller base pointer
RET
isStringEqual ENDP  ; end the procedure
END isStringEqual

有人可以帮助我,这样我就可以睡觉了......

0 个答案:

没有答案