Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2015, 22:36   #1
Devil669
Пользователь
 
Регистрация: 20.12.2011
Сообщений: 33
По умолчанию нужно изменить программу

Друзья, есть программа которая сохраняет 1, если число содержит единицу, иначе сохраняет 0.
Как сделать так? Если число содержит единицу, то увеличивать счетчик на 1, в противном случае переходить к следующей цифре. Одним словом нужно подсчитать вес двоичного вектора и сохранить результат.

Код:
masm
model small
stack 256
.data
ish dw 1992h
rez db 0
isk db 1h
.code
main:
      mov ax,@data
    mov ds,ax
 
      mov al, isk
      cbw
      mov bx, ax  ;запись искомой цифры в Rg bx
 
      mov ax, ish ;запись исходного числа в Rg ax
      mov cx,4
 
cycle: and ax, 000Fh ;выделение цифры
       cmp ax,bx ;сравнение цифр
       jnz m ;если цифры не равны переход к метке m
       mov rez, 1
 
m:      mov ax, ish 
        shr ax, 4  ;сдвиг исходного числа
        mov ish,ax 
 
       loop cycle
 
 
      mov al, rez  ;вывод результата 
      cbw  
     
   
      mov ax,4c00h
      int 21h 
             
end main
Я понимаю что вместо вот этого

Код:
mov rez, 1
должно быть типа вроде этого

Код:
inc di
Но как это правильно записать?
Devil669 вне форума Ответить с цитированием
Старый 22.01.2015, 08:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

inc [rez] если не ошибаюсь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.01.2015, 09:32   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Судя по mov al,rez будет достаточно написать inc rez
waleri вне форума Ответить с цитированием
Старый 22.01.2015, 13:54   #4
Devil669
Пользователь
 
Регистрация: 20.12.2011
Сообщений: 33
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Судя по mov al,rez будет достаточно написать inc rez
Почему в rez все равно получается 1?

Какое бы число я не написал в ish.(Даже если 1111h) Счетчик увеличивается только один раз.

Последний раз редактировалось Devil669; 22.01.2015 в 18:22.
Devil669 вне форума Ответить с цитированием
Старый 22.01.2015, 20:45   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Отладчик и вперед, шаг за шагом.
waleri вне форума Ответить с цитированием
Старый 22.01.2015, 20:53   #6
Devil669
Пользователь
 
Регистрация: 20.12.2011
Сообщений: 33
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Отладчик и вперед, шаг за шагом.
Я так и делаю. Главное смещения происходят, а увеличение счетчика нет. Только когда доходит до предпоследнего смещения увеличивает счетчик. Если сделать еще шаг то произойдет еще смещение и ish станет = 0000h, а rez останется 01h
P.S. отладчик emu8086
Devil669 вне форума Ответить с цитированием
Старый 22.01.2015, 21:44   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Devil669, а можете мне пояснить, что надо сделать?
Ну как полностью выглядит текст задания, которое Вы пытаетесь решить? Подсчитать сколько единиц в двоичном представлении числа?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.01.2015, 21:50   #8
Devil669
Пользователь
 
Регистрация: 20.12.2011
Сообщений: 33
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Devil669, а можете мне пояснить, что надо сделать?
Ну как полностью выглядит текст задания, которое Вы пытаетесь решить? Подсчитать сколько единиц в двоичном представлении числа?
Вообще да. Если быть точнее,посчитать вес двоичного вектора, но это одно и то же.
Devil669 вне форума Ответить с цитированием
Старый 22.01.2015, 22:08   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

ок.

тогда поясните, зачем, например, это:
Цитата:
Код:
cycle: and ax, 000Fh ;выделение цифры
       cmp ax,bx ;сравнение цифр
       jnz m ;если цифры не равны переход к метке m
       mov rez, 1
 
m:      mov ax, ish
зачем выделать ЦИФРУ, зачем её с чем-то сравнивать и т.д. и т.п.

количество единиц в двоичной записи числа подсчитать очень просто.
примерно так:
Код:
   счётчик единиц (лучше под него отвести регистр) уставновить в ноль
МеткаНачалаЦикла:
     если крайний правый разряд числа равен нулю ( and ax, 1 / je Метка ) переход к Метка1
        // значит, единица в младшем разряде
      увеличили счётчик единиц 
Метка1:
     сдвинули число в AX на один разряд вправо ( shr AX, 1)
     если в AX не ноль, то переход на МеткаНачалаЦикла
всё!

зачем ещё что-то накручивать?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.01.2015, 22:18   #10
Devil669
Пользователь
 
Регистрация: 20.12.2011
Сообщений: 33
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
ок.

тогда поясните, зачем, например, это:

зачем выделать ЦИФРУ, зачем её с чем-то сравнивать и т.д. и т.п.

количество единиц в двоичной записи числа подсчитать очень просто.
примерно так:
Код:
   счётчик единиц (лучше под него отвести регистр) уставновить в ноль
МеткаНачалаЦикла:
     если крайний правый разряд числа равен нулю ( and ax, 1 / je Метка ) переход к Метка1
        // значит, единица в младшем разряде
      увеличили счётчик единиц 
Метка1:
     сдвинули число в AX на один разряд вправо ( shr AX, 1)
     если в AX не ноль, то переход на МеткаНачалаЦикла
всё!

зачем ещё что-то накручивать?

Я правильно понял? Так?

Код:
mov di, 0

and ax, 1
je Метка1
inc di

shr ax, 1
jne МеткаНачалаЦикла
Devil669 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно изменить запросы Евгений_90 Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 11 28.11.2013 23:32
Нужно изменить программу C++, компьютерная графика, кватернионы, SLERP анеле Фриланс 2 25.01.2013 11:17
Нужно изменить программу с массивов на типизированные файлы ToType Паскаль, Turbo Pascal, PascalABC.NET 1 22.06.2012 02:03