
- •Лабораторная работа №2 описание архитектуры микроконтроллера i80c196kc и макроассемблера mcs-96
- •1.Общие сведения
- •1.1. Обзор архитектуры
- •1.2. Внутренние периферийные устройства
- •1.3. Параметры синхронизации
- •1.4.Карта памяти микроконтроллера i80хc196kc
- •1.4.1. Основные разделы памяти
- •1.4.2. Регистровый файл rf (Register File)
- •1.5. Работа через горизонтальное окно
- •1.5.1. Выбор hWindow
- •1.7. Способы адресации
- •1.8.Описание макроассемблера mcs-96
- •1.8.1. Компоненты языка Ассемблера
- •1.9.Формат оператора
- •1.10. Сегменты
- •1.11. Директивы макроассемблера mcs-96
- •1.12. Признаки результата операции
- •1.13. Пример оформления программы на языке ассемблера mcs96
- •1.14. Анализ особенностей системы команд микроконтроллера
- •2. Порядок выполнения работы
- •2.1.Варианты для самостоятельной тренировки
- •2.2 Варианты для зачета
- •3. Содержание отчета
1.5.1. Выбор hWindow
Регистр выбора окна WSR (Window Select Register; WSR,14H) обеспечивает доступ к HWindows . Чтобы выбрать HWindow, запишите номер требуемого окна в биты WSR.0-WSR.3 и очиcтите биты WSR.4 - WSR.6. Доступны только HWindows 0, 1, и 15 .Все другие HWindows зарезервированы. В Табл. 2.2 приведено содержимое WSR для выбора каждого HWindow
Табл.2.2
Выбор HWindow
HWindow |
Содержимое WSR |
0 |
X000 0000B = 00H |
1 |
X000 0001B = 01H |
15 |
X000 1111B = 0FH |
1.5.1.1. HWindow 0 и HWindow 1
Window 0 - окно по умолчанию. Оно обеспечивает доступ для чтения к 19 регистрам и доступ для записи к 21 регистру. HWindow1 обеспечивает чтение/запись для 12 регистров.
Табл.2.3
1.5.1.2. HWindow 15
HWindow 15 обеспечивает доступ к тем же самым регистрам что и HWindow 0, кроме байтов 0ch-10h. Те регистры, которые доступны только для чтения в HWindow 0, доступны только для записи в HWindow 15, и наоборот.
Табл. 2.4
1.6. Типы данных микроконтроллера I80XC196KC
Архитектура MCS-96 поддерживает несколько типов данных,что удобно в различных системах управления.
Таблица 2.5
Типы данных микроконтроллера I80XC196KC
Тип операнда |
Число битов |
Знак |
Возможные значения |
Ограничения адресации |
Бит |
1 |
Нет |
0 или 1 |
Только как компоненты байтов |
Байт |
8 |
Нет |
0 - 255 |
Нет |
Короткое целое число |
8 |
Да |
-128 - +127 |
Нет |
Слово |
16 |
Нет |
0 - 65535 |
Четный адрес |
Двойное слово* |
32 |
Нет |
0 - 4294967295 |
Адрес кратен 4 |
Длинное целое* |
32 |
Да |
-2147483648 - +2147483647 |
Адрес кратен 4 |
* Операнды с 32 битами поддерживаются: только как операнд в операциях сдвига, как делимое в операциях деления 32-на-16, и как результат операции умножения 16-на-16.
1.7. Способы адресации
Для обращения к операндам внутри адресного пространства 80XC196KC используются шесть основных способов адресации:
- регистровая прямая адресация;
- косвенная адресация;
- косвенная адресация с автоинкрементом;
- непосредственная адресация;
- короткая индексная адресация;
- длинная индексная адресация.
При любом способе адресации, адрес регистра должен соответствовать правилам выравнивания для типа операнда.
Регистровая прямая адресация непосредственно обращается к регистру из 256-байтового нижнего регистрового файла. Адресуемый регистр определяется 8-битным полем внутри команды. В зависимости от команды, при вычислении могут участвовать до трех регистров .
Следующий фрагмент программы определяет начальные условия для демонстрации примеров адресации:
rseg at (30h) ;сегмент регистров
Reg_A: dsw 1 ;зарезервировать слово по адресу 30H
Reg_B: dsw 1 ;зарезервировать слово по адресу 32H
Reg_C: dsw 1 ;зарезервировать слово по адресу 34H
ALPHA: dsb 1 ;зарезервировать байт по адресу 36H
BETA: dsb 1 ;зарезервировать байт по адресу 37H
CL: dsb 1 ;зарезервировать байт по адресу 38H
Примеры регистровой прямой адресации:
a)
;Reg_A=100 Reg_B=200 Reg_C=300 CL=5
ADD Reg_A,Reg_B,Reg_C ; Reg_A <- Reg_B+Reg_C
b)
;Reg_A=500
MUL Reg_A,Reg_B ; Reg_A <- Reg_A * Reg_B
c)
;Reg_A=20000
INCB CL ; CL <- CL + 1 --- CL=6
Косвенный способ адресации обращается к операнду, извлекая его адрес из переменной типа СЛОВО в регистровом файле (RF). Обратите внимание, что косвенный адрес может определять операнд в любом месте адресного пространства, включая RF. 8-битное поле внутри команды определяет регистр, который содержит косвенный адрес. Команда может содержать только одну косвенную ссылку; любые дополнительные операнды должны быть указаны через прямую регистровую ссылку.
Примеры косвенной адресации:
a)
;Reg_A=100(100)=20
LD Reg_A,[Reg_A] ; Reg_A <- MEM_WORD (Reg_A)
;Reg_A=20 (100)=20
b)
;ALPHA=20 BETA=40 Reg_C=60 (60)=100
ADDB ALPHA,BETA,[Reg_C]
;ALPHA <-BETA+MEM_BYTE (Reg_C)
;ALPHA=140 BETA=40 Reg_C=60 (60)=100
c)
;SP=190H [SP]=5 [SP+2]=7 Reg_A=50 (50)=25
POP [Reg_A ] ; MEM_WORD (Reg_A) <- MEM_WORD (SP)
; SP < - SP + 2
;SP=192H [SP]=7 Reg_A=50 (50)=5
Косвенная адресация с автоинкрементом - такой же как и косвенный способ адресации, за исключением того, что переменная типа СЛОВО, которая содержит косвенный адрес, увеличивается после того, как она используется для адресации операнда. Если команда функционирует с БАЙТОМ или КОРОТКИМ ЦЕЛЫМ ЧИСЛОМ, косвенная переменная адреса увеличивается на 1. Если команда функционирует с СЛОВОМ или ЦЕЛЫМ ЧИСЛОМ, косвенная переменная адреса увеличивается на 2 .
Примеры косвенной адресации с автоинкрементом:
a)
; Reg_A=1 Reg_B=100 (100)=4
LD Reg_A,[Reg_B]+
; Reg_A < - MEM_WORD(Reg_B)
; Reg_B < - Reg_B + 2
; Reg_A=4 Reg_B=102
b)
;ALPHA=1 BETA=2 Reg_C=120 (120)=5
ADDB ALPHA,BETA,[Reg_C]+
;ALPHA< -BETA+MEM_BYTE (Reg_C)
; Reg_C <- Reg_C + 1
;ALPHA=7 BETA=2 Reg_C=121 (120)=5
c)
;SP=190H [SP]=5 [SP-2]=7 Reg_A=50 (50)=25
PUSH [Reg_A]+
; SP < - SP - 2
;MEM_WORD(SP)<-MEM_WORD(Reg_A)
; Reg_A < - Reg_A + 2
;SP=18EH [SP]=25 Reg_A=52
Непосредственный способ адресации использует 8 или 16-битный операнд непосредственно из поля в команде. Команда может содержать только одну непосредственную ссылку; любые дополнительные операнды должны быть указаны через прямую регистровую ссылку.
Примеры непосредственной адресации:
a)
;Reg_A=100
ADD Reg_A,#340 ;Reg_A<-Reg_A+340( ADD_2op )
;Reg_A=440
b)
;SP=200H [SP]=4444H
PUSH #1234H ; SP <- SP - 2
; MEM_WORD (SP) < - 1234H
;SP=19EH [SP]=1234H
c)
;Reg_A=105
DIVB Reg_A, 10 ; “LowByte(Reg_A)”<-Reg_A/10
; “HighByte(Reg_A)”<-Reg_A MOD 10
;если адрес Reg_A-30H, то (30H)=10 (31H)=5
В короткой индексной адресации адрес одного из операндов вычисляется из двух 8-битных полей. Одно 8-битное поле в команде определяет переменную типа СЛОВА в Регистровом Файле, которая содержит “базовый” адрес. Второе 8-битное поле в команде определяет “смещение”, которое суммируется с “базовым” адресом для формирования исполнительного адреса операнда. Исполнительный адрес может быть в пределах от -128 и до 127 байтов относительно “базового” адреса.
Команда может содержать только одну коротко индексную ссылку; любые другие операнды должны быть указаны через прямую регистровую ссылку.
Примеры короткой индексной адресации:
a)
;Reg_A=10 Reg_B=100 (112)=23
LD Reg_A,12[Reg_B] ; Reg_A < - MEM_WORD(Reg_B+12)
;Reg_A=23
b)
;Reg_C=50 (53)=40 BETA=2
MULB Reg_A,BETA,3[Reg_C]
;Reg_A<-BETA*MEM_BYTE(Reg_C+3)
;Reg_A=80
Длинная индексная адресация похожа на режим Короткой индексной адресации, за исключением того, что поле “смещение” - 16-битное.
Примеры длинной индексной адресации:
a)
;Reg_C=100 TABLE=300 (400)=0AAH Reg_B=55H Reg_A=0FFH
AND Reg_A,Reg_B,TABLE[Reg_C]; Reg_A < - Reg_B AND ;MЕM_WORD(TABLE+Reg_C)
;Reg_A=00H
b)
;Reg_A=30 Reg_B=9000H TABLE=50H (9050H)=77
ST Reg_A, TABLE[Reg_B]
;MEM_WORD(TABLE+Reg_B)<- Reg_A
;(9050H)=30
c)
;BETA=2 LOOKUP=5 Reg_C=100 (105)=21
ADDB ALPHA,BETA,LOOKUP[Reg_C]
; ALPHA <-BETA+MEM_BYTE(LOOKUP+Reg_C) ALPHA=23
Кроме основных способов существуют еще два - адресация через регистр нуля и адресация через регистр указателя вершины стека.
Адресация через регистр нуля (Zero Register Addressing): первые два байта в RF составляют регистр нуля ( ZERO_Reg ). Эти байты устанавливаются в нуль аппаратными средствами 80ХC196KC. Кроме обеспечения фиксированного источника постоянной нуля для вычислений и сравнений, может использоваться как “базовая” переменная СЛОВ0 в длинно-индексируемой ссылке. Такая комбинация выбора регистра ZERO_Reg и способа адресации позволяет непосредственно адресовать любую ячейку в памяти. Так как этот режим использует индексную адресацию, то доступ осуществляется медленнее чем прямые регистровые доступы.
Примеры адресации через регистр нуля:
a)
;Reg_A=10 (1234)=20
ADD Reg_A,1234[ZER0_Reg]
; Reg_A<-Reg_A+MEM_WORD(1234)
; Reg_A=30
b)
;SP=192 [SP]=23 (5678)=45
POP 5678[ZERO_Reg]
;MEM_WORD(5678)< - MEM_WORD (SP) SP < - SP + 2
;(5678)=23 SP=194
Адресация через регистр указателя вершины стека:
Байты 18H и 19H нижнего RF образуют систему указатель вершины стека SP (Stack Pointer), который адресуется как 18H (по адресу 18Н). Кроме обеспечения удобного манипулирования указателем вершины стека, SP может также использоваться как переменная СЛОВО в косвенной ссылке для обращения к вершине стека или в коротко-индексируемой ссылке для доступа к данным внутри стека.
Примеры адресации через регистр указателя вершины стека:
a)
;SP=190 (18EH)=20H
PUSH [SP] ; Дубликат TOP_OF_STACK
;SP=18EH (18EH)=18EH
b)
;Reg_A=0 SP=190 (192)=34
LD Reg_A, 2[SP ] ; Reg_A < - NEXT_TO_TOP
;Reg_A=34