Здавалка
Главная | Обратная связь

Программа на Ассемблере



Один из возможных вариантов программы на Ассемблере приведен влистинге 1.19. Прежде чем переходить к подробному описанию ее работы, разберемся в некоторых общих вопросах. Начнем скода состояния клавиатуры. Как уже говорилось ранее, код состояния должен иметь отдельный бит для каждой кнопки клавиатуры. Итого, получается десять битов.

Одного байта явно мало. Значит, мы должны использовать двухбайтовый код состояния. Самый простой способ получить двухбайтовый код состояния – это прочитать сначала содержимое порта РО, а затем – содержимое порта РВ. Затем нужно наложить на каждый из полученных байтов маску.

Маска должна обнулить все ненужные нам разряды и оставить разряды, к которым подключены наши кнопки. Для числа, прочитанного из порта РЭ, маска должна обнулить самый старший разряд и оставить все остальные. Для числа, прочитанного из порта РВ, нужно, напротив, оставить три младших разряда и обнулить все остальные. Полученные таким образом два байта мы и будем считать кодом состояния клавиатуры.

В том случае, если все десять кнопок (S1-S10) отпущены, код состояния клавиатуры равен 0х7F, 0x07 (0b01111111, 0b00000111). В таком коде значащие биты, отражающие состояние той или иной кнопки, равны единице, а все остальные биты равны нулю. Если нажать любую кнопку, то код состояния изменится. Соответствующий этой кнопке бит примет нулевое значение. Таким образом, любое изменение состояния клавиатуры вызовет соответствующее изменение кода.

Теперь вернёмся к тексту программы. В программе применяются следующие новые для нас операторы.

cli – Общий запрет прерываний. Действие данной команды обратно действию уже знакомой нам команды sei. Команда не имеет параметров и служит для сброса флага I в регистре SREG.

St – Косвенная запись в память. Команда имеет три модификации: st W,Rd; st W+,Rd; st -W,Rd, где W – это одна из регистровых пар (X, Y или Z). Rd – имя одного из регистров общего назначения. Независимо от модификации команда выполняет запись содержимого регистра Rs в ОЗП по адресу, который хранится в регистровой паре W.

При этом первая модификация команды не изменяет содержимое регистровой пары W. Вторая модификация увеличивает содержимое регистровой пары на единицу после того, как произойдет запись. А третья модификация команды уменьшает на единицу содержимое регистровой пары перед тем, как произойдет запись в ОЗП.

В строке 75 нашей программы (см. листинг 1.19) содержимое регистра ХЬ записывается в ОЗУ по адресу, который хранится в регистровой паре Ъ. После этого содержимое регистровой пары Ъ увеличивается на единицу.

ld – Косвенное чтение из памяти. Данная операция является обратной по отношению к предыдущей. Она тоже имеет три модификации:

Id Rd,W; Id Rd, W+; Id Rd,-W

Операция производит чтение байта из ячейки ОЗУ, адрес которой хранится в регистровой паре W (то есть X, Y или Z) и записывает прочитанный байт в регистр общего назначения Rd. Содержимое регистровой пары так же, как и в предыдущем случае, ведет себя по-разному, в зависимости от модификации команды. То есть оно либо не изменяется, либо увеличивается после чтения, либо уменьшается прежде, чем байт будет прочитан.

В строке 97 нашей программы (листинг 1.19) читается байт из ячейки ОЗУ, адрес которой хранится в регистровой паре Z, и записывается в регистр data. Затем содержимое регистровой пары Z увеличивается на единицу.

Brsh – переход no условию «больше или равно». В качестве условия для перехода выступает содержимое флага переноса С. Флаг переноса устанавливается по результатам операции сравнения или вычитания. Команда имеет всего один параметр – относительный адрес перехода. Переход выполняет в том случае, если флаг переноса равен нулю. А это происходит только тогда, когда в предшествующей операции сравнения (вычитания) второй операнд окажется больше или равен первому.

Sbic – оператор типа «проверить - пропустить». Общая форма записи команды: sbic А,n, где А - номер регистра ввода-вывода; n - номер разряда.

Вместо номера регистра и номера разряда может использоваться имя регистра и имя разряда. Обычно используются стандартные имена от фирмы Atmel. Команда проверяет содержимое разряда номер п регистра А. Если разряд сброшен, то очередная команда программы не выполняется.

Пример использования данной команды - строка 159 нашей программы (см. листинг 1.19). В этой строке команда sbic проверяет бит eewe регистра eecr. Если этот бит сброшен, то команда в строке 160 не выполняется, а управление передается к строке 161. Если бит установлен, то выполняется команда в строке 160. Команда sbic имеет одно ограничение. Она работает с регистрами ввода-вывода с адресами в диапазоне от 0 до 31.

Cbr – сброс разрядов РОН. Данный оператор предназначен для одновременного сброса нескольких разрядов. Оператор имеет два параметра. Первый параметр - это имя регистра общего назначения, разряды которого должны быть сброшены. Второй параметр - это маска сброса разрядов. В данном случае маска – это двоичное число, у которого в единицу установлены те разряды, которые должны быть сброшены. Например, в строке 129 программы (листинг 1.19) сбрасываются разряды регистра ХН. Значение маски равно 0xF8. В двоичном виде число 0xF8 выглядит так: Ob11111000. Поэтому в результате действия команды cbr в строке 129 пять старших разрядов числа, находящегося в регистре ХН, будут сброшены в ноль, а три младшие останутся без изменений. Это альтернативный способ наложения маски.

 

Листинг 5.1.

 

 

 

 

 

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.