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


Автор: xpamoi 20.1.2010, 15:15
Требуется:
Написать подпрограмму для подсчёта количества ненулевых элементов в участке памяти сегмента данных, начало задано в регистре SI, конец в регистре DI,количество ячеек поместить в регистре Cx. 
есть у кого нить что ни будь похожее?! шаблоны или с это отрасли?!

Автор: iff 20.1.2010, 21:27
Код

;Используются cx, di, si,ax
;При передачи управления коду, написанноме ниже требуется, что бы ax содержал 00
        mov     cx, di
        sub     cx, si
        inc     cx
a10:    cmp     byte ptr [si], 00
        je      a20
        inc     ax
a20:    inc     si
        loop    a10
        mov     cx, ax

Автор: Mikl_ 21.1.2010, 04:17
Цитата(xpamoi)
Написать подпрограмму для подсчёта количества ненулевых элементов в участке памяти сегмента данных, начало задано в регистре SI, конец в регистре DI,количество ячеек поместить в регистре Cx.
Код
xor bx,bx; в BX будет счетчик ненулевых элементов сейчас BX=0
    mov al,0; обнулим AL
    push ds ; es=ds
    pop es
    mov cx,di; в CX количество байт которые требуется обработать
    sub cx,si
    mov di,si
    cld 
a1:    repe scasb ; ищем ненулевые элементы
    inc bx; если нашли -- увеличим счетчик
    test cx,cx
    jnz a1; пока в CX не ноль продолжаем цикл
    mov cx,bx
 smile iif всё работает правильно smile 

Автор: iff 21.1.2010, 16:18
Код

mov cx,di; в CX количество байт которые требуется обработать
sub cx,si

Это не правильно. Допустим, что начало (SI) содержит 2, конец (DI) - 3. Тогда вы будете проверять 1-у ячейку, хотя нудно 2-е (ячейку 2 и 3)

Проверил сейчас вашу и мою программы в debug, выша не работает, в своей я обнаружил ошибку, после исправления которой всё зароботало как надо.

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