对于小型赋值,我们必须比较我们在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
有人可以帮助我,这样我就可以睡觉了......