Cette fonction prend une chaîne d'entrée et vérifie s'il s'agit d'un palindrome ou non. Il casse cependant en raison d'une erreur de mémoire. Je l'ai regardé pendant quelques heures mais je n'arrive pas à comprendre le problème. Il y a beaucoup de poussées inutiles mais j'ai peur de jouer avec et de casser encore plus. Apprécierait toute aide.Vérification de Palindrome dans l'assemblage MASM
__declspec(naked)
int isPalindrome(char *input_string, int left_index, int right_index)
{
// C code to be converted to x86 assembly
/*
// Input Validation
if (NULL == input_string || left_index < 0 || right_index < 0){
return -1;
}
// Recursion termination condition
if (left_index >= right_index)
return 1;
if (input_string[left_index] == input_string[right_index]){
return isPalindrome(input_string, left_index + 1, right_index - 1);
}
return -1;
*/
__asm{
mov eax, 0
// BEGIN YOUR CODE HERE
push ebp
push edi
mov ebp, esp;
mov ebx, input_string
mov esi, [ebp+12]
mov edi, [ebp+16]
//push edi;
push esi;
push ebx;
// mov some_register, [esp + 8]
mov ebx, input_string
// mov esi, left_index // esi
// mov esi, [esp + 8]
mov edi, right_index // edi
cmp esi, 0;
jl FALSE;
cmp edi, 0
jl FALSE
cmp ebx, 0x00
je FALSE
cmp esi, edi
jge TRUE
mov cl, byte ptr[ebx + esi]
mov dl, byte ptr[ebx + edi]
cmp cl, dl
je RECURSIVE
jmp FALSE
RECURSIVE:
inc esi
dec edi
push eax
push ecx
push edx
push esi
push edi
call isPalindrome
//sub ebp, 8
pop edx
pop ecx
pop edx
jmp END
FALSE:
mov eax, -1
jmp END
TRUE:
mov eax, 1
jmp END
END:
pop ebx;
pop esi;
pop edi;
mov esp, ebp;
pop ebp;
// END YOUR CODE HERE
ret
}
}
donc si vous lui donnez chaîne " abba ", quelles sont les valeurs que vous voyez dans les registres dans la seconde profondeur d'appel? Si je lis correctement le code, la seconde profondeur de la profondeur a déjà presque toutes les valeurs d'argument erronées (plus après le retour, le niveau supérieur échouera probablement à retourner). Vous n'avez pas besoin de le regarder, de le lancer dans l'instruction du débogueur par instruction, avec du papier + stylo au bureau, d'écrire des notes sur les valeurs dans les registres et de les comparer avec les attentes et les définitions des données. – Ped7g
Oui, le problème est que la fonction est appelée avec les anciens arguments, les index gauche et droit ne sont pas mis à jour dans l'appel reclus. –
Ce n'est tout simplement pas vrai. Lors de la première entrée de la fonction, 'left_index' est à l'adresse' esp + 8', ce qui donnera par exemple 0x0150. Au second niveau de récursion, le 'left_index' est à nouveau' esp + 8', mais après avoir évalué cela ne pointe plus vers '0x0150', donc vous ne récupérez pas les anciens arguments. Vous pouvez obtenir des arguments faux, mais le "vieux" est toujours assis à "0x0150" en mémoire. Alors commencez à prêter attention à la valeur 'esp', et ouvrez également la fenêtre de mémoire pour regarder le contenu de la pile, comment cela évolue. Cela dit, beaucoup de débogueurs ont une vue spécialisée juste pour la pile, ce qui la rend bien mise à jour) – Ped7g