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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2012, 05:28   #1
Eshik v tumane
Пользователь
 
Регистрация: 14.10.2012
Сообщений: 10
По умолчанию Чётность числа единиц в числе (Assembler)

Здравствуйте. Дана задача: Осуществить логическое сложение числа, записанного в ячейку памяти по адресу 030H и числа 0FH и записать результат по адресу 080H, если число единиц в результате чётно. Сбросить старшую тетраду содержимого ячейки памяти по адресу 177H и полученный результат записать в следующую ячейку памяти. Дошёл до пункта "и записать результат по адресу 080H, если число единиц в результате чётно."
C 20-ой строки начинается ошибка:
Код:
.include "m16def.inc"

ldi R16, high(RAMEND)
out SPH, R16
ldi R16, low(RAMEND)
out SPL, R16

ldi R18, high(0x030)
ldi R17, low(0x030)

M0: Call EEPROM_read


ldi R19, 0x0F 

ADD R16, R19 

Call EEPROM_write

;в следующих 4-х строках появляются ошибки
mov AX, R16 ; Illegal instruction code
test AX, AX ; Unknown instructions opcode
jpe M0 ; Unknown instructions opcode
jpo M1 ; Unknown instructions opcode


M1:
ldi R18, high(0x080)
ldi R17, low(0x080)

;Call EEPROM_write


end: rjmp end

EEPROM_read:
sbic EECR, EEWE
rjmp EEPROM_read

out EEARH,R18
out EEARL,R17

sbi EECR, EEMWE
sbi EECR, EEMWE

in R16, EEDR
ret

EEPROM_write:
sbic EECR, EEWE
rjmp EEPROM_write

out EEARH, R18
out EEARL, R17
out EEDR, R16

sbi EECR, EEMWE
sbi EECR, EEWE

SEI
ret
Возможно, что я не правильно делаю, копируя из значение из R16 в AX, но почему он не понимает остальные команды? Помогите пожалуйста.
Eshik v tumane вне форума Ответить с цитированием
Старый 14.10.2012, 10:58   #2
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

доброго. мнемокод микропроцессоров AVR? откуда регистр AX? только R0-R31
... строки 2-4 с ошибками содержат код для процессора x86
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 14.10.2012, 11:20   #3
Eshik v tumane
Пользователь
 
Регистрация: 14.10.2012
Сообщений: 10
По умолчанию

Да, для AVR. Когда я искал примеры по этой теме, то использовался этот регистр, поэтому я попытался в него скопировать значение. Но на эту команду с регистром R16
Код:
test R16,R16
тоже появлялась ошибка.
Про ошибку в 2-4 строках
Код:
ldi R16, high(RAMEND)
out SPH, R16
ldi R16, low(RAMEND)
out SPL, R16
Нам сказали, что этот код надо обязательно использовать в начале программы для обнуления стека.
Eshik v tumane вне форума Ответить с цитированием
Старый 14.10.2012, 11:30   #4
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

строки (2-4) с ошибками, подразумевал следующие
Код:
test AX, AX ; Unknown instructions opcode
jpe M0 ; Unknown instructions opcode
jpo M1 ; Unknown instructions opcode
команд test, jpe и jpo в AVR нет
команды AVR
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 14.10.2012, 12:56   #5
Eshik v tumane
Пользователь
 
Регистрация: 14.10.2012
Сообщений: 10
По умолчанию

Печаль. Может можно считать бит чётности? Или как-то по-другому это реализовывается? Подскажите пожалуйста.
Eshik v tumane вне форума Ответить с цитированием
Старый 14.10.2012, 13:25   #6
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

1. посмотрите набор команд
2. команда ADD R16, R19 выполняет арифметическое сложение, у вас по условию должно быть логическое сложение
3. проверка на четность:
- логическое умножение на 1
- если результат 0 - число четное
на неконкретные вопросы даю неконкретные ответы ...

Последний раз редактировалось Step_UA; 15.10.2012 в 11:38.
Step_UA вне форума Ответить с цитированием
Старый 15.10.2012, 04:55   #7
Eshik v tumane
Пользователь
 
Регистрация: 14.10.2012
Сообщений: 10
По умолчанию

у меня код такой получается:
Код:
M0: Call EEPROM_read

ldi R19, 0x0F 

OR R16, R19 

ldi R21, 0xFF


OR R21, R16
brne M0
breq M1

M1:
ldi R18, high(0x080)
ldi R17, low(0x080)
Call EEPROM_write
Но он крутится в бесконечном цикле. Что я опять неправильно сделал?
Eshik v tumane вне форума Ответить с цитированием
Старый 15.10.2012, 12:00   #8
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

1. циклится потому что метку M0 необходимо ставить после блока записи числа в память
2. ошибся в предыдущем посте(исправил) - логическое умножение на 1 ...
3. по условию необходимо проверить на четность количество установленных бит - вы же проверяете четность результата логического сложения
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 15.10.2012, 12:10   #9
Eshik v tumane
Пользователь
 
Регистрация: 14.10.2012
Сообщений: 10
По умолчанию

Пардон, невнимательно прочитал и вместо логического умножения поставил сдожение. Но проблема так и не ушла
Код:
M0: Call EEPROM_read

ldi R19, 0x0F ; çàïèñûâàåì 0F â R19

OR R16, R19 ; ñêëàäûâàåì çíà÷åíèÿ â ðåãèñòðàõ

ldi R21, 0xFF


AND R21, R16
breq M1
brne M0


M1:
ldi R18, high(0x080)
ldi R17, low(0x080)
Call EEPROM_write


end: rjmp end
Eshik v tumane вне форума Ответить с цитированием
Старый 15.10.2012, 12:11   #10
Eshik v tumane
Пользователь
 
Регистрация: 14.10.2012
Сообщений: 10
По умолчанию

Спасибо за подсказки, буду пробовать
Eshik v tumane вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сосчитать количество единиц в двоичной записи числа i (c++) Роза!!! Помощь студентам 2 16.04.2016 22:14
Проверка числа на чётность (Assembler) Марик73 Помощь студентам 6 30.05.2012 12:22
Задана последовательность чисел в формате:сначала количество цифр в числе, потом - цифры числа. Подсчитать количество. Arn1 Помощь студентам 4 03.10.2011 20:03
Ошибка. НЕ МОГУ ВСТАВИТЬ столбец В ЗАДАЧУ КОТОРАЯ ВЫВЕДЕТ СТОЛБЕЦ ИЗ ЕДИНИЦ ПОСЛЕ ЧИСЛА к. Диас_ Паскаль, Turbo Pascal, PascalABC.NET 1 14.06.2011 18:49
Assembler (массив, разм-ю 9 байт, проверка наличия 3х единиц в коде эл-та) Exelence Помощь студентам 1 05.12.2010 20:05