![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 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. Когда будет считан последний байт программа выведет номер последнего регистра (если имеются равные ему) с максимальным числом единиц и само это число . |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
работа с массивом нулей и единиц | 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 |