2010-03-12 19 views
1

encore une fois je fais la programmation MASM. J'essaye d'écrire une procédure utilisant la bibliothèque Irvine32 où l'utilisateur entre une chaîne qui est mise dans un tableau de BYTE avec ReadString. Ensuite, il boucle sur cet arrêt et détermine si chaque caractère est un nombre. Cependant, lorsque je tentelire un BYTE comme un DWORD dans Masm

cmp [buffer + ecx], 30h 

MASM se plaint de comparer deux choses qui ne sont pas la même taille. Y at-il de toute façon je pourrais lire le code ASCII dans chaque BYTE dans le tableau comme un DWORD (ou extraire autrement la valeur ASCII dans chaque BYTE)?

Répondre

1

Est-ce que cela fonctionne?

cmp BYTE PTR [buffer + ecx], 30h 

Pour extraire un BYTE comme DWORD que vous pouvez faire quelque chose comme ceci:

mov EAX, 0 
mov AL, [pointer] 

ou encore mieux (merci Martin):

movzx EAX, [pointer] 
+0

@Martin, oui, meilleur choix :) –

+0

movzx eax, [pointeur] fonctionne mais chaque fois que je fais movzx eax, [pointeur + ecx] (puisque je reçois plus d'un caractère entrées), il met toujours juste un zéro dans eax. –

+0

BYTE PTR [tampon + ecx] évalue toujours à zéro (où ecx est le nombre d'éléments mis dans le tampon) Pour commencer, je commence à soupçonner que mon professeur n'essaie même pas de mettre en œuvre ses idées pour les affectations de programmation dans MASM avant qu'il ne les assigne. Nous n'avons rien fait avec les conversions de type dans MASM. J'ai appris plus sur l'assemblage jusqu'à présent en essayant de comprendre ses devoirs en utilisant Internet et le débordement de pile que j'ai appris en classe. –

0
getData PROC 
    push ebp 
    mov ebp, esp 
    mov esi, [ebp + 12] ; offset of buffer 
    mov ebx, [ebp + 8] ; where to write answer 

    GETNUMBERSTRING: 
    mov edx, esi 
    mov ecx, BufferSize 
    mov eax, 0 
    call ReadString 

    mov ecx, eax ; set size to loop counter 
    cld 

    mov edx, 0 
    PROCESSSTRING: 
    lodsb 

    cmp al, 30h 
    jl WRONG 
    cmp al, 39h 
    jg WRONG 

    ; add digit into total edx 
    sub al, 30h 
    push eax ; multiply edx by 10 
    push ecx 
    mov eax, edx 
    mov ecx, 10 
    mul ecx 
    mov edx, eax 
    pop ecx 
    pop eax 

    push ebx ; add to the total 
    movsx ebx, al 
    add edx, ebx 
    pop ebx 

    loop PROCESSSTRING 
    jmp DONE 

    WRONG: 
    call Crlf 
    stringWriterEndl invalid 
    jmp GETNUMBERSTRING 

    DONE: 
    mov [ebx], edx 
    pop ebp 
    ret 8 
getData ENDP 

C'est ce que je devais faire.