необходимо подсчитать количество нулей и единиц в двоичной записи числа
.model small ; Модель памяти
.stack 1000h ; Установка размера стека
.data ; Начало сегмента данных программы
;<описание переменных>
message2 db "result:",13,10,"$"
message3 db "kol-vo nulei:",13,10,"$"
message4 db "kol-vo ediniz:",13,10,"$"
mes3 db 10,13,"$"
result dw 123
kol_odin dw 0
kol_nol dw 0
.code ; Начало сегмента кода
start:
mov ax,@DATA ; Пересылаем адрес сегмента данных в регистр AX
mov ds,ax ; Установка регистра DS на сегмент данных
podschet:
mov bx, 32768
xor ax,ax
mov ax, result
and ax, bx
cmp ax, 1
je odin
jmp podschet2
podschet2:
test bx, bx
jz vivod
shr bx, 1
mov ax, result
and ax, bx
cmp ax, 1
je odin
cmp kol_odin,0
jne nol
jmp podschet2;
odin:
add kol_odin,1
jmp podschet2;
nol:
add kol_nol,1
jmp podschet2;
vivod:
mov ah,09h ; DOS функция вывода строки на экран
mov dx,offset message3 ; Задаём смещение к началу строки
int 21h ; Выводим строку
mov ax,kol_nol ;выводимое число в регисте AX
push -1 ;Сохраним признак конца числа
mov cx,10 ;Делим на 10
l: xor dx,dx
div cx ;Делим
push dx ;Сохраним цифру
cmp ax,0 ;Остался 0?
jne l ;нет -> продолжим
mov ah,02h
l2: pop dx ;Восстановим цифру
cmp dx,-1 ;Дошли до конца -> выход
je ex
add dl, 48
int 21h
jmp l2 ;И продолжим
ex:
mov ah,09h ; DOS функция вывода строки на экран
mov dx,offset message4 ; Задаём смещение к началу строки
int 21h ; Выводим строку
mov ax,kol_odin ;выводимое число в регисте AX
push -1 ;Сохраним признак конца числа
mov cx,10 ;Делим на 10
vt: xor dx,dx
div cx ;Делим
push dx ;Сохраним цифру
cmp ax,0 ;Остался 0?
jne vt ;нет -> продолжим
mov ah,02h
vvv: pop dx ;Восстановим цифру
cmp dx,-1 ;Дошли до конца -> выход
je close
add dl, 48
int 21h
jmp vvv ;И продолжим
close:
mov ax,4C00h ; DOS функция выхода из программы
int 21h ; Выход из программы
end start
считает неправильно, хотя вроде логически правильно понимаю задачу. Буду рад помощи
P.S. с ассемблером еще только знакомлюсь