Модератор: Ural

Программирование

СООБЩЕНИЯ

# 

21 дек 2011, 16:59 

День добрый. Знаю, что здесь много людей близко связанных с компьютерами. Есть ли люди разбирающиеся в ассемблере(конкретно программирование микроконтроллеров PIC)? Необходимо помочь разобраться в 7 строчках кода :oops: :oops: :oops: Был бы очень благодарен)
Аватара пользователя
Сергей
 
Связьинформ - г!вно. Просьба администрации не банить меня) просто не могу уже...
Сообщения: 620
Зарегистрирован: Ср 11 июл 2007, 15:43
Откуда: Кыштым

# 

21 дек 2011, 18:07 

Пишите. Буду рад помочь.
Аватара пользователя
svkazakov
 
Сообщения: 462
Изображения: 22
Зарегистрирован: Пт 08 авг 2008, 06:26
Откуда: Кыштым

# 

21 дек 2011, 20:26 

Сергей, а можно на всеобщее обозрение, а не в личку svkazakov'у. Просто интересно посмотреть на проблему, и увидеть решение.
Аватара пользователя
antoshka_su
 
Сообщения: 261
Изображения: 4
Зарегистрирован: Чт 02 сен 2010, 10:48

# 

22 дек 2011, 16:27 

Задача: Заданы десять чисел, которые расположены в памяти данных с ячейки 12h. Определить, сколько среди них отрицательных чисел. Результат вычислений занести в память данных в ячейку 0Ch.

Решение:
;Рабочая программа

;Установление значений регистров с числами
MOVLW B'00000001'
MOVWF RG1
MOVLW B'10000001'
MOVWF RG2
MOVLW B'00000011'
MOVWF RG3
MOVLW B'10000011'
MOVWF RG4
MOVLW B'00000111'
MOVWF RG5
MOVLW B'10000111'
MOVWF RG6
MOVLW B'00001111'
MOVWF RG7
MOVLW B'10001111'
MOVWF RG8
MOVLW B'00011111'
MOVWF RG9
MOVLW B'10011111'
MOVWF RG10


CLRF PODSCHET ; очистить регистр для подсчета отрицательных чисел
MOVLW 0Ah
MOVWF DIGIT ;присвоение регистру значения 10

MOVLW 12h
MOVWF FSR ;поместить в FSR указатель на начальный адрес исследуемых регистров

START
RLF INDF,1 ;начало цикла проверки. Команда, адресующаяся к регистру
;INDF по очереди проверяет все ячейки
;сдвиг влево через перенос, результат в тот же регистр,т.к. d=1
BTFSC STATUS,C ;проверить бит переноса-заема С
; пропустить следующую команду,если бит С=0
INCF PODSCHET ;увеличить регистр на 1
INCF FSR,1 ; переход на следующий адрес
;
DECF DIGIT ;уменьшение на 1
MOVF DIGIT,1 ;проверка счетчика на ноль
BTFSS STATUS,Z ;проверка бита нуля Z, если бит равен 1
;следующая команда не выполняется

GOTO START ;переход на метку

END
Код программы подправлен, все работает, признаюсь, создавал переделками других программ, надо объяснить как работает эта программа(от метки старт, до нее все сделали и обьяснили) и вообще если честно не могу понять на чем тут все основано...) Если поможете буду очень-очень благодарен)
Аватара пользователя
Сергей
 
Связьинформ - г!вно. Просьба администрации не банить меня) просто не могу уже...
Сообщения: 620
Зарегистрирован: Ср 11 июл 2007, 15:43
Откуда: Кыштым

# 

22 дек 2011, 19:06 

Осмелюсь предположить, что речь идет о целых числах со знаком от -128 до 127
В таких числа знак указывается в старшем разряде (крайний левый бит, 7 разряд). «0» - число положительное, «1» - число отрицательное
Флаг С - бит переноса-заема.
RLF INDF,F и RLF INDF,1 – одно и тоже. Первая запись более понятна.
RLF INDF,W и RLF INDF,0 – одно и тоже. Первая запись более понятна.


; начало подсчета
START
RLF INDF,F ; старший разряд сдвигаем в бит переноса
;Флаг С содержит знак числа
;Флаг С = «0» - число положительное. Флаг С = «1» - число отрицательное
BTFSC STATUS, C ;если число отрицательное, то выполнить следующую команду
INCF PODSCHET,F ;увеличить регистр PODSCHET на 1.
INCF FSR,F ; переход на следующий адрес (следующие данные)
;Следующие команды более правильная организация цикла.
DECFSZ DIGIT,F ; DIGIT -1, если результат «0» то следующую команду пропустить.
GOTO START ;переход на метку START
; конец подсчета

Надо вывести результат
Например:
MOVFW PODSCHET
MOVWF PORTB ; PORTA как правило «куцый»

Если, что-то не понятно, задавайте вопросы.
Программа содержит мелкие ошибки. Желательно выложить начало программы.
Последний раз редактировалось svkazakov Чт 22 дек 2011, 19:41, всего редактировалось 1 раз.
Аватара пользователя
svkazakov
 
Сообщения: 462
Изображения: 22
Зарегистрирован: Пт 08 авг 2008, 06:26
Откуда: Кыштым

# 

22 дек 2011, 19:34 

Я бы эту программу написал так:

START
BTFSC INDF,7 ; если старший разряд «0» (число положительное), то следующую команду пропустить
INCF PODSCHET, F ;увеличить регистр PODSCHET на 1.
INCF FSR, F ; переход на следующий адрес (следующие данные)
DECFSZ DIGIT, F ; уменьшить регистр DIGIT на 1, если результат «0» то следующую команду пропустить.
GOTO START ;переход на метку START

Она не изменяет содержимое массива данных.
Аватара пользователя
svkazakov
 
Сообщения: 462
Изображения: 22
Зарегистрирован: Пт 08 авг 2008, 06:26
Откуда: Кыштым

# 

24 дек 2011, 09:51 

Спасибо большое, очень помогли разобраться с программой, только она что-то не так работает, цикл не завершается после 10ти раз и числа RG9 и RG10 не заносятся в регистры... Есть предположение что эти регистры используются для другого назначения по умолчанию...
Вот полный текст программы:
;Рабочая программа
include <P16F84.inc> ; подключить заголовочный файл P16F84.inc
LIST P=16F84 , E=2

RG1 equ 0x12 ; разместить регист Reg1 по адресу 30h
RG2 equ 0x13 ; разместить регист reg2 по адресу 40h
RG3 equ 0x14 ; разместить регист Reg1 по адресу 30h
RG4 equ 0x15 ; разместить регист reg2 по адресу 40h
RG5 equ 0x16 ; разместить регист Reg1 по адресу 30h
RG6 equ 0x17 ; разместить регист reg2 по адресу 40h
RG7 equ 0x18 ; разместить регист Reg1 по адресу 30h
RG8 equ 0x19 ; разместить регист reg2 по адресу 40h
RG9 equ 0x20 ; разместить регист Reg1 по адресу 30h
RG10 equ 0x21 ; разместить регист reg2 по адресу 40h
POD equ 0x22 ; разместить регист Reg1 по адресу 30h
DIGIT equ 0x23 ; разместить регист reg2 по адресу 40h
org 0x00 ;
;Установление значений регистров с числами
movlw B'00000001'
movwf RG1
MOVLW B'10000001'
MOVWF RG2
MOVLW B'00000011'
MOVWF RG3
MOVLW B'10000011'
MOVWF RG4
MOVLW B'00000111'
MOVWF RG5
MOVLW B'10000111'
MOVWF RG6
MOVLW B'00001111'
MOVWF RG7
MOVLW B'10001111'
MOVWF RG8
MOVLW B'00011111'
MOVWF RG9
MOVLW B'10011111'
MOVWF RG10


CLRF POD ; очистить регистр для подсчета отрицательных чисел
MOVLW 0Ah
MOVWF DIGIT ;присвоение регистру значения 10

MOVLW 12h
MOVWF FSR ;поместить в FSR указатель на начальный адрес исследуемых регистров

START
BTFSC INDF,7 ; если старший разряд «0» (число положительное), то следующую команду пропустить
INCF PODSCHET, F ;увеличить регистр PODSCHET на 1.
INCF FSR, F ; переход на следующий адрес (следующие данные)
DECFSZ DIGIT, F ; уменьшить регистр DIGIT на 1, если результат «0» то следующую команду пропустить.
GOTO START ;переход на метку START

END
Аватара пользователя
Сергей
 
Связьинформ - г!вно. Просьба администрации не банить меня) просто не могу уже...
Сообщения: 620
Зарегистрирован: Ср 11 июл 2007, 15:43
Откуда: Кыштым

# 

24 дек 2011, 19:07 

Сергей писал(а):числа RG9 и RG10 не заносятся в регистры... Есть предположение что эти регистры используются для другого назначения по умолчанию...

В 16-ричной системе счисления после 19 идет 1A, 1B… 1F, 20.
Лучше сделать так:
cblock 0x12
RG1 ; разместить регистр Reg1 по адресу 12h
RG2 ; разместить регистр reg2 по адресу 13h
RG3 ; разместить регистр Reg3 по адресу 14h
RG4 ; разместить регистр reg4 по адресу 15h
RG5 ; разместить регистр Reg5 по адресу 16h
RG6 ; разместить регистр reg6 по адресу 17h
RG7 ; разместить регистр Reg7 по адресу 18h
RG8 ; разместить регистр reg8 по адресу 19h
RG9 ; разместить регистр Reg9 по адресу 1Ah
RG10 ; разместить регистр reg10 по адресу 1Bh
PODSCHET ; разместить регистр PODSCHET по адресу 1Ch
DIGIT ; разместить регистр DIGIT по адресу 1Dh
endc
; желательное начало
ORG 0
GOTO BEGIN ;обходим адрес прерывания
ORG 4
RETFIE ; возврат из прерывания, на всякий случай
BEGIN
;Установление значений регистров с числами
movlw B'00000001'
и т.д.
Сергей писал(а):CLRF POD ; очистить регистр для подсчета отрицательных чисел

В одном месте PODSCHET, в другом POD – ошибка.
Сергей писал(а):цикл не завершается после 10ти раз

Цикл должен работать корректно. Ошибки не увидел.
Попробуй перед END вставить команду GOTO $; бесконечный цикл, «бег на месте»
Аватара пользователя
svkazakov
 
Сообщения: 462
Изображения: 22
Зарегистрирован: Пт 08 авг 2008, 06:26
Откуда: Кыштым

# 

26 дек 2011, 16:59 

Огромное спасибо!!! Прям правда от души огромное спасибо) Осталось завтра сдать её и всё)
Аватара пользователя
Сергей
 
Связьинформ - г!вно. Просьба администрации не банить меня) просто не могу уже...
Сообщения: 620
Зарегистрирован: Ср 11 июл 2007, 15:43
Откуда: Кыштым

# 

26 дек 2011, 17:35 

Сергей
Под постами есть кнопочка "Спасибо автору" :wink:
Аватара пользователя
msshveikin
 
Сообщения: 4711
Изображения: 24
Зарегистрирован: Пт 15 июн 2007, 09:44
Откуда: Тихое Зимовье

# 

26 дек 2011, 18:27 

Пожалуйста. Был рад помочь.
Аватара пользователя
svkazakov
 
Сообщения: 462
Изображения: 22
Зарегистрирован: Пт 08 авг 2008, 06:26
Откуда: Кыштым

НАПИСАТЬ ОТВЕТ

   Новые сообщения Новые сообщения    Нет новых сообщений Нет новых сообщений    Форум закрыт Форум закрыт