2017-06-04 4 views
1

Je ne peux pas utiliser cette déclaration, parce que selectedWords peut être une chaîne.Faire chaîne de --- avec 0 à la fin

.DATA 
guessWords BYTE SIZEOF selectedWords DUP ('-'), 0 

J'essaie donc de le faire:

;Wordls what we select by rundom code 
selectedWords BYTE ? 
lengthSelectedWorld DWORD ? 

;Letter what we guess, input from keyboard 
guessLetter BYTE ? 
guessWords BYTE ? 
;Letter what are unknows, change with - 
letterUnknown BYTE "-", 0 

Et j'écrire cette fonction

make_array1 PROC  

    mov edx,OFFSET selectedWords 
    call StrLength 
    mov lengthSelectedWorld,eax 
    mov lengthSelectedWorld1 ,eax 
    inc lengthSelectedWorld 

    loop_add_more: 
     cmp lengthSelectedWorld, 1 
     je done 
     dec lengthSelectedWorld  
     mov eax, '-' 
     mov ecx, lengthSelectedWorld1 
     mov edi, offset guessWords 
     rep stosw 

     mov edx, offset guessWords 
     call WriteString 
     call Crlf ;stampamo enter novi red 

     jmp loop_add_more  

    done: 
     mov eax, '0' 
     mov ecx, lengthSelectedWorld1 
     mov edi, offset guessWords 
     rep stosw 

     mov edx, offset guessWords 
     call WriteString 
     call Crlf ;stampamo enter novi red 

     ret 

make_array1 ENDP 

Mais après funcion j'obtenir guessWords ce qui est de la chaîne ----- - et ne pas avoir 0 sur le et. Alors, comment faire une chaîne guessWords = ------- 0?

Il est important pour moi d'avoir 0 à la fin de la chaîne en raison d'une autre comparation dans le code ..

enter image description here

+0

Vous venez de mettre le 0 là-bas? Notez également que 'stosw' est un mot, pas un byte. – Jester

+0

Si je mets stosb je reçois quelque chose comme ça http://prntscr.com/ffqvdf Et puis je ne understent que je reçois plusieurs lettres .. je veux .. :( – SakaSerbia

+0

A propos des tampons ... ouais, c'est l'histoire de Dans le langage d'assemblage, vous devez gérer la taille dynamique par vous-même, la langue a très peu à offrir.Avec le jeu du pendu, il est raisonnable de supposer une longueur maximale de mot/phrase à deviner, par exemple 200 ... puis allouer simplement 200B pour les deux sélectionnés et devina mot dans le segment de données, en utilisant uniquement la première partie de ce tampon pour mot/phrase courte (assurez-vous l'effacer correctement). Avec des tâches différentes, où les données dynamiques peuvent être en kilos ou megas ou gigas, vous devez faire face à allocation dynamique de mémoire. ici, 200 est assez – Ped7g

Répondre

1

selectedWords BYTE ? réserves juste un octet pour selectedWords. Le même problème avec guessWords BYTE ?. Ne jouez pas avec la mémoire allouée dynamiquement en tant que débutant. Plutôt réserver l'espace qui est suffisant dans tous les cas: guessWords BYTE 50 DUP (?). Le point d'interrogation signifie que MASM peut décider de le traiter comme une mémoire non initialisée (non stockée dans le fichier .exe, mais allouée au démarrage du programme).

STOSW stocke un mot (= deux caractères). Cependant, le StrLength d'Irvine renvoie le nombre d'octets de la chaîne. Utilisez STOSB à la place. Après STOSB, EDI points au personnage après la dernière sauvegarde AL. Vous pouvez stocker un null là-bas. Si vous voulez le voir, changez temporairement 0 pour '0'.

INCLUDE Irvine32.inc 

.DATA 

;Wordls what we select by rundom code 
selectedWords BYTE "WEIGHTLIFTING", 0 
lengthSelectedWord DWORD ? 

;Letter what we guess, input from keyboard 
guessLetter BYTE ? 
guessWords BYTE 50 DUP (?) 

;Letter what are unknows, change with - 
letterUnknown BYTE "-", 0 

.CODE 

make_array1 PROC 

    mov edx,OFFSET selectedWords 
    call StrLength      ; Irvine32: Length of a null-terminated string pointed to by EDX 
    mov lengthSelectedWord,eax 

    loop_add_more: 
     mov al, '-'      ; Default charcter for guessWords 
     mov ecx, lengthSelectedWord  ; REP counter 
     mov edi, offset guessWords  ; Destination 
     rep stosb      ; Build guessWords 
     mov BYTE PTR [edi], 0   ; Store the null termination 

     mov edx, offset guessWords 
     call WriteString    ; Irvine32: write a string pointed to by EDX 
     call Crlf      ; Irvine32: new line 

     ret 

make_array1 ENDP 

main PROC 

    call make_array1 
    exit        ; Irvine32: ExitProcess 

main ENDP 

END main 
+0

Son travail .. http://prntscr.com/ffsyza Le problème était que je joue avec la mémoire allouée dynamiquement, et je reçois quelque chose d'étrange .. Quand j'écris selectedWords BYTE "MUSCULATION ", 0 Tous sont venus ensemble .. – SakaSerbia

+1

@SakaSerbia: Très agréable. Et maintenant le graphique - je ne veux pas perdre ma poule aux œufs d'or (upvotes, accepte) :-) :-) – rkhb