Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Помогите написать программу


Автор: Vinchenso 28.1.2010, 11:13
Здравствуйте. Помогите мне пожалуйста написать программу для процессора Intel80х86 для определения количества двоичных разрядов (битов), имеющих значение "0" в массиве ячеек с адресами 0F0H-0FFH сегмента данных.

Автор: airyashov 28.1.2010, 15:53
в чем конкретно трудности перебирать биты или байты (слова, двойные слова)

Автор: MOKACO 28.1.2010, 18:40
хм

Автор: Vinchenso 28.1.2010, 18:56
Ну если можно, то весь код программы. smile  
считать биты

Автор: iff 28.1.2010, 21:46
Не знаю, может быть я сделал через ****, но:
Код

;Используется DI, CX, AX.
;При переходе к этой подпрограмме необходимо, чтобы AX содержал 0000 и свободное место в стеке в размере 1 слово.
;Результат подсчёта подпрограмма записывает в регистр AX
        MOV     DI, 0F0H
        MOV     CX, 010H
A10:    PUSH    CX
        MOV     CX, 8
A20:    ROL     BYTE PTR [DI], 1
        JC      A30
        INC     AX
A30:    LOOP    A20
        INC     DI
        POP     CX
        LOOP    A10

Проверил в debug. Работает.

Автор: Vinchenso 29.1.2010, 04:16
iff, Спасибо тебе большое!  smile 

Автор: Mikl_ 29.1.2010, 04:58
iff, 
это скорее для вас, так как Vinchenso, скорее всего, сюда уже не заглянет
Цитата
определения количества двоичных разрядов (битов), имеющих значение "0" в массиве ячеек с адресами 0F0H-0FFH сегмента данных. 
lдля начала составляем таблицу из 256 ячеек в каждой ячейке количество 0-ых битов соответствующее номеру ячейки
Код
.data
table db 8,7,7,6,7,6,5,7,6,...,1,0; 256 элементов
sum dw 0; здесь будет результат
.code
       mov bx,offset table
       mov cx,0FFh-0F0h+1; общее количество обрабатываемых элементов
       mov ah,0
       mov si,0F0h; начало массива элементов
a1:  lodsb
       xlat; получаем количество нулей в элементе
       add sum,ax
       loop a1


Автор: Vinchenso 29.1.2010, 05:02
Mikl_,  почему же? Я здесь smile  Я же за помощью сюда пришел. Спасибо Mikl_!

Автор: iff 29.1.2010, 15:08
Я понял. Вы в таблице ищите номер байта, совпадающего со значением проверяемого байта и по этой таблице узнаёте ко-во нулей.
Но ведь эта "матрица" будет весит аж 256 байт! Более того нам ещё придётся вычислять эту таблицу, скорее всего нужно будет написать быстренько маленькую программу для вычисления значений таблицы, сделать это например можно на Бейсике (Я часто использую QB, но не для написания программ, а как "интерпретатор командной строки", когда к примеру, нужно выполнить рутинную работу). Возможно вы выиграете в скорости, но поскольку нам нужно проверить всего лишь 16 байт, то не на много. Я проверял, мой код исполняется мгновенно!

Автор: kjrjgsnjd 15.10.2012, 14:50
Помогите откомпликтовать чтобы программа работала в winAsm Studuo

Автор: Maarriiaa 21.3.2014, 22:42
здравствуйте. подскажите пожалуйста, в чем ошибка?
 вот программа, которая подсчитывает количество единиц в двоичной записи числа
 mov ax,1101
 start:
 mov dx,1 
 mov cx,2
 mrp:
 push ax
 and ax,1 
 cmp ax,1 ;сравниваем с 1
 jne msk ;переходим к мск если два числа не равны
 inc dx ;увеличиваем содержимое памяти на 1
 msk:
 pop ax
 shr ax,1 ; сдвигаем на 1 вправо
 loop mrp
 mov ax,1
 int 0x80
 но на выходе всегда 0 . Что не так?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)