Сравнение сборки x86 с массивом с нулевым символом в конце

Я работаю над функцией в сборке, где мне нужно посчитать символы в массиве с нулевым символом в конце. Я использую визуальную студию. Массив был создан на C++, и адрес памяти передается моей ассемблерной функции. Проблема в том, что мой цикл не заканчивается, когда я достигаю нуля (00). Я пытался использовать test а также cmp но кажется, что сравниваются 4 байта вместо 1 байта (размер символа).

Мой код:

_arraySize PROC              ;name of function

start:                  ;ebx holds address of the array
    push ebp            ;Save caller's frame pointer
    mov ebp, esp        ;establish this frame pointer
    xor eax, eax        ;eax = 0, array counter
    xor ecx, ecx        ;ecx = 0, offset counter

arrCount:                       ;Start of array counter loop

    ;test [ebx+eax], [ebx+eax]  ;array address + counter(char = 1 byte)
    mov ecx, [ebx + eax]        ;move element into ecx to be compared
    test ecx, ecx               ; will be zero when ecx = 0 (null)
    jz countDone
    inc eax                     ;Array Counter and offset counter
    jmp arrCount

countDone:

    pop ebp
    ret


_arraySize ENDP

Как я могу сравнить только 1 байт? Я просто думал о смене байтов, которые мне не нужны, но это кажется пустой тратой инструкции.

1 ответ

Решение

Если вы хотите сравнить один байт, используйте однобайтовую инструкцию:

mov  cl, [ebx + eax]        ;move element to be compared
test  cl, cl                ; will be zero when NUL

(Обратите внимание, что нулевой символ - это ASCII NUL, а не значение ANSI NULL.)

Другие вопросы по тегам