Определить количество нулей в матрице - Assembler
Формулировка задачи:
Надо написать программу в языке ассемблера 8086 которая определяет количество нулей в матрице и размер матрицы даётся с клавиатуры и числа тоже с клавиатуры
Решение задачи: «Определить количество нулей в матрице»
textual
Листинг программы
array db 9,5,10,16,80,103 ; массив len = $ - array ; его длина start: ; mov si,array ; адрес массива в SI mov bp,len ; BP - длина xor bx,bx ; здесь будет результат begin: ; lodsb ; берём байт из SI mov cx,8 ; сколько раз выдвигать @1: shl al,1 ; сдвиг влево на 1 jc @2 ; пропуск, если CF=1 inc bx ; считаем нули @2: loop @1 ; следующий бит.. dec bp ; весь массив проверили? jnz begin ; нет - берём сл.байт с массива ; да - результат в BX!
Объяснение кода листинга программы
- В начале кода определен массив, его длина вычисляется как разность между символом '$' и адресом массива в переменной
array. - Затем, используя метку
start, создаются начальные условия: регистр SI содержит адрес первого элемента массива, а BP - его длину. - Переменная BX инициализируется нулем.
- Используя метку
begin, происходит основная часть работы:- Забирается байт из массива с помощью команды
lodsb. - Байт сдвигается влево на 1 позицию с помощью команды
shl al,1. - Если после сдвига в старшем бите остаётся единица (это проверяется с помощью команды
jc @2), то этот байт не считается нулём, и мы переходим к следующему биту с помощью командыinc bx. - Если после сдвига в старшем бите остаётся ноль, то этот байт считается нулём, и мы увеличиваем значение переменной BX на единицу.
- Забирается байт из массива с помощью команды
- Если весь массив проверен (это проверяется с помощью команды
dec bp), и в нём ещё остались нули (это проверяется с помощью командыjnz begin), то мы возвращаемся к началу цикла. - Если весь массив проверен и не содержит нулей, то результат (количество нулей) сохраняется в переменной BX.