Подсчитать число единиц во всех разрядах заданного двоичного числа - Assembler
Формулировка задачи:
Подсчитать число единиц во всех разрядах заданного двоичного числа Х(вес) методом исключения единиц. Написать на паскале с ассемблерной вставкой!!!
Решение задачи: «Подсчитать число единиц во всех разрядах заданного двоичного числа»
textual
Листинг программы
program CountOnes;
var
X: integer;
Count: integer;
begin
writeln('Input X');
Write('X: ');
readln(X);
asm
MOV Count,0 {Count:=0}
MOV AX,X
TEST AX, AX
JZ @@Break
@@While:
INC Count {Count:=Count+1}
MOV BX,AX {X:=X AND (X-1)}
DEC BX
AND AX,BX
JNZ @@While
@@Break:
end;
writeln('Count=', Count);
end.
Объяснение кода листинга программы
- Объявляется переменная
Xтипа integer для хранения введенного пользователем двоичного числа. - Объявляется переменная
Countтипа integer для хранения количества единиц в двоичном числе. - Пользователю выводится сообщение
Input X. - Пользователю предлагается ввести значение переменной
X. - Переход в блок ассемблерного кода.
- В ассемблерном коде переменная
Countинициализируется нулем при помощи командыMOV. - Значение переменной
Xзаносится в регистр AX. - Выполняется проверка регистра AX на равенство 0 при помощи команды
TESTи переход к метке @@Break, если равенство выполняется. - Если значение регистра AX не равно нулю, программа переходит к метке @@While.
- В цикле увеличивается значение переменной
Countна 1 с помощью командыINC. - Значение переменной
Xзаносится в регистр BX. - Из регистра BX вычитается 1.
- При помощи команды
ANDзначения регистров BX и AX используются для обнуления крайней правой единицы в двоичном представлении числа. - Если значение регистра AX после выполнения операции
ANDне равно 0, программа возвращается к метке @@While. - После цикла происходит переход к метке @@Break.
- Завершение выполнения ассемблерного блока.
- Выводится значение переменной
Countс помощью команды writeln. Этот код подсчитывает количество единиц в двоичном представлении числа, введенного пользователем.