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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2010, 17:44   #1
Beren42
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 50
По умолчанию Найти байтс наибольшим числом единиц и найти байт с наибольшим чилом нулей. Найти разность число единиц м

Друзья помогите хоть чем-нибудь ! На вход подаётся 48 разрядный параллельный код. Найти байт в котором находится наибольшее число единиц и найти байт в котором находится наибольшее число нулей и найти разность число нулей минус число единиц. Есть код для проги которая считает количество единиц и нулей в каждом байте и находит байт с максимальным числом единиц
;сброс "занято" NOV RO, #00010000 MOV A.RO OUTL P2.A
WATT:
JNTl WATT ;цикл ожидания Строб вх.
MOV RO, #00011000 ;установка "занято" MOV A.RO OUTL P2,A
начальный адрес заносится в адресный регистр
О заносится в R1-R3 и R6
О заносится в R1-R3 и R6
О заносится в R1-R3 и R6
устанавливается счетчик байтов б
О заносится в R1-R3 и R6
MOV RO, #20H
MOV Rl, #0H
MOV R2, #0H
MOV R3, #0H
MOV R4, #6H
MOV R6, #0H

;цикл занесения данных из порта Pi в память READ:
IN A,Pi
MOV @R0,A ;занесение содержимого Pi по адресу, на который указывает R0
INC R0 ;увеличение R0 на 1
D3NZ R4,READ ;если R3 не равен 0, то считывание байтов продолжается
MOV R4, #бн ;заносим 6 счетчик байтСпереинициализация)
;считывание нового байта из памяти
READNEW:
DEC RO ;уменьшение RO на 1
MOV A,@R0 ;занесение в аккумулятор байта, находящемуся по адресу,
который указывает R0 В
MOV R7,A ;байт из аккумулятора заносится в R7 - текущий байт
MOV R5,#8H ;занесение 8 в счетчик битов
;сравнение
COMPAREMAIN:
MOV A,R7 ;занесение в аккумулятор текущего байта
DEC R5 ;декремент R5
лВО СОМР1 ;равен ли первый бит акк единице
ЗМР СОМРО ;не равен если
СОМР1:
INC Rl; инкремент Rl - счетчика единиц
СОМРО:
RL A ;сдвиг числа аккумулятора влево
MOV R7.A ;занесение из аккумулятора сдвинутого байта в R7
MOV A, R5 ;занесение R5 в акк
JNZ COMPAREMAIN ;R5=0? если нет, то новое сравнение
; R3=8 - Rl
MOV A, Rl -.занесение Rl в акк
CPL А ; инверсия аккумулятора
ADD А, #8н ; Сложение
CPL A ; Получение разности
MOV R3, А -.занесение результата в R3
; Rl=R2?
MOV A, Rl ;занесение Rl в акк
CPL A ; Инверсия аккумулятора
ADD A, R2 ; Сложение
CPL A ; получение разности
3NZ NXTCMP ; если не равны
MOV A.R4
MOV R6,A ;запись R4 в R6
ЗМР NXT
; Rl>R2? NXTCNP:
MOV A, Rl ;занесение Rl в дкк CPL A : инверсия аккумуляторе ADD A, R2 ; Сложение CPL A ; получение разности зс NXT ; если R2 больше Rl 32 NXT ; если равны
MOV A.R4
MOV R6,A ;запись R4 в R6
MOV A,Rl
MOV R2,A ;запись Rl в R2
NXT:
MOV Rl, #0H ;сброс Rl
MOV A,R4
3NZ READNEW ; Если R4 не равно О
;вывод и конец
ORL P2,#18h ;выставляем Строб
MOV A.R6
OUTL BUS,A ;вывод на шину
MOV A.R2
OUTL BUS,A ;вывод на шину ;сброс "занято" MOV R0, #00010000
MOV A,R0 OUTL Р2,А
ЗМР WAIT ;переход на ожидание вх сигнала
Вот описание к коду
Введем следующие обозначения:
R0 — адрес в памяти;
R1 — количество единиц в текущем байте;
R2 — максимальное количество единиц в байте на текущий момент;
R3 — количество нулей в текущем байге;
R4 — счетчик байт;
R5 — счетчик бит;
R6 — номер байта с максимальным количеством единиц;
R7 — текущий байт.
Начало программы: происходит начальная инициализация: сброс сигналов «Занят» и «Вых. Строб».
Далее программа ожидает появление на входе сигнала <<Вх.строб>>. если он появился, то устанавливается сигнал «Занят».
После этого начальный адрес заносится в адресный регистр R0, задаются регистры R1-R3 и R6 (значение 0) и R4 (значение 6)
Из входных буферных регистров DD1-DD6 во внутренние регистры микроконтроллера будут поступать слова, каждое из которых длиной по 8 бит. После считывания каждого байта, счетчик байтов R4 будет уменьшаться на 1. Сначала заносится новый байт в регистр R7, а из него переносится в аккумулятор для его обработки. Для выполнения побитного считывания данных применяется счетчик бит К5(значение 8) после считывания каждого бита он уменьшается на единицу. Если бит имеет значение 1, то с помощью условного перехода увеличивается на единицу регистр R1. Программа действует циклически, пока не считает все 8 бит. После окончания считывания текущего байта вычисляется число нулей в байте, как 8-число единиц и записывается в регистр R3. Далее проводится сравнение содержимого регистров R1 и R2. При равенстве регистров происходит запись номера текущего байта в R6, если R1>R2 -то R1 записывается в R2 и его номер в R6, если же меньше - то ничего не меняется. Завершает считывание байта сброс регистра R1.
Когда будет считан последний байт программа выведет номер последнего регистра (если имеются равные ему) с максимальным числом единиц и само это число .
Beren42 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с массивом нулей и единиц Rusl92 Помощь студентам 12 15.11.2009 16:20
Найти сумма единиц Bayram_662 Паскаль, Turbo Pascal, PascalABC.NET 6 22.10.2009 22:11
Помогите найти строку с наибольшим кол-вом отриц. эл-ов Danil21 Общие вопросы C/C++ 1 21.06.2009 11:54
Даны сведения о товарах на складе: наименование, цена, количество единиц товара. Найти товар, стоимость н Evidence Паскаль, Turbo Pascal, PascalABC.NET 1 03.06.2009 00:09
Получите последовательность b1...bn из нулей и единиц Я_Студент Паскаль, Turbo Pascal, PascalABC.NET 2 04.07.2008 12:40