[Assembler] Как определить сколько в массиве элементов равны регистру bl?
Всю ночь промучался с написанией программы, но так ничего и не вышло :С
Всю ночь промучался с написанией программы, но так ничего и не вышло :С
Смотрите в сторону repne scasb и всё станет сразу проще.
Команда и там-же пример, очень похожий на Ваш
http:// www. kolasc .net.ru/cdo/programmes/assembler/scas.html
(без пробелов)
Если целиком:
;Метки с @@ будут считаться локальными
locals @@
;Сегмент стека
stk segment stack
dw 128 dup(?)
stk ends;Конец сегмента стека
;Сегмент данных
data segment
;Массив
arrStart: db 10,20,30,10,20,10
arrEnd:
data ends
;Сегмент кода
code segment
assume cs:code, ds:data, es:data
;Точка входа
start:
;Инициализируем es
mov ax, data
mov es, ax
;В bl искомый элемент
mov bl, 10
;Флаг направления - двигаемся "вперед" по памяти
cld
;cx = размеру массива
mov cx, arrEnd-arrStart
;es:di теперь указывает на массив
lea di, arrStart
;Здесь будет храниться кол-во элементов (обнуляем)
xor dx, dx
;al = bl (для repne scasb)
mov al, bl
@@again:
repne scasb
;Если элемент не был найден - пропускаем увеличение
jne @@skipAdd
;Иначе увеличиваем счетчик
inc dx
@@skipAdd:
;Если cx = 0 (достигли конца) - выходим
jcxz @@exit
;Иначе ищем дальше
jmp short @@again
@@exit:
;-----
;Здесь dx = кол-ву чисел
;------
;Выходим из программы
movax, 4c00h
int21h
;Конец сегмента кода
code ends
end start
Это регистр b - причем первые 8 бит этого регистра. Поэтому bl.если в двух словах регистр - это просто набор ячеек памяти, каждая из которых соответствует 1 биту. Скажем, у нас 32 разрядный процессор. Т. е. в каждом регистре 32 бита. Они делятся по 8 бит - это в некотором смысле условное разделение и просто показывает в какую часть регистра пишутся данные. Первые 8 бит - это регистр bl (low)Следующие 8 - это регистр bh (high)Еще 8 бит - это если не путаю ebl (extended - расширенный) Но тем не менее это все регистр b.Вот собственное и все.