Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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


Ответ
 
Опции темы
Старый 15.12.2010, 20:32   #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 вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме 20000 рублей в месяц
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти байтс наибольшим числом единиц и найти байт с наибольшим чилом нулей. Найти разность число единиц м Beren42 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 14.12.2010 17:44
Assembler (массив, разм-ю 9 байт, проверка наличия 3х единиц в коде эл-та) Exelence Помощь студентам 1 05.12.2010 20:05
работа с массивом нулей и единиц Rusl92 Помощь студентам 12 15.11.2009 16:20
Разность между максимальным и минимальным значениями StudeHt Помощь студентам 7 23.04.2009 21:26
Получите последовательность b1...bn из нулей и единиц Я_Студент Паскаль, Turbo Pascal, PascalABC.NET 2 04.07.2008 11:40


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS