читая БАЙТ как DWORD в Masm - PullRequest
2 голосов
/ 13 марта 2010

еще раз я занимаюсь программированием MASM. Я пытаюсь написать процедуру с использованием библиотеки Irvine32, где пользователь вводит строку, которая помещается в массив байтов с ReadString. Затем он зацикливается на этом массиве и определяет, является ли каждый символ числом. Тем не менее, когда я пытаюсь

cmp [buffer + ecx], 30h

МАСМ жалуется на сравнение двух вещей, которые не имеют одинаковый размер. В любом случае я мог бы прочитать код ASCII в каждом байте в массиве как DWORD (или иначе извлечь значение ASCII в каждом байте)?

Ответы [ 2 ]

2 голосов
/ 13 марта 2010

Это работает?

cmp BYTE PTR [buffer + ecx], 30h

Чтобы извлечь БАЙТ как DWORD, вы можете сделать что-то вроде этого:

mov EAX, 0
mov AL, [pointer]

или даже лучше (спасибо Мартину):

movzx EAX, [pointer]
0 голосов
/ 13 марта 2010
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

Это то, что мне нужно было сделать.

...