2017-06-15 5 views
2

Je cherche à résoudre un exercice que j'ai trouvé en ligne pour me préparer au prochain examen sur Microsoft Assembler. Ainsi, le texte disent que je dois créer un fichier .asm qui fonctionne avec la chaîne:comment trouver un mot dans une chaîne et enregistrer le déplacement

#include <stdio.h> 
#include <string.h> 

int saveworddisplacement(char *s, char *d, char *word1); 

int main(){ 
    char s[25] = { "sopra la panca la capra campa" }; 
    char d[25] = {""}; 
    char word1[] = { "capra" }; 
    saveworddisplacement(s, d, word1); 
    //printf("%s\n", s); 
    printf("%s", d); 

    getchar(); 
} 

La fonction (en MASM) doit travailler sur la première chaîne « l » et le mot « word1 » puting le résultat sur la deuxième chaîne « d » ... et la sortie doit être (c'est 'et « word1 »):

“Sopra la panca la capra campa” 
“   capra    ” 

Alors saveworddisplacement() mettre un espace « d » quand il trouve pas 'word1' dans 's' ... Je l'essaie beaucoup de fois mais ça ne marche pas! Alors maintenant, j'essaie de vous demander ... Merci beaucoup!

S'IL VOUS PLAÎT SEULEMENT ASM ou MASM!

EDIT: ce que j'ai essayé de le faire:

.586 
.model flat 
.code 

_saveworddisplacement proc 

;pre 
push ebp 
mov ebp,esp 
push ebx 
push edi 
push esi 

;clean registers 
xor eax, eax 
xor ebx, ebx 
xor ecx, ecx 
xor edx, edx 
xor esi, esi ;index source-dest 
xor edi, edi ;index word 

mov eax, dword ptr[ebp+8] ;source 
mov ebx, dword ptr[ebp+12] ;dest 
mov ecx, dword ptr[ebp+16] ;word 

begins:      ;slide source 
mov dl, byte ptr[eax+esi*1] 
cmp dl,0 
je finishs ;source finish 

    begind: ;slide word 
    mov dh, byte ptr[ecx+edi*1] 
    cmp dh,0 
    je finishd 
    cmp dh,dl 
    jne nofound 
        ;if it arrive here letters are equals 
    push edi  ;save index value in the stack 
    push esi 


    found: 
    mov byte ptr[ebx+esi*1],dh 
    inc edi 
    inc esi 
    mov dh, byte ptr[ecx+edi*1] 
    mov dl, byte ptr[eax+edi*1] 
    cmp dh,dl 
    je found ;again increasing index esi,edi 
    cmp dh,dl 
    jne nofound2 ;oh shit thats not the word i am searching 

    nofound2: ;pop the index and puting "space" in 'dest' 
    pop esi 
    pop edi 
    mov byte ptr[ebx+esi*1],32 
    inc esi 
    xor edi,edi 
    jmp begins 

    nofound: ;at the first step (extern label) letters are differents 
    mov byte ptr[ebx+esi*1],32 
    inc esi 
    jmp begins 

    finishd: ;finished the word 
    mov dl, byte ptr[eax+esi*1] 
    cmp dl,0 
    je finishs 
    mov byte ptr[ebx+esi*1],32 ;put space in the right of the word 
    inc esi 
    jmp finishd 

finishs: 
mov byte ptr[ebx+esi*1],0 ;puting "end of file" in dest 

;post 
pop esi 
pop edi 
pop ebx 
mov esp,ebp 
pop ebp 

ret 

_saveworddisplacement endp 
end 
+1

C-tag supprimé (n'a rien à voir avec C). –

+0

Montrez l'exemple de ce que vous avez essayé pour avoir une idée de votre processus de pensée. –

+0

Ok merci beaucoup! Maintenant, il y a un exemple :) –

Répondre

1

Vous êtes sur la bonne voie. Vous devez gérer le cas "trouvé":

...         ;if it arrive here letters are equals 
    push edi       ;save index value in the stack 
    push esi 

    found: 
    mov byte ptr[ebx+esi*1],dh 
    inc edi 
    inc esi 
    mov dh, byte ptr[ecx+edi*1] 
; mov dl, byte ptr[eax+edi*1]  ; EDI? -> typo 
    mov dl, byte ptr[eax+esi*1] 
    cmp dh, dl 
    je found 

    test dh, dh       ; DH == 0? 
    jne nofound2      ;oh shit thats not the word i am searching 

    add esp, 8       ; Adjust the stack without poping anything 
    xor edi,edi 
    jmp begins 

    nofound2:       ;pop the index and puting "space" in 'dest' 
    pop esi 
    pop edi 
    ... 
+0

Wow! Maintenant ça marche !! Tu es le meilleur rkhb !!! Merci beaucoup, vous m'aidez toujours à résoudre mes problèmes avec mon code ... Merci! Vraiment! –