Сравнение сборки 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.)