D7
|
D6
|
D5
|
D4
|
D3
|
DATA SEGMENT
D0 DB 0F1H ;один байт равен F1H
D1 DW 4567H ;одно слово , равное 4567H
D2 DW D2 ;одно слово, равное 0003
D3 DD ? ;двойное слово без инициализации
D4 DB 20DUP(?) ; двадцать байтов без значений
D5 DW 10DUP(0) ;десять нулевых слов
DATA ENDS
Директивы DW с именем D2, определяют слово, равное 0003 - это смещение переменой D2 относительно начала сегмента, т.е. слово в этой директиве представляет собой адрес переменной в сегменте. Одиночный вопросительный знак в поле операнда означает, что содержимое ячеек памяти не задается в директиве. Конструкция DUP применяется для распределения и инициализации заданного числа единиц памяти. В качестве элементов в конструкциях DUP могут фигурировать численные и адресные выражения, вопросительный знак, список или повторная конструкция DUP.
Строковые переменные.
Хотя директива DB может создавать строковые переменные, в языке ассемблера отсутствуют строковые команды для чтения и записи строк, удаления символов, сравнения одной строки с другой. Эти действия могут быть реализованные с помощью процедур.
Существует несколько строковых форматов, например,
ASCII$ -строка - это набор ASCII-символов , заканчивающийся знаком доллара $
ASCIIZ -строка - - это набор ASCII-символов , заканчивающийся нулевым байтом.
Для создания ASCII$ - строки следует использовать директиву DB.
str_$ db 'Hello','$'
str_$ db 'Hello $'
Более распространены ASCIIZ- строки, они создаются также директивой DB
str_0 db 'Hello',0
ASCII - строки могут иметь длину от одного до тысяч байт.
яяяяяяяяяяя ЏҐаўл© Ў ©в бва®ЄЁ - нв® «ЁЎ® ASCII бЁ¬ў®«, «ЁЎ® г«Ґў®© Ў ©в, §лў Ґ¬л© в Є¦Ґ г«Ґўл¬ бЁ¬ў®«®¬ ASCII.
яяяяяяяяяяя …б«Ё ЇҐаўл© бЁ¬ў®« а ўҐ 0, в® бва®Є г«Ґў п, Ї®н⮬㠫ҐЈЄ® ᮧ¤ ў вм ЇҐаҐ¬ҐлҐ г«Ґў®© ¤«Ёл.
sbuf яяяя dbяяяяяяяяяяяяяяяяяяя 81я dup(0)яяяяяяяяяяяяяяяяяя ;80- бЁ¬ў®«мл© ЎгдҐа
ЏаЁ ᮧ¤ ЁЁ бва®ЄЁ в ЄЁ¬ бЇ®б®Ў®¬ ўбҐЈ¤ б«Ґ¤гҐв гбв ў«Ёў вм бзҐвзЁЄ DUP 1 Ў®«миҐ ¬ ЄбЁ¬ «м®Ј® зЁб« бЁ¬ў®«®ў, Є®в®а®Ґ Ї« ЁагҐв § ЇЁблў вм ў нвг бва®Єг,я зв®Ўл ®бв ў «®бм ¬Ґбв® ¤«п г«п, Є®в®ал¬ бва®Є ўбҐЈ¤ ¤®«¦ § Є зЁў вмбп.
‡ ¬Ґз ЁҐ!
Љ ўлзЄЁ ў Є ўлзЄ е. ‘ва®ЄЁ, ®ЇЁб лҐ б Ї®¬®ймо ¤ЁаҐЄвЁўл DB ¬®Јгв Ўа вмбп «ЁЎ® ў Ї®бва®дл ('), «ЁЎ® ў ¤ў®©лҐ Є ўлзЄЁя (").
Џа®б⥩訩 ¬Ґв®¤ ўЄ«озҐЁп Є ўл祪 ўгвам бва®Є б®бв®Ёв ў ЁбЇ®«м§®ў ЁЁ а §«Ёзле вЁЇ®ў Є ўл祪 ¤«п ўл¤Ґ«ҐЁп ўбҐ© бва®ЄЁ Ё ҐҐ ®в¤Ґ«мле з б⥩:
st1яяяяяя яяяяяяяяяяя dbяяяяяяя яяяяяяяяяяя ' "ЏаҐЄа б®" бЄ § « €ў ', 0
st1яяяяяя яяяяяяяяяяя dbяяяяяяя яяяяяяяяяяя " ' Ћв«Ёз®' бЄ § « ѓаЁЈ®аЁ©", 0
‹®Є «млҐ ¬ҐвЄЁ.
яяяяяяяяяяя ђ §«Ёз ов Ј«®Ў «млҐ Ё «®Є «млҐ ¬ҐвЄЁ. ѓ«®Ў «млҐ ¬ҐвЄЁ ¤®бвгЇл Ё§ «оЎ®Ј® ¬Ґбв Їа®Ја ¬¬л. ’ ЄЁҐ ¬ҐвЄЁ ¤®«¦л Ўлвм ўбҐ а §лҐ, з⮠ᮧ¤ Ґв бҐамҐ§лҐ Ґг¤®Ўбвў ЇаЁ ॠ«Ё§ жЁЁ Є®а®вЄЁе ЇҐаҐе®¤®ў , ЇаЁ¬Ґа в ЄЁе
яяяяяяяяяяя CMPяя AX,9яяяяяяяяяяяяяяяяяяяяяяяяяя ;Ђ•=9?
яяяяяяяяяяяяяяяяяяяяяяя яяяяяяяяяяя JEяяяяяяя яяяяяяяяяяя SKяяяяяя яяяяяяяяяяяяяяяяяяяяяяя яяяяяяяяяяя ;Їа®ЇгбвЁвм бва®Єг Ё ЇҐаҐ©вЁ ўЁ§, Ґб«Ё Ђ•=9
яяяяяяяяяяя ADDяяя CX,10яяяяяяяяяяяяяяяяяяяяяяяя ;€ зҐ ЇаЁЎ ўЁвм Є ‘• 10
яяяяяяяяяяяяяяяяяяяяяяя SK:
яяяяяяяяяяя Љ®а®вЄЁҐ ЇҐаҐе®¤л, ЇаЁ¬Ґа JE, ¬ҐвЄг SK пў«повбп ®зҐм з бв® ЁбЇ®«м§гҐ¬л¬Ё ¤«п Їа®Ја ¬¬Ёа®ў Ёп п§лЄҐ бᥬЎ«Ґа . ‘Є®аҐҐ ўбҐЈ® ЁЄ ЄЁҐ ¤агЈЁҐ Є®¬ ¤л Ґ Ўг¤гв ўлЇ®«пвм ЇҐаҐе®¤л нвг ¦Ґ ¬ҐвЄг, б«Ґ¤®ў ⥫м®, ¬ҐвЄ SK Ґ г¦ ЁЈ¤Ґ, Єа®¬Ґ нв®Ј® ¬Ґбв . ‚ Ў®«миЁе Їа®Ја ¬¬ в ЄЁе ЇҐаҐе®¤®ў ¬®¦Ґв бгйҐбвў®ў вм ®зҐм ¬®Ј® Ё ЇаЁ¤Ґвбп ЇаЁ¤г¬лў вм (Ё§®ЎаҐв вм) ¤«п Є ¦¤®Ј® Ё§ Ёе ®ўлҐ Ё¬Ґ . „«п гЇа®йҐЁп нв®Ј® TURBO ASSEMBLER Ї®§ў®«пҐв ᮧ¤ ў вм «®Є «млҐ ¬ҐвЄЁ, бгйҐбвўгойЁҐ ў в®© з бвЁ Їа®Ја ¬¬л, ў Є®в®а®© ®Ё г¦л.
яяяяяяяяяяя ‹®Є «млҐ ¬ҐвЄЁ Ё¤ҐвЁзл «оЎл¬ ¤агЈЁ¬ ¬ҐвЄ ¬, § ЁбЄ«о票Ґ¬ в®Ј®, зв® ®Ё зЁ овбп б ¤ўге § Є®ў @@. Ќ ЇаЁ¬Ґа,
яяяяяяяяяяя @@ 20:
яяяяяяяяяяя @@ TWO:
яяяяяяяяяяя ‚Ё¬ ЁҐ!
‹®Є «м п ¬ҐвЄ , бгйҐбвўгҐв в®«мЄ® ¤® б«Ґ¤го饩 Ј«®Ў «м®© ¬ҐвЄЁ.
ЏаЁ¬Ґа:
яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя JMPяяяя THEREяяяяяяяяяяяяяяяяяяяяяя ; ЏҐаҐе®¤ Ј«®Ў «мго ¬ҐвЄг
@@ 20:яяяяяяяяя INC яяя AX
яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя CMP я AX, 30
яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя JEяяяяяяяяяяяяяяяяяяя @@20яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя ; ЏҐаҐе®¤ «®Є «мго ¬ҐвЄг ўўҐае
THERE:яяяяяяяяяя CMP я AX, 30
яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя JE яяяяяя яяяяяяяяяяя @@20яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя ; ЏҐаҐе®¤ «®Є «мго ¬ҐвЄг ўЁ§
яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя XORяяя CX, CX
@@20:
Њ ббЁўл ў п§лЄҐ ЂбᥬЎ«Ґа .
яяяяяяяяяяя ЌҐ бгйҐбвўгҐв бЇҐжЁ «мле Є®¬ ¤, бвагЄвга Ё«Ё ¬Ґв®¤®ў ®ЇЁб Ёп Ё ЁбЇ®«м§®ў Ёп ¬ ббЁў®ў п§лЄҐ ЂбᥬЎ«Ґа . •®вп а Ў®в вм б ¬ ббЁў ¬Ё ¬®¦®. ’ Є, ЇаЁ¬Ґа, ¬ ббЁў 楫ле зЁбҐ« ¬®¦® ᮧ¤ вм ЁбЇ®«м§гп ®ЇҐа в®а DUP:
AR яяяя DB яяяяя 10 DUP (?) - яяяяяяяяяяяяя ;¬ ббЁў Ё§ 10 楫ле н«Ґ¬Ґв®ў.
Њ®¦® ®ЇаҐ¤Ґ«Ёвм Ї®б«Ґ¤®ў ⥫м®бвм Ё§ 10 § 票©:
AR яяяя DBяяяяяя яяяяяяяяяяя 0,1,2,3,4,5,6,7,8,9
Њ®¦® ᮧ¤ ў вм Ё ¬ ббЁўл Ё§ б®бв ўле н«Ґ¬Ґв®ў, ЇаЁ¬Ґа бва®Є:
яяяяяяяяяяя ARяяяяяяяяяяяяяяяяя DBяяяяяяяяяяяяяяяяя 20 DUP(?),0яяяяяяяяяяяяяя : AR [0]
яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя DBяяяяяяяяяяяяяяяяя 20 DUP(?),0яяяяяяяяяяяяяя : AR [1]
яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя DBяяяяяя яяяяяяяяяяя 20 DUP(?),0яяяяяяяяяяяяяя ; AR [3]
ЏаЁ ᮧ¤ ЁЁ Ў®«миЁе ¬ ббЁў б«Ґ¤гҐв ЁбЇ®«м§®ў вм в ЄЁҐ ¤ЁаҐЄвЁўл :
LABEL -я ¬ҐвЄ
REPT - Ї®ўв®аЁвм
LABELяяяяяяяяяяяяяяяяяяяяяя ARяяяяяяяяяяяяяяяяя BYTE
REPTяяяяяяяяяяяяя 100
яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяяяяяяяяя DBяяяяяя яяяяяяяяяяяяяяяяяяяяяяя 20 DUP(?),0
ENDM
яяяяяяяяяяя ЏҐаў п бва®Є ®ЇЁблў Ґв ¬ҐвЄг AR вЁЇ BYTE . ‡¤Ґбм ¬®¦® ЁбЇ®«м§®ў вм Ё ¤агЈЁҐ вЁЇл WORD, DWORD Ё в.¤.
яяяяяяяяяяя „ЁаҐЄвЁў LABEL гЄ §лў Ґв бᥬЎ«Ґаг, Є Є ¤аҐб®ў вм Ї®б«Ґ¤гойЁҐ ¤ лҐ. ‚ Ї ¬пвЁ ® Ґ १ҐаўЁагҐв ЁЄ Є®Ј® Їа®бва бвў .
яяяяяяяяяяя ‚ ЇаЁўҐ¤Ґ®¬ ЇаЁ¬ҐаҐ б«Ґ¤гойЁҐ ¤ лҐ пў«повбп бва®Є ¬Ё, Є®в®алҐ ўбҐЈ¤ ¤аҐбговбп Є Є ®¤Ё®злҐ Ў ©вл.
яяяяяяяяяяя „ЁаҐЄвЁў REPT (Ї®ўв®аЁвм ®ЇаҐ¤Ґ«Ґ®Ґ Є®«ЁзҐбвў® а §) (ў ¤ ®¬ б«гз Ґ 100 а §) Ї®ўв®апҐв «оЎ®© ®ЇҐа в®а п§лЄ бᥬЎ«Ґа . ‚бҐ, з⮠室Ёвбп ¬Ґ¦¤гя REPT Ё ENDM (Є®Ґж ¬ Єа®) Ї®ўв®апҐвбп в Є, Є Є Ґб«Ё Ўл нвЁ бва®ЄЁ Ўа «Ё Ґ®Ўе®¤Ё¬®Ґ Є®«ЁзҐбвў® а §.
ђ бᬮваЁ¬ 㤮Ўл© ЇаЁҐ¬ Ё§¬Ґпвм Є ¦¤л© а § ®ЇЁб ЁҐ ў ®ЇаҐ¤Ґ«ҐЁЁ. Ќ ЇаЁ¬Ґа ¤«п ᮧ¤ Ёп ¬ ббЁў Ё§ ¤Ґбп⨠楫ле н«Ґ¬Ґв®ў Ё § ¤ Ёп Є ¦¤®¬г н«Ґ¬Ґвг ¬ ббЁў § 票© ®в 0 ¤® 9 ¬®¦® ЁбЇ®«м§®ў вм б«Ґ¤го饥 ®ЇЁб ЁҐ:
VAL = 0яяяяяяяяяяяяяяяяяяяя ;яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя ¤ЁаҐЄвЁў ЇаЁбў Ёў Ёп
LABELяяяяяяяяяя ARяяяяяяяяяяяяяяяяяяяяяяяяяяяяя WORD
REPTя яяяяяяяяяяя 10
яяяяяяяяяяяяяяяяяяяяяя яяяяяяяяяяя DWяяяя VAL
яяяяяяяяяя VAL = VAL+1яяяяяяяяяя ;¤ЁаҐЄвЁў ЇаЁбў Ёў Ёп
ENDM
€¤ҐЄбЁа®ў ЁҐ ¬ ббЁў®ў.
яяяяяяяяяяя ђ бᬮваЁ¬ бЇ®б®Ўл звҐЁп Ё § ЇЁбЁ § 票© ў ¬ ббЁўл. Ќ ЇаЁ¬Ґа, Є Є ®Ўа вЁвмбп Є зҐвўҐа⮬г н«Ґ¬Ґвг ¬ ббЁў ? „«п нв®Ј® 㦮 Ї®Ё¬ вм, зв® ў п§лЄҐ бᥬЎ«Ґа Ё¤ҐЄбл ¬ ббЁў®ў - нв® ®ЎлзлҐ ¤аҐб . Џ®н⮬㠥§ ўЁбЁ¬® ®в вЁЇ ¤ ле, § ЇЁб ле ў ¬ ббЁў, Ё¤ҐЄб жЁп ®в¤Ґ«мле § 票© (в.Ґ. ®в¤Ґ«мле н«Ґ¬Ґв®ў) бў®¤Ёвбп Є ¤ўг¬ и Ј ¬:
1) 㬮¦Ёвм а §¬Ґа н«Ґ¬Ґв ¬ ббЁў Ё¤ҐЄб ¬ ббЁў ; I
2) ЇаЁЎ ўЁвм १г«мв в Є Ў §®ў®¬г ¤аҐбг ¬ ббЁў .
ЏаЁ¬Ґа. ‚ Їа®б⮬ ¬ ббЁўҐ Ў ©в®ў, Ґб«Ё I=0, в®Ј¤ I*1=0*1=0 Ї«об ¤аҐб ar (Ў § ) ®ЇаҐ¤Ґ«пҐв ЇҐаўл© н«Ґ¬Ґв ¬ ббЁў ar [0] ‚в®а®© н«Ґ¬Ґв ar [1] (I=1) а бЇ®«®¦Ґ Ї® Ў §®ў®¬г ¤аҐбг Ї«об 1 (I*1=1) Ё в.¤.
яяяяяяяяяяя €в Є, 㦮 § 票Ґ Ё¤ҐЄб ¬ ббЁў ЇаҐ®Ўа §®ў вм ў ¤аҐб Ї ¬пвЁ. ЏаЁ¬Ґа ЇаЁўҐ¤Ґ аЁб 1.
яяяяяяяяяяя €§ аЁбгЄ ўЁ¤®, зв® Ё¤ҐЄб 0 нЄўЁў «ҐвҐ ¤аҐбг 000D , в.Ґ. Ў §®ў®¬г ¤аҐб㠢ᥣ® ¬ ббЁў .
€¤ҐЄб 1 ᮮ⢥вбвўгҐв 000…, Ё¤ҐЄб 2 - 000F Ё в Є ¤® Ё¤ҐЄб 7, Є®в®ал© ®ЇаҐ¤Ґ«пҐв н«Ґ¬Ґв б ¤аҐб®¬ 0014.
ЏаЁ¬Ґа. ђ Ў®в б н«Ґ¬Ґв ¬Ё 100 - ЎЁв®ў®Ј® ¬ ббЁў . ђҐ¦Ё¬ TURBO ASSEMBLER IDEAL.
DATASEG
ARяяяяяяяяяяяяяяяяя DBяяяяяяяяяяяяяяяяяяяяяяяяяяяяя 100 DUP(?)
CODESEG
MOV яяяяяяяяяяяя AL, [AR+63]яя ; „®Ў ў«ҐЁҐ 64-в®Ј® н«Ґ¬Ґв ¬ ббЁў Є AL
‚ Ў®«миЁб⢥ б«гз Ґў Ї®¤ Ё¤ҐЄбл ¬ ббЁў®ў ЇаҐ¤Ї®зЁв ов ЁбЇ®«м§®ў вм ॣЁбвал Ё«Ё ЇҐаҐ¬ҐлҐ ў Ї ¬пвЁ. ЏаЁ¬ҐпҐвбп Ў §®ўл© бЇ®б®Ў ¤аҐб жЁЁ, ¬®¦® § ЇЁблў вм § зҐЁп Ё¤ҐЄб®ў ¬ ббЁў®ў ў ॣЁбва ‚•.
Ќ ЇаЁ¬Ґа, ў ॣЁбва AL ¤® § Јаг§Ёвм н«Ґ¬Ґв ¬ ббЁў AR c Ё¤ҐЄб®¬ index. ќв® ¬®¦® ᤥ« вм в Є:
DATASEG
INDEXяяяяяяяяяяяяяяяяяяяяяя DWяяяяяяяяяяяяяяяя ?
ARRAYяяяяяяяяяяяяяяяяяяяяя DBяяяяяяяяяяяяяяяяяяяяяяяяяяяяя 10 DUP(?)
CODESEG
MOVя яяяяяяяяяяя BX, [INDEX]яяяяяяяяяяяяя ; Ї®«гзЁвм § 票Ґ Ё¤ҐЄб .
MOVя яяяяяяяяяяя AL, [BX+AR]яяяяяяяяяяяя ; AL
„«п нвЁе ¦Ґ 楫Ґ© ¬®¦® ЁбЇ®«м§®ў вм ॣЁбвал SI Ё DI
MOVя SI, [INDEX]яя яяяяяяяяяяяяяяяяяяяяяяя ; Џ®«гзЁвм § 票Ґ Ё¤ҐЄб
MOVя AL, [SI+AR]яяяяяяяяяяяяяяяяяяяяяяяяяя ; AL
MOVя DI, [INDEX]яяяяяяяяяяяяяя яяяяяяяяяяя ; Џ®«гзЁвм § 票Ґ Ё¤ҐЄб
MOVя AL,[DI+AR]яяя яяяяяяяяяяя яяяяяяяяяяя ; AL
ЋЇҐа в®ал TYPE, LENGTH, SIZE.
ќвЁ ўбва®ҐлҐ ®ЇҐа в®ал ЁбЇ®«м§говбп ў ўла ¦ҐЁпе, Ј¤Ґ § Їа иЁў Ґвбп вЁЇ Ёд®а¬ жЁЁ.
ЋЇҐа в®а TYPE (вЁЇ) б®®Ўй Ґв, бЄ®«мЄ® Ў ©в ®вўҐ¤Ґ® ¤«п ЇҐаҐ¬Ґ®© (1 (DB) ,яяя 2 (DW) Ё«Ё 4 (DD)).ќв® вЁЇ н«Ґ¬Ґв .
ЋЇҐа в®а LENGTH (¤«Ё ) б®®Ўй Ґв зЁб«® ®б®ўле Ґ¤ЁЁж Ї ¬пвЁ (Ў ©в, б«®ў Ё«Ё ¤ў®©ле б«®ў), а бЇаҐ¤Ґ«Ґле ў бва®ЄҐ б ®ЇаҐ¤Ґ«Ґ®© ЇҐаҐ¬Ґ®©. Љ®«ЁзҐбвў® н«Ґ¬Ґв®ў ў ¬ ббЁўҐ.
ЋЇҐа в®а SIZE (а §¬Ґа) б®®Ўй Ґв, бЄ®«мЄ® Ў ©в Ї ¬пвЁ а бЇаҐ¤Ґ«Ґ® ЇаЁ ®ЇаҐ¤Ґ«ҐЁЁ ЇҐаҐ¬Ґ®©. „«п нвЁе ®ЇҐа в®а®ў бЇа ўҐ¤«Ёў® б®®в®иҐЁҐ.
SIZE<Ё¬п> = LENGTH<Ё¬п>*я TYPE<Ё¬п>
ЏаЁ¬Ґа ЇаЁ¬ҐҐЁп а бб¬ ваЁў Ґ¬ле ®ЇҐа в®а®ў:
DATASEG
ARяяяяяяяяяяяяяяяяя DWяяяя 20 DUP(?)яяяяяяяяяяяяяяяяя ; Ї ¬пвм, ўл¤Ґ«пҐ¬ п ў ᥣ¬ҐвҐ ¤ ле Ї®¤ ¬ ббЁў,
; 㦮 Ї®¤бзЁв вм, Є Єго б㬬㠮 § Ё¬ Ґв ў я; Ї ¬пвЁ
SUBяяя AX, AXяяяяяяяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяяяяяяяяя ; ®Ўг«Ёвм Ђ•
MOVя CX, LENGTH ARяяяяя ; зЁб«® н«Ґ¬Ґв®ў ¬ ббЁў AR ў ‘•
MOVя SI, SIZE ARяяяяяяяяяяяяяяя яяяяяяяяяяя ; Ё¤ҐЄб Є®ж ¬ ббЁў
яяяяяяяяяяя яяяяяяяяяяя SUM:яя SUBяяя SI, TYPE ARяяяяяяяяяяяяя яяяяяяяяяяя ; зв®Ўл ®бгйҐбвўЁвм ЇҐаҐе®¤ ЇаҐ¤л¤гйЁ©
; н«Ґ¬Ґв, ўлзЁв Ґвбп а §¬Ґа®бвм н«Ґ¬Ґв ¬ ббЁў .
яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя яяяяяяяяяяя ADDяяя AX, AR [SI]яяяяяяяяяяяяяяя ; ЇаЁЎ ўЁвм н«Ґ¬Ґв
яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя LOOP SUMяяяяяяяяяяяяяя ; жЁЄ« Ўг¤Ґв ўлЇ®«пвмбп ¤® вҐе Ї®а, Ї®Є ‘• Ґ
; ®Ўа вЁвбп ў г«м.
‡ ¬Ґ ваЁЎгв®ў ЇҐаҐ¬Ґле.
ЏҐаҐ¬Ґ п Ё¬ҐҐв ваЁ ваЁЎгв : вЁЇ, ᥣ¬Ґв, ᬥ饨Ґ ў ᥣ¬ҐвҐ.
ЋЇҐа в®а § ¬Ґл вЁЇ Ё¬ҐҐв д®а¬ в:
яяяяяяяяяяяяяяяяяяяяяя BYTE
яяяяяяяяяяяяяяяяяяяяяя WORDяяяяяяяяяяяяяяяяяяяяяя PTR < Ё¬п ЇҐаҐ¬Ґ®© >
яяяяяяяяяяяяяяяяяяяяяя DWORD
Љ®бвагЄжЁп <вЁЇ> PTR < Ё¬п ЇҐаҐ¬Ґ®© > ®§ з Ґв, зв® ў Є®¬ ¤Ґ б«Ґ¤гҐв ЁбЇ®«м§®ў вм ᥣ¬Ґв Ё ᬥ饨Ґ б Ё¬ҐҐ¬я <Ё¬п ЇҐаҐ¬Ґ®©>, ® б пў® § ¤ л¬ вЁЇ®¬.
ЏаЁ¬Ґа:
MOVя BYTEя PTRяяяя DW5, 7;
ADDяя AL, BYTEяяяяяяяяяяяяяяяяяя PTRяяяя DW5;
ЋЇҐа в®а § ¬Ґл вЁЇ вॡгҐвбп ¤«п гбва ҐЁп Ґ®¤®§ з®бвЁ, Є®в®а п ¬®¦Ґв ў®§ЁЄгвм ў ®Ўа 饨пе вЁЇ :
INCяяя [B•]яяяяяяяяяяяяяяя ;ЁЄаҐ¬Ґв Ў ©в Ё«Ё б«®ў ?
яяяяяяяяяяя ЏаЁ ®ЇҐаЁа®ў ЁЁ Ў ©в®¬ 㦮 пў® ®ЇаҐ¤Ґ«Ёвм вЁЇ ®ЇҐа ¤ :
DATASEG
Ќ Ї®¬Ё¬, зв® ЇҐаҐ¬Ґ п ®ЇаҐ¤Ґ«пҐвбп ¤ЁаҐЄвЁў ¬Ё DB,DW,DD а бЇаҐ¤Ґ«ҐЁп ¤ ле Ё Ё¬ҐҐв 3 ваЁЎгв : ᥣ¬Ґв, ᬥ饨Ґ Ё вЁЇ.
яяяяяяяяяяя ЊҐвЄ - нв® Ё¬п ( в®зҐҐ ¤аҐб) п祩ЄЁ Ї ¬пвЁ, ᮤҐа¦Ё¬®Ґ Є®в®а®© бзЁв Ґвбп ¬ иЁ®© Є®¬ ¤®©. Ќ Ї®¬Ё¬ ® ¬ҐвЄ е б«Ґ¤го饥. — йҐ ўбҐЈ® ¬ҐвЄ ®ЇаҐ¤Ґ«пҐвбп гЄ § ЁҐ¬ ў Ї®«Ґ ¬ҐвЄЁ Ё¬ҐЁ б Ї®б«Ґ¤гойЁ¬ ¤ў®Ґв®зЁҐ¬. Ќ® ¬ҐвЄЁ ¬®Јгв ®ЇаҐ¤Ґ«пвмбп Ё ЎҐ§ § ўҐаи о饣® ¤ў®Ґв®зЁп, ЇаЁ¬Ґа, ¤ЁаҐЄвЁў ¬Ё LABEL Ё ў ®ЇаҐ¤Ґ«ҐЁпе Їа®жҐ¤га. ЊҐвЄЁ Ё¬Ґов 4 ваЁЎгв : ᥣ¬Ґв, ᬥ饨Ґ, а ббв®пЁҐ (вЁЇ NEAR Ё«Ё FAR ), ЇаҐ¤Ї®«®¦ҐЁҐ ® ॣЁбвॠCS.
яяяяяяяяяяя —Ёб«®ўлҐ ўла ¦ҐЁп
б Ї®¬®ймо ¤ЁаҐЄвЁўл EQU ¬®Јгв ®Ў®§ з вмбп бЁ¬ў®«ЁзҐбЄЁ¬Ё Ё¬Ґ ¬Ё. ‚ н⮬ б«гз Ґ Ё¬п § ¬ҐпҐв зЁб«® Ё ¬®¦Ґв Ўлвм §ў ® "зЁб«®ўл¬ Ё¬ҐҐ¬". —Ёб«®ў®Ґ Ё¬п Ё¬ҐҐв вЁЇ NUMBER (зЁб«®). ‘®®вўҐвб⢥® ¤ўг¬ Є« бб ¬ бЁ¬ў®«ЁзҐбЄЁе Ё¬Ґ ўл¤Ґ«повбп ўла ¦ҐЁп: ¤аҐблҐ Ё зЁб«®ўлҐ.
яяяяяяяяяяя Ђ¤аҐбл¬ §лў Ґвбп ўла ¦ҐЁҐ Є®в®а®Ґ ўлзЁб«пҐвбп ¤«п Ї®«гзҐЁп ¤аҐб Ї ¬пвЁ (¤ ле Ё Є®¬ ¤). Ђ¤аҐблҐ ўла ¦ҐЁп Ё¬Ґов ®Ўп§ ⥫млҐ ваЁЎгвл: ᥣ¬Ґв, ᬥ饨Ґ, вЁЇ. Љ ¦¤л© Ё§ ваЁЎгв®ў ¤аҐб®Ј® ўла ¦ҐЁп пў«пҐвбп зЁб«®¬, ® б ¬® ўла ¦ҐЁҐ зЁб«®¬ Ґ пў«пҐвбп.
яяяяяяяяяяя —Ёб«®ўл¬
§лў Ґвбп ўла ¦ҐЁҐ, ў १г«мв ⥠ўлзЁб«ҐЁп Є®в®а®Ј® Ї®«гз Ґвбп зЁб«®. Ќ ЇаЁ¬Ґа, ў Є®¬ ¤Ґ
я
яяяяяяяяяяяяяяяяяяяяяя MOVяя AL,MUR
бЁ¬ў®«ЁзҐбЄ®Ґ Ё¬п MUR пў«пҐвбп ¤аҐбл¬ ўла ¦ҐЁҐ¬, Ї®н⮬г нв Є®¬ ¤ § Јаг¦ Ґв ў ॣЁбва AL ᮤҐа¦Ё¬®Ґ Ё§ п祩ЄЁ Ї ¬пвЁ б ¤аҐб®¬ MUR .
‚ Є®¬ ¤Ґ
яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя яMOVя ЂL, OFFSET MUR
‚ла ¦ҐЁҐ OFFSET MUR ЁбЇ®«м§гҐв ўбва®Ґл© ®ЇҐа в®а OFFSET (ᬥ饨Ґ), Є®в®ал© д®а¬ЁагҐв ў ўЁ¤Ґ зЁб« ᬥ饨Ґ ¤аҐб®Ј® ўла ¦ҐЁп MUR. ‘«Ґ¤®ў ⥫м®, нв Є®¬ ¤ § Јаг§Ёв ў ॣЁбва ЂL ᬥ饨Ґ ¤аҐб®Ј® ўла ¦ҐЁп MUR.
яяяяяяяяяяя ’ ЄЁ¬ ®Ўа §®¬, ЁбЇ®«м§®ў ЁҐ ¤аҐб®Ј® ўла ¦ҐЁп ў Ї®«Ґ ®ЇҐа ¤ Є®¬ ¤ ЇаҐ®Ўа §®ў Ё© ¤ ле ®§ з Ґв , зв® ®ЇҐа ¤®¬ Ўг¤Ґв ᮤҐа¦Ё¬®Ґ ¤аҐб㥬®© п祩ЄЁ Ї ¬пвЁ. Ђ¤аҐб®Ґ ўла ¦ҐЁҐ ў Ї®«Ґ ®ЇҐа ¤ Є®¬ ¤ ЇҐаҐ¤ зЁ гЇа ў«ҐЁп ®ЇаҐ¤Ґ«пҐв ўбва Ёў Ґ¬л© ў Є®¬ ¤г ¤аҐб ЇҐаҐе®¤ .
‡ 票Ґ зЁб«®ў®Ј® ўла ¦ҐЁп (зЁб«®), § ¤ ®Ј® ў Є®¬ ¤Ґ, ЇаҐўа й Ґвбп ў ҐЇ®б।бвўҐл© ®ЇҐа ¤.
„ЁаҐЄвЁўл гЇа ў«ҐЁп ᥣ¬Ґв ¬Ё.
„ЁаҐЄвЁўл SEGMENT/ENDS.
яяяяяяяяяяя Ќ Ї®¬Ё¬, зв® дЁ§ЁзҐбЄЁ© ¤аҐб д®а¬ЁагҐвбп ЇаЁ б«®¦ҐЁЁ б¬ҐйҐЁп Ё 㬮¦Ґ®Ј® 16 ᥣ¬Ґв®Ј® ¤аҐб , еа п饣®бп ў ®¤®¬ Ё§ ᥣ¬Ґвле ॣЁбва®ў: ‘S (¤«п ᥣ¬Ґв Є®¤ ), DS (¤«п ᥣ¬Ґв ¤ ле), SS(¤«п ᥣ¬Ґв б⥪ ), ES (¤«п ᥣ¬Ґв ¤®Ї®«ЁвҐ«мле ¤ ле).
яяяяяяяяяяя ‘вагЄвга ᥣ¬Ґв Є®¤ Ё¬ҐҐв ўЁ¤:
яяяяяяяяяяя
€¬п ᥣ¬Ґв яяяяяяяяяяяяяяяяяяяяяяя SEGMENT яяя [<бЇЁб®Є ваЁЎгв®ў>]
яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя Љ®¬ ¤л Ё ®в®бпйЁҐбп Є
яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя Ё¬ ¤ЁаҐЄвЁўл.
€¬п яᥣ¬Ґв яяяяяяяяя ENDS
‘ЇЁб®Є ваЁЎгв®ў пў«пҐвбп Ґ®Ўп§ ⥫мл¬, ® ® Ґ®Ўе®¤Ё¬, Ґб«Ё Їа®Ја ¬¬ б®бв®Ёв Ё§ ҐбЄ®«мЄЁе ¬®¤г«Ґ©.
‘вагЄвга ᥣ¬Ґв ¤ ле Ё¬ҐҐв ўЁ¤:
€¬п ᥣ¬Ґв яяяяяяяяяяяяяяяяяяяяяяя SEGMENT яяя [<бЇЁб®Є ваЁЎгв®ў>]
яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя „ЁаҐЄвЁўл ®ЇаҐ¤Ґ«ҐЁп Ї ¬пвЁ,
а бЇаҐ¤Ґ«ҐЁп Ё ўла ўЁў Ёп
€¬п яᥣ¬Ґв яяяяяяяяя ENDS
€¬ҐҐ¬ ᥣ¬Ґв ¬®¦Ґв Ўлвм «оЎ®© ¤®ЇгбвЁ¬л© Ё¤ҐвЁдЁЄ в®а. Ќ § 票Ґ ᥣ¬Ґв®ў ᥣ¬Ґвл¬ аҐЈЁбва ¬ ®бгйҐбвў«пҐвбп ¤ЁаҐЄвЁў ¬Ё.
„ЁаҐЄвЁў ASSUME.
”®а¬ в ¤ЁаҐЄвЁўл Ё¬ҐҐв ўЁ¤:
яяяяяяяяяяя ASSUME яяяяяя ЌЂ‡ЌЂ—…Ќ€…,.., ЌЂ‡ЌЂ—…Ќ€…,
Ј¤Ґ ЌЂ‡ЌЂ—…Ќ€… Ё¬ҐҐв д®а¬ в:
яяяяяяяяяяя €¬п ᥣ¬Ґв®Ј® ॣЁбва : €¬п ᥣ¬Ґв .
ЏаЁ¬Ґа ®ЇаҐ¤Ґ«ҐЁп ᥣ¬Ґв Є®¤ :
CODSEGяяяяяяяяяяяяяяяяяя SEGMENTяяяя ; ‘ҐЈ¬Ґвг COD § зЁ¬ ᥣ¬Ґвл© аҐЈЁбва CS
DATAX ENDS
TEXT1 SEGMENT 'CODE'
.
.
.
DATAY ENDS
Здесь два сегмента DATAX и DATAY имеют тип класса 'DATA', следовательно, оба копируются в выполняемый файл перед сегментом ТЕХТ1.
Сегменты, для которых никакого имени класса в явном виде нет, имеют имя "нулевого класса" и будут записываться как непрерывные блоки вместе с другими сегментами, имеющими имя нулевого класса. Общий размер всех сегментов в классе не более 64 К.
Замечание.
Порядком, в котором компоновщик будет загружать, сегменты можно управлять, например, задав и ассемблировав фиктивный программный файл, содержащий пустые определения сегментов в том порядке, в котором нужно загрузить реальные сегменты. После ассемблирования этого файла его можно задать в качестве первого объектного файла при любом запуске компоновщика LINK. В этом случае компоновщик автоматически загрузит объединенные в классы сегменты в заданном порядке.
Директива GROUP.
Группа - это множество программируемых областей, объединенных так, что они используют общую базу. Группа представляет собой "объединение объединений", так как группа состоит из отдельных областей, каждая из которых построена из отдельных логических сегментов. Информация ассемблеру для объединения в группу нескольких областей содержится в директиве GROUP , имеющей формат:
Имя группы GROUP Имя сегмента, [Имя сегмента]…..
Директива GROUP ассоциирует указанное 'имя' группы с одним или более сегментами и переопределяет адреса всех меток и переменных, определенных в заданном сегменте таким образом, что они отсчитываются относительно начала данной группы, а не относительно начала сегмента, в котором они определены.
Указанное имя сегмента должно представлять собой имя какого-либо сегмента, определенного с помощью директивы SEGMENT или выражения SEG .
Директива GROUP не влияет на порядок загрузки сегментов той или иной группы. Порядок зависит от класса каждого из сегментов или о того порядка, в котором объектные модули заданы компоновщику.
Сегменты в группе не обязательно должны быть непрерывными. Не принадлежащие к определенной группе сегменты могут быть загружены между сегментами, принадлежащими группе. Единственное ограничение - смещение от первого байта в группе не более 64К.
Имена групп можно использовать с директивой ASSUME и в качестве префикса операнда с оператором переопределения сегмента (:).
В любом исходном файле имя группы не должно использоваться более чеи в одной директиве GROUP. Если в пределах отдельного исходного файла к одной группе принадлежат несколько сегментов, то имена всех этих сегментов должны быть заданы в одной и той же директиве GROUP. Например:
DGROUP GROUP ASEG, BSEG
ASSUME DS:DGROUP
ASEG SEGMENT BYTE PUBLIC 'DATA1'
SUM_A:
ASEG ENDS
BSEG SEGMENT BYTE PUBLIC 'DATA2'
SUM_B:
BSEG ENDS
CSEG SEGMENT BYTE PUBLIC 'DATA3'
SUM_C:
CSEG ENDS
Порядок, в котором компоновщик LINK выполняет загрузку этих сегментов показан на рисунке ниже.
Рис. Порядок загрузки компоновщиком сегментов
Первым LINK загружает ASEG, т.к. он стоит первым в исходном файле, Затем - CSEG т.к. он имеет тот же тип класса, что и ASEG. Последним компоновщик загружает BSEG. В тоже время ASEG и BSEG объявлены как часть одной группы, несмотря на их размещение в памяти. Это означает, что смещение для символьных имен SUM_A и SUM_B отсчитывается от начала этой группы. Оно же является началом для сегмента ASEG. Смещение для имени SUM_C отсчитывается о начала сегмента CSEG.
Основы микропроцессорной техники
1.3. Интерфейс ввода-вывода
1.3.1. Общие сведения: синхронный и асинхронный обмен, ввод-вывод с квитированием
Различают два варианта - синхронный и асинхронный обмен данными.
Синхронный обмен данными.
Синхронным обменом данными называется такой обмен данными, когда устройства ввода - вывода работают синхронно по отношению к МП. Синхронный обмен данными может быть реализован, если устройства являются достаточно быстродействующими.
На рисунке ниже приведена типичная схема портов ввода и вывода. Портам присвоен 8-разрядный адрес, по которому МП может отличить их от других портов. Хотя порт ввода и порт вывода имеют один и тот же адрес, однако они отличаются сигналами "Ввод" и "Вывод" на ШУ. При выполнении команд ввода - вывода на 8 младших разрядов ША подается адрес порта, указанный во втором байте команды. Специальная схема, реализующая операцию И (&), распознает адрес данного порта. Входы этой схемы подключены к 8 младшим линиям ША.
Синхронный ввод.
Порт ввода имеет 8-разрядный регистр, на который поступает информация от внешнего устройства. Выводы этого регистра подключены к ШД через 8 тристабильных формирователей. Сигналом разрешения чтения этих формирователей является результат логического умножения сигналов "Выборка" и управляющего сигнала "Ввод".
1.На шину адреса поступает адрес порта ввода. На выходе дешифратора (на рис. схема И) появляется активный сигнал ‘Выборка’(S).
2.На шине управления появляется активный сигнал ‘Ввод’.
3.На выходе схемы ‘И’ появляется активный сигнал, который подключает выходы Q7… Q0 порта ввода к линиям D7… D0 шины данных, т.е. на шине данных появился внешний мир (в это время МП защелкивает данные в аккумулятор). На шине данных данные из внешнего мира находятся до тех пор, пока активен сигнал ‘Ввод’.
МП снимает сигнал ‘Ввод’, и связь между выходами Q7… Q0 порта ввода . и шиной данных прерывается.
Порт ввода передает данные на шину данных только во время активного сигнала ‘Ввод’.
Синхронный вывод.
1. На шину адреса поступает адрес порта вывода.
2.На выходе дешифратора (на рис. схема И) появляется активный сигнал ‘Выборка’ (S).
3.Из аккумулятора выставляется число на шину данных. Данные находятся на входе D7… D0 8-разрядного регистра-защелки.
4.На шину управления подается активный сигнал ‘Выход’, который поступает на схему ‘И’. В итоге формируется сигнал ‘Разрешение загрузки’.
Информация защелкивается и появляется на Q7… Q0 порта вывода.
Выведенные данные будут сохраняться на Q7… Q0 порта вывода, пока не будут выведены следующие данные.
Асинхронный (условный ) ввод-вывод.
Этот способ обмена применяется в том случае, когда устройство работает асинхронно по отношению к процессору. Если, например, устройство ввода - АЦП, то после запуска АЦП на его выходе появляются данные для ввода в МП, но эти данные никак не связанные с работой МП. Поэтому возникает задача согласования моментов срабатывания внешнего устройства и МП. В противном случае при вводе передача может произойти в тот момент, когда данные еще не готовы, а при выводе - когда предыдущие данные еще не были восприняты внешним устройством.
Асинхронный обмен данными между МП и внешним устройством состоит из трех операций:
|
Запуск устройства.
|
Преобразование аналогового сигнала в цифровой. Мы постоянно спрашиваем устройство - закончило оно преобразование или нет.
|
Все готово и мы вводим данные.
|
Рассмотри случаи, когда запуск осуществляется МП в моменты времени, определяемые либо программой, либо самим внешним устройством.
1) Пусть запуск устройства осуществляет программа - внешнее устройство, получив сигнал от МП, выдает очередную порцию информации в порт ввода или принимает слово из порта вывода. Через некоторое время, заранее известное программисту и достаточное для завершения действий в устройстве, программа вновь может обращаться к порту. На рис. ниже показан вариант формирования программой сигналов запуска устройств с помощью триггеров (командой OUT PORTZAP для устройства вывода и командой IN PORTZAP1 для устройства ввода)
После завершения действия устройство подает сигнал сброса соответствующего триггера.
2) Пусть действие в устройстве запускается самим устройством, а программа при этом получает информацию о завершении действия в устройстве и о готовности к очередной передаче данных.
В этом случае программой используется признак готовности порта, устанавливаемый устройством, и порт состояний, разряды которого характеризуют условия, относящиеся к устройствам. В подпрограмме ввода-вывода через некоторый порт сначала выясняется готовность устройства путем ввода содержимого соответствующего порта состояния и проверки бита готовности.
Met: IN portst;
ANI maskvv ; накладываем маску готовности
JNZ met ; если устройство не готово, опрашиваем его еще раз
IN portvv; ввод данных
В реальной жизни устройство и запускается, и проверяется программой (см. на рисунках ниже).
Ввод-вывод с квитированием.
Схема обмена и соответствующая временная диаграмма приведены на рис. ниже.
При таком вводе-выводе (см. рис. выше) приемник выставляет сигнал"Запрос данных", а источник информации выдает не только данные, но и сигнал "Данные достоверны" (ДД)
Приемник,
получив сигнал "Данные достоверны", читает данные и снимает сигнал "Запрос данных".
После снятия сигнала "Запрос данных" источник "понимает", что данные получены и снимает данные и сигнал "Данные достоверны".
Рассмотрим ввод данных с квитированием.
На рисунках ниже приведены более подробные схемы ввода данных с квитированием.
Упрощенная подпрограмма реализации ввода приведена ниже
|
MVI A, zapros
OUT portu
|
МЕТ1: IN portst
|
ANI maskdd; накладывается ;маска
JZ МЕТ1; формируем признак ;0,переход на метку
|
IN portvv
MOV С,A; убрали данные в ;порт А
|
MVI A, 0
OUT portu
|
МЕТ2: IN portst
|
ANI maskdd
JNZ МЕТ2
RET
|
1.3.2. Ввод-вывод по прерыванию
У МП есть сигнал Запрос Прерывания (ЗПр). Это некий эквивалент бита готовности, который МП проверяет в конце каждой выполненной команды.
Получив сигнал ЗПр, МП завершает выполнение текущей команды и, определив номер устройства, выставившего ЗПр, передает управление подпрограмме обслуживания этого устройства. Точнее при получении сигнала ЗПр МП приостанавливает выполнение текущей программы, запоминает состояние внутренних регистров и переходит к подпрограмме, обмена информацией с запросившим устройством. Подпрограмма обслуживания обработки прерывания заканчивается командой возврата, после чего продолжается выполнение прерванной программы.
Для процессора I8080 используется команда RST n, где n принимает значения от 0 до 7.
Дадим пояснения на примере выполнения команды RST 2. При чтении этой команды из памяти код команды поступает в регистр команд, затем этот код преобразуется в адрес, в котором все единицы (кроме содержащих номер прерывания разрядов, которые остаются без изменений) заменяются нулями (см. рис. ниже). Это адрес
записывается в счетчик команд и становится адресом, по которому МП уходит на подпрограмму. При этом значение адреса следующей команды прерываемой программы из СК сохраняется в стеке.
Начальные ячейки памяти, адреса которых формируются из кодов команд RST 0-RST 7, располагаются по следующим адресам: 0000h для RST 0, 0008h для RST 1, 0010h для RST 2, 0018h для RST 3, 0020h для RST 4, 0028h для RST 5, 0030h для RST 6, 0038h для RST 7.
Временная диаграмма чтения из памяти программного прерывания приведена на рисунке выше:
- На ША из СК подается адрес команды RST 2
- На ШУ подается команда "Чтение памяти"
- Читается содержимое ячейки памяти и код RST2 (11010111) с ШД защелкивается в регистр команд.
Рассмотрим способ передачи кода команды RST 2 в регистр команд
микропроцессора по сигналу ЗПр. При готовности устройства к обмену интерфейс внешнего устройства выдает сигнал ‘Устройство готово к обмену‘ и формирует сигнал ЗПр. МП, получив этот сигнал, формирует на шине управления ШУ сигнал подтверждения прерывания ППр, по которому содержимое с ШД микропроцессор записывает в свой регистр команд (см. рис. ниже). Задача состоит в том, чтобы в этот момент на ШД оказался код команды RST 2.
Вариант формирования на шине данных кода команды RST 2 приведен на рисунке ниже
Алгоритм обслуживания прерываний приведен на рисунке ниже.
Рассмотрим теперь случай, когда несколько внешних устройств ВУ0..ВУ7 могут выставлять ЗПр0..ЗПр7. Эти запросы прерываний объединяются по схеме ИЛИ и передаются в МП (см. рис. ниже). Следовательно, процессор перейдет на подпрограмму. Далее МП в этой подпрограмме идентифицирует устройство, выставившее ЗПр, например, следующим образом.
Все внешние устройства формируют бит готовности. Опрашивая порт состояния, МП узнает, какое из устройств нужно обслуживать, используя, например, программный поллинг.
Программный поллинг (опрос)
В подпрограмме обслуживания прерывания реализуется алгоритм, которой приведен ниже.
Достоинство программного поллинга заключается в простоте его реализации, почти не требующей дополнительных аппаратных средств. Основным недостатком программного поллинга является достаточно большое время, затрачиваемое на опрос состояния всех устройств, даже тех из них, которые не требуют обслуживания. Это приводит к потерям времени МП и замедлению его реакции на запросы прерывания.
Если программный поллинг не удовлетворяет, то используется векторное прерывание.
Существуют 3 способа реализации векторного прерывания:
1) аппаратный поллинг
2) использование шифратора приоритетов
3) выдача первой команды обслуживания прерываний.
Рассмотрим каждый способ реализации в отдельности.
Аппаратный поллинг.
При аппаратном поллинге схемы прерываний внешних устройств присоединяются к МП в виде приоритетной цепочки таким образом, что МП может осуществлять автоматический опрос с целью идентификации прерывающего устройства (см. рис. ниже). Получив сигнал ЗПр, МП формирует сигнал на линии ППр, который последовательно проходит через все устройства. При прохождении сигнала ППР по цепочке проверяется состояние триггеров готовности устройств. Если устройство не требует прерывания, то сигнал ППр проходит в следующее устройство, пока не встретится прерывающее устройство. Следовательно, приоритетность устройств определяется их близостью к МП по линии ППр. Получив сигнал ППр, прерывающее устройство передает по шине данных свой адрес (вектор), который имеет однозначное соответствие с начальным адресом подпрограммы обслуживания прерывания данного устройства.
Достоинства: увеличена реакция системы, так как нет необходимости проверять бит готовности.
Недостатки: аппаратно (т.е. жестко) закреплена приоритетность устройства. - Больший приоритет имеет устройство, расположенное ближе к МП по линии ППр. Этот недостаток можно устранить путем использования шифратора приоритетов .
Использование шифратора приоритетов.
В этой системе прерываний МП сообщается номер прерывающего устройства. Прерывание вызывает переход на фиксированную ячейку, где начинается главная программа обработки прерываний. Эта программа выводит данные из специального порта, содержащего номер устройства, выставившего ЗПр.
При наличии нескольких ЗПр управление передается устройству с более высоким приоритетом. Номер наиболее приоритетного устройства определяется с помощью шифратора приоритетов. На его вход подаются запросы прерываний ЗПр от отдельных устройств, входы которых пронумерованы, начиная с 0. Номер входа соответствует номеру подключенного устройства.
ЗПр0
|
000
|
FAM DB 'IVANOV'
Символьные цепочки, содержащие более двух символов , применяются только для инициализации памяти. Ассемблер представляет цепочку в виде последовательности байт, соответствующих кодированию символов цепочки в коде ASCII.
Директивы.
Директивы определения переменных.
Директивы DB,DW,DD.
Рассмотрение директив начнем с директив определения данных DB (определить байт), DW (определить слово), DD (определить двойное слово).
Формат директив.
DB
<имя переменной> DW <нач. значение>, [<нач. значение>]…
DD
Мнемокоды директив фактически определяют тип переменных ( байт, слово, двойное слово). Поле операнда директив идентифицирует, сколько байт, слов, двойных слов распределяют директивы и какими должны быть их начальные значения. Атрибутом сегмента переменной является тот сегмент, в котором она определена. Атрибут смещения переменной равен числу байт от начала сегмента до ячейки с переменной.
В качестве начального значения может фигурировать выражение, содержащее значение инициализации для одной единицы памяти. Выражения могут быть числовые и адресные.
Замечание!
.кроме директив DB,DW,DD есть еще следующие директивы для 386,486, 586 .
DP - определить указатель - 32-разрядный указатель
DF - определить дальний указатель - 48- разрядный указатель
DQ - определить учетверенное слово ( 8байтов) - вещественные числа
DT - определить 10 байтов - BCD числа
Инициализированные и неинициализированные слова.
Если первоначальное значение переменных не важно, то их можно определить как неинициализированные переменные .
stud db ? ; байт с неизвестным значением
morestud dw ?; слово с неизвестным значением .
Для получения резервирования большого инициированного пространства следует использовать DUP выражения со знаком ? в скобках.
При запуске программы созданный этой директивой 1000-байтовый буфер состоит из байтов, не имеющих определенных значений. Главная причина для использования неинициализированных переменных состоит в уменьшении размера исполняемого файла. Вместо записи бесполезных байтов на диск во время исполнения выделяется неинициализированное пространство. Для этого необходимо придерживаться двух правил:
1) Размещать все неинициализированные переменные последними в сегменте данных.
2) Предварять неинициализированные переменные директивой UDATASЕG. Встретив директиву UDATASЕG Turbo Assembler автоматически поместит эту часть за последнюю инициализированную страницу.
Примеры:
Пусть поступили следующие запросы прерывания
|
b2 =I7 + I6 + I5 + I4
При такой прошивке приоритетов - наивысший приоритет у I7 наименьший - I0.
|
ЗПр1
|
001
|
I1
|
ЗПр2
|
010
|
I2
|
ЗПр3
|
011
|
I3
|
ЗПр4
|
100
|
I4
|
ЗПр5
|
101
|
I5
|
ЗПр6
|
110
|
I6
|
ЗПр7
|
111
|
I7
|
Пример. Пусть поступили следующие запросы прерывания - ЗПр5, ЗПр3.,ЗПр1.Тогда,
Получаем код команды RST5.
Выдача первой команды обслуживания прерываний.
Кроме команды RST n e VG Ш8080 есть еще команда CALL addr16 . В этом случае сигнал ППр будет выставляться 3 раза, т.к. команда CALL addr16 трехбайтная. В первый раз передается собственно код команды CALL, второй и третий раз передается 16-тиразрядный адрес (см. рис. ниже).
ППр
У МП I8086 есть команда INT n, n=0…255. Эта команда 2-х байтовая. Для ввода этой команды сигнал ППр будет выставляться два раза (см. рис. ниже).
ППр
Далее выполняется введенная команда INT n (или CALL addr16)
1.3.3. Ввод-вывод с использованием прямого доступа к памяти
Если нужно ввести массив с высокоскоростного устройства, например, с быстродействующего АЦП то может оказаться, что время генерирования байтов данных сравнимо с временем выполнения подпрограммы прерывания. В этом случае МП может не успеть за устройством ввода. В подобных случаях применяется ввод-вывод с прямым доступом к памяти (ПДП) с помощью контроллера ПДП, т.е. обмен данными между внешним устройством и памятью выполняется без участия МП.
Обмен в режиме ПДП выполняется, как правило, под управлением специальной микросхемы, называемой контроллером ПДП. Начальный адрес ячейки обмена в памяти и количество передаваемых байтов заранее программно записывается в контроллер ПДП. При возникновении необходимости обмена в режиме ПДП устройство ввода-вывода выдает сигнал «Запрос ПДП» на вход контроллера ПДП. Если данному устройству разрешена передача данных в режиме ПДП, то контроллер ПДП после получения сигнала «Запрос ПДП» подает на МП сигнал «Запрос захвата» (ЗЗх).
В ответ на этот сигнал МП приостанавливает свою работу и отключается от системной магистрали (т.е. от ША, ШД, ШУ), выдавая контроллеру сигнал «Подтверждение захвата» (ПЗх). Получив сигнал «Подтверждение захвата», котроллер ПДП выдает устройству ввода-вывода сигнал «Подтверждение ПДП». Затем он организует обмен данными между памятью и устройством ввода-вывода путем подачи на ША адресов ячеек памяти, а на ШУ управляющих сигналов Запись (Чтение) и Ввод (Вывод). По окончании передачи контроллер ПДП снимает сигнал «Запрос захвата» и МП продолжает свою работу.
1.3.4. Микропроцессорный комплект семейства КР580
Неполный состав микропроцессорного комплекта КР580 приведен на рисунке ниже.
БРА – буфер адреса.
СКФ – системный контроллер и шинный формирователь.
ППА - программируемы параллельный адаптер - имеет три восьмиразрядных порта ввода - вывода.
ПСА - программируемый последовательный адаптер - осуществляет последовательный обмен данными.
ПТ - программируемый таймер - счетчик, на базе которого можно построить интерфейс частотного датчика, подсчитать частоту или период. Имеется возможность выдавать программируемые частоты, подсчитывать входные события. В каждом канале есть 16-ти разрядный вычитающий счетчик.
ПКП - программируемый контроллер прерываний - принимает запросы от внешних устройств и сообщает процессору о том, что поступил запрос прерывания и выдает адрес подпрограммы обслуживания прерываний от соответствующего устройства .
ПККИ - программируемый контроллер клавиатуры и индикации.
КПДП - контроллер прямого доступа к памяти.
Обобщенная структура интерфейсной БИС.
Обобщенная схема интерфейсной БИС приведена на рисунке ниже.
Рассмотрим назначение основных элементов интерфейсной БИС.
Буфер данных
- согласует интерфейсную БИС с ШД МП-системы.
Схема управления. - управляет работой всей БИС. Она содержит регистры состояний, в которых проверяется сигнал готовности ( готов / не готов)
Регистр режимов - в него записываются кодовые слова, которые настраивают БИС на определенный режим работы.
ДШ – дешифратор адреса.
Операционные блоки (или просто блоки)- в них собственно и выполняются действия по сопряжению с периферийными устройствами. Состав операционных блоков (блоки 1…N) определяются конкретным значением БИС. В параллельном адаптере операционными блоками являются буферные регистры, работающие в режиме входного порта, выходного порта и порта ввода-вывода. В последовательном адаптере к магистрали подключены сдвигающие регистры, преобразующие параллельный формат данных на внутренней магистрали в последовательный на выходной линии адаптера и наоборот. Формирователь временных интервалов в качестве операционных блоков содержит управляемые пересчетные схемы, а контроллер прерывания – регистры, фиксаторы и блоки логической обработки. Операционные блоки контроллера прямого доступа представляют собой счетчики для формирования массива адресов оперативной памяти с дополнительными схемами генерации управляющих сигналов для обмена.
Ниже рассмотрены некоторые интерфейсные БИС.
1.3.5. Программируемый параллельный адаптер КР580ВВ55
Программируемый параллельный адаптер (ППА) обеспечивает обмен информацией между МП-системой и периферийными устройствами в параллельном коде. Он имеет три многорежимных порта ввода-вывода, которые обозначены как А, В и С.
Адресация к портам следующая:
А1 А0
0 0 порт А
0 1 порт В
1 0 порт С
1 1 регистр управляющего слова.
Порты А,В,С можно запрограммировать в одном из 3-х режимов:
Обозначение режима
|
INC BYTE PTR [BХ]
Атрибут сегмента заменяется явным указателем сегментного регистра в команде
Используемые порты
|
Реализуемый обмен данными
|
Режим 0
|
А,В,С,
|
синхронный обмен данными
|
Режим 1
|
А,В
|
ввод/вывод с квитированием
|
Режим 2
|
А
|
двунаправленный ввод/вывод с квитированием.
|
Если порты А и В запрограммированы в режим 1, то порт С используется для формирования служебных сигналов (см. рис. ниже), а также используется в качестве порта состояний.
Форматы управляющих слов для ППА.
ППА управляется двумя управляющими словами.
Формат управляющего слова, задающего режимы работы портов ППА (первое управляющее слово).
DD7
|
DD6
|
DD5
|
DD4
|
DD3
|
DD2
|
DD1
|
DD0
|
D7 –1 –всегда в управляющем слове задание режима.
D6, D5 - задают режим порта А
0 0- режим 0
0 1 - режим 1
1 Х - режим 2
D4 - направление обмена порта А
0 - вывод
1- ввод
D3 - направление обмена старшего полубайта порта С
0- вывод
1 - ввод
D2 - режим работы порта В
0 - режим 0
1- режим 1
D1 направление обмена порта В
0 - вывод
1- ввод
D0 - направление обмена младшего полубайта порта С.
0- вывод
1 - ввод
Пример. Допустим, что надо запрограммировать порт А на ввод в режиме 0, порт В на вывод в режиме 0, РС4…РС7 – на вывод в режиме 0, РС0…РС3 – на ввод в режиме 0.
D7 D6 D5 D4 D3 D2 D1 D0
1 0 0 1 0 0 0 1
91h
Программирование ВВ55
MVI A, 91h; управляющее слово >аккумулятор
OUT portRUS; управляющее слово из аккумулятора > регистр управляющего слова
Формат управляющего слова установки-сброса разрядов порта С (второе управляющее слово)
Осуществляет установку и сброс разрядов порта С. Можно побитно управлять разрядами порта С.
Пример: установить второй разряд порта С в единицу.
D7 D6 D5 D4 D3 D2 D1 D0
0 х х х ½ 0 1 0 1
05h
Временные диаграммы 0-го и 1-го режима.
Ввод в режиме 0.
|
Вывод в режиме 0
|
Из временной диаграммы ввода в режиме 0 видно, что в этом режиме порт не фиксирует вводимую информацию (т.е. выполняет только функцию вентиля). Следовательно, вводимое слово должно присутствовать на входе порта во время действия активного сигнала ЧтВВ.
При выводе информация фиксируется на выходных линиях порта до ее замены в следующем цикле вывода (т.е. порт выполняет функции простого буферного регистра).
|
Режим 1 (ввод или вывод с квитированием) обеспечивает возможность организации однонаправленной асинхронной передачи информации между МП-системой и периферийным устройством. Временная диаграмма ввода в режиме 1 для портов А и В приведены на рисунке ниже, где используются следующие обозначения сигналов:
С - Строб приема;
ВхБП Входной буфер полон;
ЗПр Запрос прерывания;
При вводе данных в режиме 1 сигнал «Строб» выполняет функции сигнала «Данные достоверны», а сигнал «Входной буфер полон» выполняет функции сигнала «Запрос данных».
Формирование служебных сигналов с помощью старшего и младшего полубайтов порта С приведено на рисунке ниже.
Если РгРС4 сбросить в 0, то будут замаскированы аппаратные сигналы запроса прерывания порта А ( ЗПрА)
РгРС4 - запрещает / разрешает прерывания от порта А при вводе.
РгРС6 - запрещает / разрешает прерывания от порта А при выводе.
Ниже приведен формат слова состояния ППА (читается по адресу порта С) для случая ввода данных в режиме 1 через порты А и В.
D7,D6 - резервные разряды, которые могут быть использованы для ввода / вывода информации
D5 - Входной буфер порта А полон
D4 - РгРС4
D3 - Запрос прерывания от порта А
D2 - РгРС2
D1 - Входной буфер порта В полон
D0 - Запрос прерывания от порта В.
1.3.6. Интерфейс клавиатуры и индикации
Интерфейс клавиатуры и индикации рассмотрим на примере клавишного пульта ввода, содержащего для конкретности матрицу из 4х4 ключей и цифровой индикатор. В качестве интерфейсной схемы используется программируемый параллельный адаптер (ППА) КР580ВВ55.
Ключи в матрице располагаются так, как показано на рисунке ниже
На рисунке ниже приведена схема
Рассмотрим, как МП-система определяет, какая клавиша нажата, на примере клавиатуры 4х4.
Согласно приведенному выше рисунку, порты ППА надо запрограммировать следующим образом:
Порт С
|
младший полубайт - на вывод
старший полубайт - на ввод
|
Порт А
Порт В
|
В режиме 0
|
Из приведенного выше рисунка видно, что один вывод каждой клавиши соединен с одной из входных линий R0, R1, R2, R3, а другой – с одной из выходных линий S0, S1, S2, S3. Если на все выходные линии S0, S1, S2, S3 подавать высокий уровень 1, на всех входных линиях R0, R1, R2, R3 всегда будет уровень 1, вне зависимости от того есть ли нажатая клавиша или нет (см. табл. ниже).
S0
|
S1
|
S2
|
S3
|
1
|
1
|
1
|
1
|
R0
|
R1
|
R2
|
R3
|
1
|
1
|
1
|
1
|
Чтобы обнаружить нажатую клавишу, надо руководствоваться следующим правилом. В каждый момент времени только одна из выходных линий S0, S1, S2, S3 (т.е. один из разрядов РС0..РС3 порта С ППА) может иметь уровень 0, а остальные должны иметь уровень 1. В то время как единственная выходная линия имеет уровень 0, входные линии R0, R1, R2, R3 проверяются МП-системой путем ввода разрядов РС4..РС7 порта С. Если при этом есть нажатая клавиша, то соответствующая ей выходная линия будет иметь уровень 0
Пока не нажата ни одна клавиша, везде на выходных линиях R0, R1, R2, R3 сохраняется высокий уровень напряжения.
Пусть в первой строке матрицы появился нулевой уровень напряжения, т.е.
Если при этом будет нажата клавиша в первом столбце матрицы, тогда на входы РС4-РС7 порта С ППА будет поступать комбинация сигналов
Следовательно, нажатая клавиша дает уровень 0 на соответствующей выходной линии R0 R1 R 2 R3.
номер клавиши
|
Команда MVI
Команда MVI отличается от команды MOV тем, что в качестве источника данных используется восьмиразрядная константа, которая следует непосредственно за кодом операции. Приемником данных является регистр r или ячейка памяти М.
MV1 С,data8; data8>С
Команда LXI
Команда LXI может быть использована для загрузки регистровых пар (B-пары,
D-пары, H-пары) и указателя стека SР шестнадцатиразрядным числом, которое непосредственно следует за кодом операции.
LXI D,data16; data16>( D,E )
Команды LDA, STA
По команде LDA в аккумулятор загружается содержимое ячейки памяти, адрес которой следует за кодом операции. По команде STA содержимое аккумулятора записывается в ячейку памяти, адрес которой следует за кодом операции.
LDA addr16; addr16 A
STA addr16; A addr16
Команды LDA и STA являются трехбайтными. В первом байте содержится код операции, во втором байте - младший байт адреса ( addrмл ), а в третьем байте - старший байт адреса ( addrст ).
Команда LDAX.
По команде LDAX в аккумулятор загружается содержимое ячейки памяти, адресуемой регистровой парой (B,C) или (D,E). Команда STAX осуществляет передачу содержимого аккумулятора в ячейку памяти, адресуемой регистровой парой (B,C) или (D,E).
LDAX В; косвенная адресация. Предварительно в В-пару загружается адрес ячейки, содержимое которой загружается в аккумулятор.
Операции с портом.
Команды IN и OUT управляют обменом информации между аккумулятором А и портами ввода-вывода. В команде IN (ввод) источником является порт ввода port, а приемником - аккумулятор А. В команде OUT (вывод) источником является аккумулятор А, а приемником порт вывода port. Адрес порта непосредственно следует за кодом операции IN или OUT.
IN addrport;
OUT addrport;
Работа со стеком.
Команда LXI
LXI SР,data16; data16
SР. С этого момента известно, где в памяти находится стек.
Команды пересылок PUSH (Поместить в стек) и РOP (Вытолкнуть из стека) всегда оперирует с регистровой парой (B,C), (D,E), (H,L) или парой регистров (А,РП), образующей слово состояния программы PSW.
Напомним, что указатель стека SP содержит адрес той ячейки в стеке, в которую в последний раз была записана информация, т.е адрес верха стека.
По команде PUSH (Поместить в стек) выполняются действия:
а) содержимое SP сначала уменьшается на 1 (декрементируется);
б) старший байт загружается в стек;
в) содержимое SP вновь декрементируется;
г) младший байт загружается в стек.
PUSH В; Записать в стек В-пары
По команде РОР (Вытолкнуть из стека) выполняются обратные действия. Сначала младший байт выталкивается из стека в МП и содержимое SP увеличивается на 1 (инкрементируется). Затем старший байт выталкивается из стека в МП и содержимое SP инкрементируется.
POP В; вытолкнуть из стека в В-пару
2) Арифметические команды.
Под управлением команд этой группы микропроцессор может выполнять в АЛУ арифметические операции. Напомним, что МП I8080 выполняет только сложение и вычитание. Поскольку этот МП является одноадресным, то один из операндов в арифметических операциях всегда помещается в аккумулятор, неявно адресуемый самим кодом операции. Вслед за кодом операции необходимо указывать местонахождение второго операнда. Результат (сумма или разность) помещается в аккумулятор. Операнд, который перед арифметической операцией находился в аккумуляторе, после выполнения операции уничтожается.
Команда сложения ADD, ADC
ADD r; А+В>А
ADC r; А+В+CY>A
Команда ADC является разновидностью команды ADD. По команде ADC происходит не только сложение двух операндов, но и сложение с признаком переноса CY, оставшимся от предыдущей операции. Результат сохраняется в аккумуляторе.
Команда сложения ADI, AСI
Команда ADI осуществляет сложение операнда, который непосредственно следует за кодом операции, с содержимым аккумулятора. По команде AСI непосредственный операнд суммируется с содержимым аккумулятора и с признаком переноса CY
ADI data8; А+ data8
>А
ACI data8; А+ data8 +CY>A
Команда вычитания SUB, SBB
Команда SUB позволяет микропроцессору непосредственно вычесть содержимое одного из регистров общего назначения или ячейки памяти М из содержимого аккумулятора. Команда SBB является разновидностью команды SUB. По этой команде осуществляется вычитание с заемом.
SUB r A – r >A
SUB M A – M >A
SBB r A – r - CY >A
SBB M A – M - CY >A
Команда вычитания SUI, SBI
По команде SUI из содержимого аккумулятора вычитается операнд, который непосредственно следует за кодом операции. По команде SBI из содержимого аккумулятора вычитается и непосредственный операнд, и признак заёма CY.
SUI data8; А+ data8
>А
SBI data8; А+ data8
+CY>A
Внимание!
Все описанные арифметические команды сложения и вычитания изменяют (модифицируют) содержимое всех признаков регистра признаков.
Команды INR, DCR
Команда INR является разновидностью команды ADD. По этой команде МП увеличивает на 1 содержимое одного из регистров РОН, аккумулятора или ячейки памяти М. Команда DCR является разновидностью команды вычитания SUB. По этой команде МП уменьшает на 1 содержимое одного из регистров РОН, аккумулятора или ячейки памяти М.
INR r r + 1 > r
INR M M + 1 > M
DCR r r – 1 > r
DCR M M – 1 > M
Внимание!
Эти команды модифицируют все признаки за исключением признака переноса CY.
Команды INX, DCX
Команда инкремента INX и декремента DCX позволяют соответственно увеличить и уменьшить на 1 содержимое регистровых пар (B-, D- , H- пары) и указателя стека SP.
INX rp; rp + 1 > r
DCX rp; rp – 1 > r
Внимание!
Эти команды не модифицируют регистр признаков.
Команды DAD, DAA
Команда двойного сложения DAD суммирует содержимое регистровой пары (H,L) и адресуемой регистровой пары rp (rp это B-,D- H- пары, SP)
DAD rp; (H,L) + rp > (H,L)
Внимание!
Эта команда модифицирует только признак переноса.
Команда десятичной коррекции аккумулятора DAA осуществляет перевод 8-разрядного двоичного числа в аккумуляторе в две цифры двоично-десятичного кода с правильной установкой признака переноса CY. При этом производятся следующие действия:
1. Если младшая тетрада содержит число, больше 910, или установлен признак вспомогательного переноса АС=1, то содержимое аккумулятора увеличивается на 610.
2. Если после этого старшая тетрада аккумулятора содержит число, большее 9, или установлен признак вспомогательного переноса CY=1, то в старшую тетраду прибавляется 610
Внимание!
При десятичной коррекции модифицируются все признаки регистра признаков.
3) Логические команды и команды сдвига.
С помощью команд логических операций и сдвигов могут быть выполнены следующие действия:
- логические операции И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ (сложение по модулю 2) с использованием двух операндов. Один из операндов всегда размещается в аккумуляторе. Результат выполнения команды фиксируется в аккумуляторе.
Команда ANA
Команда ANA осуществляет логическую операцию И над содержимым аккумулятора и содержимым одного из регистров РОН, аккумулятора и ячейки М
ANA r; A & r> A
ANA M; A & M> А
Команда ORA
Команда ORA реализует логическую ИЛИ над содержимым аккумулятора и содержимым одного из регистров РОН, аккумулятора и ячейки М
ORA r; A r>A
ORA M A M>А
Команда XRA
Команда XRA осуществляет логическую операцию ИСКЛЮЧАЮЩЕЕ ИЛИ над содержимым аккумулятора и содержимым одного из регистров РОН, аккумулятора и ячейки М
XRA r; A r> A
XRA M; A M> А
Команды ANI, ORI, XRI
Эти команды отличаются от команд ANA, ORA, XRA тем, что второй операнд следует непосредственно за кодом операции.
ANI data8; A & data8> A
ORI data8; A data8> A
XRI data8; A data8> A
Команды CMP, CPI
Команда CMP используется для сравнения двух чисел, одно из которых находится в аккумуляторе, а другое в одном из регистров РОН, аккумуляторе или ячейке М. При сравнении одно из чисел вычитается из другого числа. В соответствии с результатом формируются признаки регистра признаков. Содержимое аккумулятора при этом не изменяется.
CMP r; A – r
CMP M; A – M
CPI data8 A – data8
Разница между командами CMP и SUB в том, что при выполнении команды CMP результат операции не фиксируется в аккумуляторе.
Внимание!
Команды логических операций и сравнения модифицируют регистр признаков.
Команда CMA
Команда CMA используется для инвертирования содержимого аккумулятора.
CMA; > А
Внимание!
Команда CMA не модифицирует регистр признаков.
Команды STC, CMC
SТС; 1 > CY
CMC;
> CY
Команда STC устанавливает признак переноса CY. Команда CMC инвертирует признак переноса.
Команды сдвига RLC, RRC, RAL, RAR
Если надо произвести операции сдвига над данными, то их необходимо предварительно поместить в аккумулятор. Операндом однобайтных команд сдвига является содержимое аккумулятора, в котором формируется результат. Сдвиги выполняются влево (RLC, RAL) и вправо (RRC, RAR) только на один разряд. Выполнение команд сдвига поясняется на рисунке ниже.
Рис. Команды сдвига
4) Команды управления.
После выборки текущей команды из памяти в счетчике команд СК формируется адрес следующей по порядку команды. В разветвляющихся и циклических программах и при использовании подпрограмм нужно выполнить не следующую по порядку команду, а команду, находящуюся в другой ячейке программной памяти.
Для этого достаточно загрузить в СК адрес новой ячейки, называемой адресом перехода. Такая процедура называется передачей управления, а команды, которыми она реализуется, называются командами передачи управления .
Команды передачи управления бывают безусловными и условными.
По командам безусловной передачи управления выполняется переход по программе к адресу, который указывается в команде.
По команде условной передачи управления переход по программе осуществляется только при условии, что содержимое одного из признаков регистра признаков РП соответствует определенному условию. Если это условие не выполняется, то переход не осуществляется и программа выполняется в соответствии с командой, следующей за командой условной передачи управления.
Команды безусловной передачи
JMP addr ;адрес addr известен
Команды условной передачи управления.
По признаку нуля:
JZ addr; Переход, если Z=1
JNZ addr; Переход, если Z=0
По признаку переноса CY:
JС addr; Переход, если CY=1
JNС addr ; Переход, если CY=0
По признаку знака:
JМ addr; Переход, если S=1
JР addr; Переход, если S=0
По признаку паритета:
JРЕ addr; Переход, если Р=1
JРО addr; Переход, если Р=0
Особенной командой безусловной передачи управления без возврата оказывается команда PCHL; HL PC, в результате выполнения которой МП продолжает программу с адреса, загружаемого в счетчик команд РС из регистровой пары (H,L).
Команды вызова подпрограмм
Особая команда RST n (n=0..7) вызова предназначена для обработки прерывания и введения контрольных точек (разрывов) при отладке программ. Она называется рестартом (повторным запуском). В коде операции рестарта 11ААА111(2)
три разряда ААА формируется подсистемой прерываний (аппаратные прерывания) или указываются программистом (программные прерывания).
. Выполнение команды рестарта сводится к двум действиям:
- текущее содержимое счетчика команд РС загружается в стек;
- в счетчик РС подается код 00000000 00ААА000(2).
Следовательно, в зависимости от значения трех разрядов ААА МП переходит к одной из 8 ячеек: 000016, 000816, 001016 , 001816 , 002016 , 002816 , 003016 , 003816 .
CALL addr; команда вызывает подпрограмму, находящуюся по адресу addr. По этой команде выполняются действия, необходимые для возврата в основную программу:
1) в счетчике команд СК фиксируется адрес команды в основной программе, которая следует за командой вызова;
2) содержимое СК загружается в стек, а содержимое указателя стека уменьшается на 2;
3) в СК загружается адрес addr, задаваемый командой вызова. После этого начинается выполнение подпрограммы.
5) Команды возврата из подпрограммы.
Команда RET является последней командой подпрограммы. По этой команде выполняется возврат к основной программе, подготовленный командой возврата. По этой однобайтной команде, содержащей только код операции, происходит следующее:
1) счетчик команд получает из стека адрес той команды в основной программе, которая следует за командой вызова;
2) содержимое указателя стека соответственно модифицируется (т.е. увеличивается на два).
RET ;[SP] > PCмл, [SP+1] > PCст
;SP + 2 > SP
Команды условного возврата имеют модификации по следующим признакам.
Мнемокод
|
Условия возврата
|
RC
|
C=1 по признаку переноса С
|
RNC
|
C=0 по признаку переноса С
|
RZ
|
Z=1 по признаку нуля
|
RNZ
|
Z=0 по признаку нуля
|
RM
|
S=1 по признаку знака
|
RP
|
S=0 по признаку знака
|
RPE
|
P=1 по признаку паритета
|
RPO
|
P=0 по признаку паритета
|
6) Специальные команды
Каждый МП имеет ряд специальных команд. Эти команды не передают и не обрабатывают информацию, но они используются для управления работой микропроцессора.
Команда HLT
По команде HLT останавливается текущая программа до тех пор, пока не появится запрос прерывания или сигнала сброса.
Команды DI, EI
Если МП получает команду DI, то он игнорирует запросы прерывания до тех пор, пока не поступит команда EI.
Команда NOP
Пустая команда NOP не производит никаких действий, кроме инкремента счетчика команд РС для перехода к следующей команде. Команда NOP обычно используется в так называемых циклах задержек, в которых МП генерирует сигнал программируемой длительности.
1.2.3. Способы адресации
Причина организации различных способов адресации в желании, чтобы команда было покороче, чтобы удобно было использовать массивы и т.д.
Адресация бывает
- прямая, когда информация об операнде находится в коде команды
- косвенная, когда информация об операнде находится в в регистре.
Способы адресации делятся на
- однокомпонентные, когда адрес находится в одном месте
- многокомпонентные, когда адрес находится в нескольких местах.
Информация о способе адресации содержится в коде команды.
Рассмотрим однокомпонентные
способы адресации.
1) Регистровая. В качестве операнда используется содержимое адресуемого регистра. Это самый простой и наиболее быстрый способ адресации, не требующий обращения к памяти.
2) Абсолютная.
3)Непосредственная. При непосредственной адресации операнд следует сразу же за кодом операции.
4) Регистровая косвенная. Содержимое адресуемого регистра используется как адрес операнда.
5) Автоинкрементная. Содержимое адресуемого регистра является адресом операнда. После получения адреса содержимое регистра автоматически увеличивается на 1 при байтовых операциях и на 2 при операциях со словами. Этот способ адресации удобен при обработке таблиц (последовательно расположенных в памяти данных).
6) Автодекрементная.
Содержимое регистра задает указатель адреса операнда, затем содержимое регистра увеличивается на 1 (2).
Многокомпонентная адресация.
1) Страничная.
Вся память разбивается на определенное количество равных по размеру страниц. Например, память объемом 64Кбайт разбивается на 256 страниц. Объем одной страницы 256 байт. Шестнацатиразрядный адрес поделен на два элемента: номер страницы (для примера 8 разрядов), адрес на странице (для примера 8 разрядов) задает местоположение ячейки на странице
2) С индексированием.
3) По базе.
4) По базе с индексированием.
5) Относительная. Мы адресуемся относительно СчК.
1.2.4. Программирование на языке ассемблера
В этом разделе приводится краткие сведения о языке ассемблера из книги Григорьева В.Л. Программное обеспечение микропроцессорных систем. – М.: Энергоатомиздат, 1983.
Язык ассемблера – это машинно-ориентированный язык (т.е. ориентированный на конкретную ЭВМ и в частности на конкретную МП-систему). Он должен соответствовать специфическим особенностям МП. Следовательно, программу необходимо писать на языке ассемблера для того типа МП, для которого она предназначена. При преобразовании исходной программы (на языке ассемблера) в объектную программу используемая программа трансляции также должна соответствовать этому типу МП. Однако это не означает, что трансляция должна выполняться на таком же МП. Трансляция может быть выполнена даже на большой ЭВМ, имеющей в составе программного обеспечения соответствующую ассемблирующую программу (кросс-ассемблер).
В этом случае кросс- ассемблер составлен на языке большой ЭВМ, но он оперирует с исходной программой, написанной на языке ассемблера данной МП-системы. Объектная программа также выдается на машинном языке МП-системы. Ниже рассматривается язык ассемблера МПК580ВМ80.
Структура команд языка ассемблера.
Ранее уже кратко излагалась структура команд языка ассемблера. Напомним ее. Команда, написанная на языке ассемблера, может быть разделена на следующие четыре части (поля).
МЕТКА ОПЕРАЦИЯ ОПЕРАНД(Ы) КОММЕНТАРИЙ
(код операции)
Метка
представляет собой символическое имя (символический адрес) такой ячейки памяти, которую для каких-то целей (например, для последующей адресации к ней) необходимо пометить. Метка всегда начинается с латинской буквы и может содержать не более шести алфавитно-цифровых символов. Она отделяется от следующего поля кода операции двоеточием.
Если ввод программы осуществляется с использованием ассемблера, то действительные адреса ячеек памяти определять не нужно. Ассемблер автоматически вычисляет адреса и ставит им в соответствие последовательность команд. Однако необходимо указывать ассемблеру адрес первого байта команды программы. Поскольку адрес не определяется самостоятельно, то можно записывать в командах символические адреса. Например, команда передачи управления JMP всегда содержит адрес перехода. Этот адрес надо явно указать. Это и обеспечивается присвоением адресу перехода собственного символического имени или метки. В командах передачи управления метка ставится после мнемокода операции перехода. Ассемблер в процессе трансляции заменяет метку соответствующим адресом.
Пример
МЕТКА КОД ОПЕРАЦИИ ОПЕРАНД КОММЕНТАРИЙ
CIKL: MOV A, B ;B > A
ADD C ;A + C > A
… …
JMP CIKL
Метка CIKL связана с командой MOV A,B. Ассемблер следит за адресацией при трансляции программы. При трансляции команды JMP CIKL ассемблер поставит действительное значение адреса вместо символического адреса CIKL в команду перехода.
Операция. В поле операции для записи кода операции применяется буквенный (символический) код, который обычно является аббревиатурой полного назначения операции.
Примеры
ADD - сложить, SUB - вычесть, JMP - перейти.
Некоторые символические коды операций явно определяют функцию команды (PCHL – передача содержимого пары регистров HL в счетчик команд РС). Обычно длина поля кода операции не превышает четырех позиций, а между ним и соседом справа необходим минимум один пробел. Буквенные обозначения (мнемоники) кодов операций являются ключевыми словами ассемблера. Если содержимое поля кода операций не входит во множество допустимых обозначений, ассемблер выдает сообщение о недействительной команде.
Операнд. В поле операнда (наиболее сложном поле) определяются данные, являющиеся операндом (или операндами) команды. Содержимое поля операнда интерпретируется в соответствии с функцией команды. Некоторые команды, оперирующие с определенными внутренними регистрами, имеют пустое поле операнда.
Примеры
МЕТКА КОД ОПЕРАЦИИ ОПЕРАНД КОММЕНТАРИЙ
CMA ;Инвертирование аккумулятора
RAL ;Сдвиг влево через перенос
XTHL ;Обмен (H,L) и верхушки стека
NOP ;Пустая команда
В качестве операндов могут фигурировать:
- адреса памяти;
- внутренние регистры МП;
- адреса портов ввода и вывода;
- числовые и символьные константы.
Рассмотрим способы определения перечисленных типов операндов.
Шестнадцатеричные данные. Содержащиеся в поле операнда 16-ричное число должно начинаться с цифр 0 - 9 и завершаться буквой H (Heх). Число, начинающееся с букв A – F, дополняется слева незначащим нулем.
Примеры
STORE: STA 8000H ; Запоминание в ячейке 800016
MVI C, 0AAH ; Загрузка в регистр С кода 10101010 (А А)
ANI 10H ; Выделение четвертого бита
COMP: CPI 290H ; Недопустимый операнд
Десятичные данные. Десятичное число в поле операнда заканчивается необязательной буквой D.
MOV B,15 ; Загрузка в регистр В кода 00001111
ANI 64 ; Выделение 6-го бита
IN 32 ; Ввод из порта с адресом 00100000
Восьмеричные данные. Восьмеричное число в поле операнда заканчивается буквами О или Q (чаще).
ORI 200Q ; Установка старшего бита
Двоичные данные. Двоичное число в поле операнда заканчивается буквой В.
OUT 1111B ; Вывод в порт с адресом 15
XRI 10000000B; Инверсия знакового бита
ANI 11011111B; Сброс пятого бита
Символьные константы. В поле операнда допускается использовать символы алфавита, заключая их в апострофы. Ассемблер представляет вместо такого операнда соответствующий двоичный код символа
MVI D, ‘T’ ; Загрузка кода буквы Т в регистр D
Идентификаторы внутренних регистров. В язык ассемблера МП К580 встроены идентификаторы внутренних регистров B, C, D, E, H, L, M, A с соответствующими двоичными значениями от 000 до 111.
MOV A, E ; Передача из регистра Е в аккумулятор
ADD L ; Прибавление содержимого регистра L
SUB M ; Вычитание содержимого ячейки, адресуемой
; регистрами (H, L)
Вместо идентификаторов внутренних регистров допускается применять их адреса в любой системе счисления.
MOV A, B ; Переслать из регистра В в регистр А
MOV 7, 0 ; Переслать из регистра В в регистр А
В командах, оперирующих 16-битными значениями, применяются идентификаторы внутренних 16-битных регистров.
LXI H, 0FF00H; Инициализация регистров (H,L)
INX SP ; Инкремент указателя стека
PUSH PSW ;Загрузка в стек содержимого А- и РП- регистров
В командах передачи управления можно указать метки, введенные программистом в поле метки других команд. Метки в поле операнда заменяют абсолютные значения адресов перехода.
JMP DONE ; Переход к метке DONE
CALL SWAP ; Вызов подпрограммы SWAP
Текущее содержимое программного счетчика. В командах передачи управления допускается относительная адресация. Адрес перехода определяется суммой (разностью) текущего содержимого программного счетчика (символом ¤) и указываемого в операторе смещения. Смещение может быть представлено в любой из ранее рассмотренных форм определения числовых значений.
GOTO: JMP ¤ + 20H ; Переход по адресу GOTO + 20Н
MORE: JNZ ¤ - 80 ; Адрес перехода MORE-80 («назад»)
Выражения. В поле операнда могут помещаться выражения. Они содержат в качестве аргументов все рассмотренные выше типы данных, которые связываются арифметическими и логическими операторами.
MVI B, 30 + 40H/2; Загрузка числа 62
SUI 34, MOD3 ; Декремент аккумулятора
Выражения в операнде применяются редко.
Комментарии. Программист может использовать это поле для пояснения команды или фрагмента программы. Ассемблер игнорирует поле комментария в процессе трансляции. Поле комментария начинается с некоторого разделителя (точка с запятой).
Директивы ассемблера
Директивы (псевдокоды) ассемблера являются указаниями ассемблеру в выполнении определенных действий в процессе ассемблирования, размещают в памяти информацию, присваивают численные значения символическим наименованиям, резервируют память и т.д.
Директивы подчиняются стандартному формату операторов ассемблера, но содержимое их полей имеет некоторые особенности. Например, в поле метки директив EQU и SET должно находиться символическое наименование, которое не имеет заключительного двоеточия. В остальных директивах в поле метки может находиться необязательная метка, аналогичная меткам машинных команд. Операнды директив необязательны.
Директива ORG (начало) имеет формат
[МЕТКА:] ORG < выражение >
[ ] – обозначает необязательный элемент.
Значением выражения директивы ORG является 16-битный адрес, определяющий ячейку памяти, в которую будет загружаться первый бит следующей команды. До новой директивы ORG команды и данные размещаются в смежных ячейках памяти. Если в самом начале программы директива ORG отсутствует, то по умолчанию подразумевается наличие директивы ORG с нулевым операндом. При необходимости в программе может быть несколько директив ORG.
ORG 100H ; Задается абсолютный адрес 0100Н
NEW: ORG 200H ; Задается абсолютный адрес 0200Н
Директива ORG может выполнить функцию резервирования памяти.
MOV A,M
RAL
JMP LOWER
ORG ¤ +20
LOWER: ORA A
Директива END
[МЕТКА:] END
Эта директива информирует ассемблер о достижении физического конца входной программы.
Директива EQU (принять, присвоить - директива прямого присвоения)
МЕТКА КОД ОПЕРАНД
< имя > EQU < выражение >
При выполнении директивы EQU ассемблер присваивает значение выражения символическому наименованию, находящемуся в поле метки. Когда наименование встречается в поле операнда, ассемблер подставляет вместо него присвоенное значение.
MASK EQU 0FH ; Значение MASK равно 15
… …
ANI MASK
… …
MVI MASK
В командах ANI, MVI вместо MASK будет фигурировать код 00001111. При программировании рекомендуется сгруппировать все директивы EQU в начале или в конце программы.
Директива SET (установить)
Имеет такой же формат, что и директива EQU. В отличие от директивы EQU, значение символического наименования допускается изменять с помощью новой директивы SET.
NAME SET 15 ; Значение NAME равно 15
…
MVI B, NAME
NAME SET 1FH ; Значение NAME равно 31
…
ADI NAME ; Прибавление 31
…
CPI NAME ; Сравнение с 31
Директивы IF ENDIF
Директивы условного ассемблирования IF (если) и ENDIF (конец если) применяются следующим образом:
МЕТКА КОД ОПЕРАНД КОММЕНТАРИЙ
[МЕТКА:] IF < выражение >
…
ОПЕРАТОРЫ
…
[МЕТКА:] ENDIF
В процессе ассемблирования вычисляется значение выражения из поля операнда директивы IF. Если оно равно нулю, операторы между директивами IF и ENDIF игнорируются
и не включаются в объектную программу. Если значение выражения отлично от нуля, операторы программы ассемблируются, как будто директив IF и ENDIF нет.
Директива DB (определить байт)
Директива относится к группе директив определения, которые применяются для инициализации данных и резервирования памяти. Формат директивы DB
[МЕТКА:] DB < список >
Операнд директивы DB может быть последовательностью выражений, разделенных запятыми и имеющих 8-битные значения, либо цепочкой символов, заключенных в апострофы. При выполнении директивы DB значения выражений или коды символов запоминаются в смежных ячейках (байтах) памяти, начинающихся после предыдущей команды.
ARRAY: DB 3,7,15,31 ; Запоминаются четыре значения
DB ‘HELLO’ ; Запоминаются пять символов
COMP: DB -63 ; Дополнительный код -63
Директива DW (определить слово – 2 байта)
Директива аналогична директиве DB, только здесь списком является последовательность выражений, имеющих 16-битные значения. Запоминается сначала младший байт по текущему адресу, а старший байт запоминается по адресу на 1 больше предыдущего.
ADDR: DW 0FF00H ; (ADDR)=00H (ADDR+1)=FFH
Директива DS (определить память)
[МЕТКА:] DS < выражение >
Вычисленное значение выражения из поля операнда определяет число ячеек (байт) памяти, резервируемых для запоминания данных.
Никакие значения в этих ячейках не запоминаются. Адрес следующего оператора равен сумме адреса оператора, находящегося перед директивой DS и значения выражения директивы DS.
ARRAY: DS 32 ; Резервируется 32 ячейки
Для улучшения внешнего вида и удобства документирования листинга в ассемблерах могут применяться директивы:
SPS – (пропуск строки), которая означает, что при печати листинга необходимо пропустить одну строку;
PAGE – (страница), которая при печати вызывает переход на следующую страницу;
TITLE – (заголовок), которая вызывает переход на следующую страницу и печать сверху страницы заголовка программы, введенного программистом.
Иногда возникает необходимость использовать определенную последовательность команд во многих частях программы. Для таких ситуаций макроассемблер позволяет программисту указывать в исходной программе вместо повторяющейся последовательности команд только макрокоманду (макрос), которая эквивалентна выделенной последовательности команд. Макрокоманда задается программистом в виде макроопределении, например, в начале программы.
Пример макроопределения.
SPDE MACRO
XCHG ; (HL) ßà (DE)
SPHL ; (HL) ßà (SP)
XCHG ; (HL) ßà (DE)
SPDE ENDM
Во время трансляции макроассемблер заменяет в исходной программе строку SPDE (макровызов) заранее определенной в макроопределении последовательностью из трех строк (т.е. макрорасширением).
Макрокоманды могут быть с параметрами.
ЕХТ MACRO VAR
MVI A,VAR ; VAR>A
MOV M,A
XRA A
INX H
MOV M,A
ЕХТ ENDM
Процедура и макрокоманды - это две альтернативы. Для экономии памяти лучше использовать процедуры, а для повышения быстродействия - макрокоманды.
1.2.5. Структурная схема и система команд микропроцессора I8086
Упрощенная структура МП представлена на рисунке ниже.
Регистры общего назначения.
Помимо ячеек оперативной памяти для хранения данных (кратковременного) можно использовать и регистры, входящие в состав процессора и доступные из машинной программы. Доступ к регистрам осуществляется значительно быстрее, чем к ячейкам памяти, поэтому использование регистров заметно уменьшает время выполнения программ. Все регистры имеют размер слова (16 битов), за каждым из них закреплено определенное имя (AX, SP и т.п.). По назначению и способу использования регистры можно разбить на следующие группы:
- регистры общего назначения (AX, BX, CX, DX, BP, SI, DI, SP);
- сегментные регистры (CS, DS, SS, ES);
- счетчик команд (IP);
- регистр флагов (Flags).
Расшифровка этих названий следующая
A - accumulator, аккумулятор;
B - base, база;
C - counter, счетчик;
D - data, данные;
BP - base pointer, указатель базы;
SI - source index, индекс источника;
DI - destination index, индекс приемника;
SP - stack pointer, указатель стека;
CS - code segment, сегмент команд;
DS - data segment, сегмент данных;
SS -stack segment, сегмент стека;
ES - extra segment, дополнительный сегмент;
IP - instruction pointer, счетчик команд.
Регистры общего назначения можно использовать во всех арифметических и логических командах. В то же время каждый их них имеет определенную специализацию (некоторые команды "работают" только с определенными регистрами). Например, команды умножения и деления требуют, чтобы один из операндов находился в регистре AX или в регистрах AX и DX (в зависимости от размера операнда), а команды управления циклом используют регистр CX в качестве счетчика цикла. Регистры BX и BP очень часто используются как базовые регистры, а SI и DI - как индексные. Регистр SP обычно указывает на вершину стека, аппаратно поддерживаемого в ПК.
Регистры AX, BX, CX и DX конструктивно устроены так, что возможен независимый доступ к их старшей и младшей половинам; Каждый из этих регистров состоит из двух восьмиразрядных регистров, обозначаемых AH, AL, BH и т.д. (H - high, старший; L - low, младший):
Таким образом, с каждым из этих регистров можно работать как с единым целым, а можно работать и с его "половинками". Например, можно записать слово в AX, а затем считать только часть слова из регистра AH или заменить только часть в регистре AL и т.д. Такое устройство регистров позволяет использовать их для работы и с числами, и с символами.
Сегментные регистры CS, DS, SS и ES не могут быть операндами никаких команд, кроме команд пересылки и стековых команд. Эти регистры используются только для сегментирования адресов.
Счетчик команд IP всегда содержит адрес (смещение от начала программы) той команды, которая должна быть выполнена следующей (начало программы хранится в регистре CS). Содержимое регистра IP можно изменить только командами перехода.
В этом МП этапы выполнения команд (извлечение кода и операндов команды, выполнение команды) реализуется в двух различных блоках:
- блоке выполнения команд EU ( выполнение команды)
- блоке сопряжения с магистралями BIU (извлечение кода и операндов, запись результата в память).
Блоки могут работать независимо друг от друга, поэтому процессы преобразования и передачи информации могут идти в них параллельно. Благодаря этому за одно и тоже время количество выполненных команд возрастает по сравнению с процессором I8080.
Блок выполнения команд EU. Блок не имеет связи с внешними магистралями МП. На АЛУ поступают коды команд из BIU. Если в результате дешифрации кода команд в АЛУ необходимо получение операндов по внешним магистралям МП, то блок EU запрашивает блок BIU на получение и размещение необходимых данных в BIU.
Блок сопряжения с магистралями BIU. Производит пересылки данных и кодов для блока EU. В то время как блок EU занят выполнением команды, блок BIU получает следующие в программе коды команд из памяти и сохраняет их в конвейере команд. Он выдает в EU извлеченные ранее из памяти коды команд по мере необходимости без загрузки внешних магистралей МП.
Блок BIU организует получение нового кода команды , как только 2 байта в конвейере команд будут использованы.
Особенности адресации.
В этом процессоре реализовано адресное пространство размером в 1 МБ, поэтому физический адрес представляется 20-разрядным числом. Любая ячейка памяти имеет два типа адресов
- физический
- логический
Весь обмен информацией между МП и памятью осуществляется с помощью физических адресов. В программе реализованы логические адреса. Логический адрес состоит из двух частей:
CS:
|
IP
|
база, в которой находится адрес сегмента (базы)
|
смещение относительно базы
|
16-тиразрядный
|
16-тиразрядный
|
20-тиразрядный
|
|
|
|
20-тиразрядный адрес осуществляется схемотехнически.
|
К 16-ти разрядам CS добавляются 4 младших нулевых разряда.
|
А в счетчик инструкций эти разряды добавляются слева. И мы получаем 20-тиразрядный физический адрес.
|
Аналогично DS:BX, DS:SI, ES:DI, SS:SP.
Машинные программы обычно строятся так. Все команды программы размещаются в одном сегменте памяти, начало которого заносится в регистр CS. Все данные размещаются в другом сегменте, начало которого заносится в регистр DS; если нужен стек, то под него отводится третий сегмент памяти, начало которого записывается в регистр SS. После этого практически во всех командах можно указывать не полные адресные пары, а лишь смещения, так как значения сегментных регистров в этих парах будут восстанавливаться автоматически. Ссылки на сегмент команд могут быть только в командах перехода, а ссылки практически во всех других командах (кроме строковых и стековых) - это ссылки на сегмент данных. Например, в команде пересылки
MOV AX,X
имя X воспринимается как ссылка на данное, а потому автоматически восстанавливается до адресной пары DS:X. В команде же безусловного перехода по адресу, находящемуся в регистре BX,
JMP BX
абсолютный адрес перехода определяется парой CS:[BX].
Итак, если в ссылке на какую- то ячейку памяти не указан явно сегментный регистр, то этот регистр берется по умолчанию. Явно же сегментные регистры надо указывать, только если по каким-то причинам регистр по умолчанию не подходит. Если, например, в команде пересылки надо сослаться на стек (скажем, надо записать в регистр AH байт стека, помеченный именем X), тогда мы обязаны явно указать иной регистр - в нашем случае регистр SS, т.к. именно он указывает на стек:
MOV AH,SS:X
Перечень сигналов МП.
Перечень сигналов процессора I8086 (К1810ВМ86) приведен на рисунке ниже
Шина адреса (20-тиразрядная), поэтому она делиться на две части.16 младших адресов совмещают адресные цепи и цепи данных. Это значит что в какие-то моменты по этим линиям выставляются адреса, а какие-то - данные, т.е. сигналы разделены во времени. Это сделано для экономии выводов. Когда идет адрес, то он сопровождается сигналом о том, что идет адрес. Этот сигнал называется стробом адреса. По этому стробу адрес защелкивается в регистр адреса.
Есть два восьмиразрядных шинных формирователя, которые формируют 16-тиразрядную ШД. Существует специальный сигнал (OP/#IP), задающий направление обмена данными через шинный формирователь: от МП (высокий уровень сигнала) или к нему (низкий уровень).
Сигнал #DEN (Data Enable - разрешение данных) разрешает передаче данных через шинный формирователь. МП может сам выдать сигнал.
Формирование ШУ.
- Сигнал М/#IO, говорящий о работе либо с памятью (высокий уровень), либо с устройством ввода-вывода (низкий уровень);
- сигналы записи (#W) (и чтения (#R)) данных в память или устройство ввода-вывода;
- сигнал запроса прерывания INT;
- сигнал подтверждения прерывания - INTA
- сигнал немаскируемого запроса прерываний NMI. При подаче сигнала на этот вход всегда разрешаются прерывания;
- сигнал разрешения старшего байта `#BНE. Позволяет организовать различные типы адресации: пословная (указание на слово) и побайтная ( указание на четный или нечетный байт );
- ТИ тактовые импульсы, с помощью которых можно управлять работой МП;
- сигнал, задающий режим работы МП - MN /#MX. Если задается высокий уровень (MN), то в системе имеется лишь один МП. Если задается низкий уровень (#MX), то в системе может быть несколько МП;
- сигнал сброса - CLR. Устанавливает МП в начальное состояние - во всех регистрах нули, кроме CS. Туда заносится число 0FFFFh. Это связано с тем, что программа загрузки МП начинается со старших адресов;
- сигнал готовности RDY. Без этого сигнала процессор приостанавливает свою работу;
- запрос прямого доступа к памяти HLD. C помощью этого сигнала можно организовать прямой доступ к памяти, аналогичный реализованному в процессоре I8080$
- проверка ( ТEST ). Существует специальная команда WAIT и если она встречается в программе, то МП переходит в состояние ожидания внешнего активного сигнала TEST.
Содержимое регистра признаков.
В ПК имеется особый регистр флагов ( или признаков ). Флаг - это бит, принимающий значение 1 ("флаг установлен"), если выполнено некоторое условие, и значение 0 ("флаг сброшен") в противном случае. В ПК используется 9 флагов, каждому из них присвоено определенное имя (ZF, CF и т.д.). Все они собраны в регистре флагов FLAGS.
Некоторые флаги принято называть флагами условий; они автоматически меняются при выполнении команд и фиксируют те или иные свойства их результата (например, равен ли он нулю). Другие флаги называются флагами состояний; они меняются из программы и оказывают влияние на дальнейшее поведение процессора (например, блокируют прерывания).
Флаги условий.
CF (carry flag) - флаг переноса. Принимает значение 1, если при сложении целых чисел без знака появилась единица переноса, не "влезающая" в разрядную сетку, или если при вычитании чисел без знака первое из них было меньше второго. В командах сдвига в CF заносится бит, вышедший за разрядную сетку.
OF
(overflow flag) - флаг переполнения. Устанавливается в 1, если при сложении или вычитании целых чисел со знаком получился результат, выходящий за пределы заданного диапазона .
ZF
(zero flag) - флаг нуля. Устанавливается в 1, если результат команды оказался равным 0.
SF (sign flag) - флаг знака. Устанавливается в 1, если в операции над знаковыми числами получился отрицательный результат.
PF (parity flag) - флаг четности. Равен 1, если результат очередной команды содержит четное количество двоичных единиц. Учитывается обычно только при операциях ввода-вывода.
AF
(auxiliary carry flag) - флаг дополнительного переноса. Фиксирует особенности выполнения операций над двоично-десятичными числами.
Флаги состояний.
DF
(direction flag) - флаг направления. Устанавливает направление изменения адреса данных в строковых командах: автоматическое увеличение (при DF=0) или уменьшение на 1 (2) адреса элемента массива (см. рис. ниже).
IF (interrupt flag) - флаг прерываний. При IF=0 процессор перестает реагировать на поступающие к нему прерывания по входу INT, при IF=1 блокировка прерываний снимается.
TF (trap flag) - флаг трассировки. При TF=1 после выполнения каждой команды процессор делает прерывание (с номером 1), чем можно воспользоваться при отладке программы для ее трассировки (пошаговый режим).
Временные диаграммы работы МП.
Адресация к памяти.
Память формируется в виде 2-х блоков: четных и нечетных байтов, причем один блок открывается сигналом #ВНЕ, а второй `А0. `А0 различает четный / нечетный или младший / старший байт.
ВНЕ- пассивен - старший байт не разрешен.
ВНЕ-активен - старший байт разрешен.
Пример. Поступают следующие сигналы:
`ВНЕ - пассивный
А0 - активный
Открывается блок четных адресов. Выбран младший(четный) байт
|
`ВНЕ - активный
`А0
- пассивный Открывается блок нечетных адресов. Выбран старший (нечетный) байт
|
`ВНЕ - активный
А0
-активный
Оба блока открыты. Выбрано слово.
|
Формат команды МП 8086.
Как уже говорилось выше, конвейер команд этого МП рассчитан на 6 байт, что связано с длиной команды (см. рис. ниже).
Таблица. Mode
Mode
|
Режим работы
|
Смещение
|
00
|
работа с памятью (операнд находится в памяти)
|
нулевое
|
01
|
8-миразрядное
|
10
|
16-тиразрядное
|
11
|
работа с регистром reg / mem
|
|
Таблица.Reg.
Reg
|
W=0 (байт)
|
W=1(слово)
|
Reg
|
W=0 (байт )
|
W=1 (слово)
|
000
|
AL
|
AX
|
100
|
AH
|
SP
|
001
|
CL
|
CX
|
101
|
CH
|
BP
|
010
|
DL
|
DX
|
110
|
DH
|
SI
|
011
|
BL
|
BX
|
111
|
BH
|
DI
|
Таблица Reg / mem.
Reg / mem
|
Исполнительный адрес (смещение относительно базы сегмента)
|
mode = 00
|
mode = 01
|
mode = 10
|
000
|
[BX+SI]
|
[BX+SI+data8]
|
[BX+SI+data16]
|
001
|
[BX+DI]
|
[BX+DI+data8]
|
[BX+DI+data16]
|
010
|
[BP+SI]
|
[BP+SI+ data8]
|
[BP+SI+ data16]
|
011
|
[BP+DI]
|
[BP+DI+ data8]
|
[BP+DI+ data16]
|
100
|
[SI]
|
[SI+ data8]
|
[SI+ data16]
|
101
|
[DI]
|
[DI+ data8]
|
[DI+ data16]
|
110
|
Непосредственная адресация
|
[BP+data8 ]
|
[BP+data16]
|
111
|
[BX]
|
[BX+data8 ]
|
[BX+data16]
|
Организация прерываний
В МП 8086 каждому прерыванию поставлен в соответствие код (от 0 до 255), который идентифицирует тип прерывания.
Прерывания могут вызываться:
- внешними устройствами (внешние прерывания);
- командами программных прерываний;
- автоматически самим МП (внутренние прерывания).
Возможные источники показаны на рисунке ниже
Рис. Источники прерываний
Внешние прерывания
Запросы на внешние прерывания поступают в МП по двум входам INTR (маскируемые) и NMI (немаскируемые).
Запросы на маскируемые прерывания от внешних устройств обычно поступают на входы программируемого контроллера прерываний, который формирует сигнал, подаваемый на вход INTR микропроцессора. В ответ на этот сигнал МП (если разрешены внешние прерывания, т.е. если флаг IF=1) выдает последовательно два сигнала INTA1 и INTA2, по которым контроллер прерываний выдает команду INT n.
Запросы на немаскируемое прерывание поступают по входу NMI и обычно используются для прерывания работы МП при «катастрофических» событиях, требующих немедленной реакции (например, аварийное отключение питания, обнаружение ошибки памяти и т.д.). Немаскированному прерыванию присваивается фиксированный код типа 2, который формируется автоматически внутри МП.
Внутренние прерывания
Характеризуются типом прерывания, который либо предопределен, либо содержится в коде команды. Внутренние прерывания не могут быть запрещены (кроме пошагового прерывания).
Прерывание по ошибке деления (тип 0) генерируется микропроцессором после выполнения команд деления DIV и IDIV в случае деления на нуль.
Прерывание по переполнению (тип 4) генерируется по однобайтовой команде INTO, если установлен флаг OF.
Пошаговое прерывание (тип 1) вырабатывается автоматически при TF=1 после выполнения каждой команды.
Процедура обслуживания прерываний
Связь между кодом, определяющим тип прерывания, и подпрограммой (процедурой) обслуживания прерывания устанавливается с помощью таблицы указателей векторов прерываний.
Рис. Таблица указателей векторов прерываний
Полная таблица занимает 1Кбайт памяти и содержит 256 элементов, расположенных по адресам 0 – 3FFH. Каждый элемент n в таблице содержит два слова, определяющие начальный логический адрес подпрограммы: слово с большим адресом содержит базовый адрес сегмента, слово с меньшим адресом – смещение от базы сегмента. При переходе на подпрограмму смещение загружается в регистр IP, а адрес сегмента – в регистр CS.
Так как размер каждого элемента таблицы векторов прерываний составляет 4 байта, то МП вычисляет адрес (смещение) требуемого элемента путем умножения типа прерывания n на 4.
После установления нового содержимого регистров IP и CS МП выбирает код операции первой команды подпрограммы и затем выполняет обычные действия по заполнению очереди команд, выполнению команд и обмену данными.
Когда осуществляется переход на подпрограмму обслуживания прерывания, содержимое регистров флагов FLAGS вместе с содержимым регистров IP и CS запоминается в стеке. Флаг IF (и TF) сбрасывается, т.е. автоматически запрещаются внешние прерывания по входу INT. Затем подпрограмма может разрешить внешние прерывания командой STI (установит IF в 1). Кроме того, подпрограмма может быть прервана запросом на входе NMI (немаскируемые прерывания) и внутренними прерываниями.
В конце подпрограммы восстанавливают содержимое регистров МП, которые были включены в стек в начале подпрограммы с целью сохранения данных, относящихся к прерванной программе.
Подпрограмма обработки прерываний должна заканчиваться командой возврата из прерывания IRET. Перед выполнением команды IRET стек должен быть в том состоянии, в котором он был сразу после вызова подпрограммы. Тогда эта команда извлекает три верхних слова из стека в регистры IP, CS и FLAGS, что обеспечивает возврат к команде, которая бы выполнялась бы в случае отсутствия прерывания.
Система команд МП 8086
Команды МП 8086 можно сгруппировать так:
1) Пересылок;
2) Арифметические;
3) Логические и сдвига;
4) Строковые;
5) Передачи управления;
6) Специальные.
1 Команды пересылок
Возможна пересылка между:
1) Регистр — регистр
2) Регистр — память
3) Память — регистр
4) Data — память
5) Data — регистр
Основные команды пересылок
MOV пр, ист; где
пр - приемник,
ист - источник
Пример:
MOV AX, BX ; BX>AX
MOV [BX] ; mem[ВX]>AX
Замечание
Есть исключения при пересылке. Нельзя данные непосредственно загрузить в сегментный регистр.
Пересылки при работе со стеком
1) PUSH ист ; ист > стек
2) PUSH sreg ; sreg > стек
3) PUSHF ; FLAGS > стек
1) POP пр ; стек > пр
2) POP sreg ; стек > sreg
3) POPF ; стек > FLAGS
Специфические команды пересылок
1) Команда взаимообмена данными
XGHG пр, reg ; пр - reg
2) Команды пересылки между регистром АН и регистром признаков
LAHF ; FLAGS> AH
SAHF AH > FLAGS
3) Команды загрузки адресов
LEA reg, ист ; командный адрес операнда ист > reg
LDS reg, ист ; загрузка адреса из ист > (DS: reg)
LES reg, ист ; загрузка адреса из ист > (ES: reg)
4) Пересылка байта (из таблицы) в AL
XLAT ; mem[ВX+ AL]> AL
5) Команды ввода-вывода
1) Байтовый адрес порта (0…255)
IN A, port ; port > A,
OUT port, A ; A > port,
где A=AL – для байта, A=AХ – для слова
2) Двухбайтовый адрес порта (0…64К)
Адрес порта необходимо предварительно записать в регистр DX
IN A, DX ; [DX] > A
OUT DX, A ; A > [DX]
Примеры
1) MOV AX, table ; Пересылка из ячейки памяти table в регистр AX
MOV table, AX ; Пересылка из регистра AX в ячейку памяти table
MOV ES:[BX], AX ; Пересылка из AX в ячейку памяти ES:[BX]
MOV DS, AX ; Пересылка из AX в DS
MOV BL, AL ; Пересылка из AL в BL
MOV CL, -30 ; Пересылка константы -30 > CL
MOV dest, 25h ; Пересылка константы 25h > ячейку памяти dest
2) PUSH SI ; Сохранение в стеке содержимого регистра SI
PUSH DS ; Сохранение в стеке содержимого регистра DS
PUSH CS ; Сохранение в стеке содержимого регистра CS
PUSH counter ; Сохранение в стеке содержимого ячейки памяти
PUSH table[BX][DI] ; Сохранение в стеке содержимого ячейки памяти
PUSH AX ;
PUSH ES ;
PUSH DI ;
PUSH SI ;
…
…
…
POP SI ;
POP DI ;
POP CS ;
POP AX ;
PUSH ES ; Копирование в DS
POP DS ;
3) XGHG AX, BX ; AX - BX
XGHG AL, BH ; AL - BH
XGHG word_loc, DX ; ячейка word_loc -DX
XGHG DL, byte_loc ; AL - ячейка byte_loc
4) XLAT – извлечение элемента таблицы. Начальный адрес таблицы нужно загрузить в BX, а номер элемента таблицы в AL.
MOV AL,10 ; номер элемента таблицы в AL
MOV BX, offset s_tab;
XLAT s_tab ; извлечь значение байта из таблицы AL
2 Арифметические команды
1) Сложение
ADD пр, ист ; пр + ист>пр
ADD пр, data ; пр + data > пр
ADC пр, ист ; пр + ист+CF>пр
ADC пр, data ; пр + data+CF > пр
2) Вычитание
SUB пр, ист ; пр - ист>пр
SUB пр, data ; пр - data > пр
SBB пр, ист ; пр – ист-CF>пр
SBB пр, data ; пр – data-CF > пр
3) Умножение
а) без знака
MUL ист ; AL * ист > AX – байт, AX * ист > DX:AX – слово
б) со знаком
IMUL ист
4) Деление
а) без знака
DIV ист
б) со знаком
IDIV ист .
AX / ист > AL – (остаток в AH), DX / ист > AX (остаток в DX)
5) Сравнение
CMP пр, ист ; пр-ист формируется регистр флагов
CMP пр, data ; пр - data формируется регистр флагов
6) Команды инкремента и декремента
INC пр ; пр +1 > пр
DEC пр ; пр - 1 > пр
NEG пр ; - пр > пр
Примеры
!) Сложение ADD
ADD AX + BX ; Сложение младшего слова AX + BX > AX
ADС BX + DX ; Сложение старшего слова BX + DX +CF> BX
ADD AX + mem_word ; Добавить значение ячейки к регистру
ADD AL,10 ; Добавить константу к регистру
ADD mem_byte, ofh ; Добавить константу к содержимому ячейки памяти
INC CX ;
INC AL ;
INC mem_byte ; Приращение значения байта
INC mem_word[BX] ; Приращение значения слова памяти
2) Вычитание
SUB AX, BX ; Вычесть младшие слова
SBB BX, DX ; Вычесть старшие слова
SUB mem_word[BX], AX
SUB AL,10
SUB mem_byte, ofh
3) Умножение
MUL BX
MUL mem_byte
IMUL AL
IMUL mem_word
4) Команды инкремента
DEC CX
DEC AL
DEC mem_byte
NEG AL
3Логические команды и команды сдвига
а) логические команды
AND пр, ист ; пр & ист>пр
OR пр, ист ; пр ист>пр
XOR пр, ист ; прист>пр
TEST пр, ист ; пр &ист и формирование флага признаков
б) сдвига
1) Циклический
ROR пр, cnt ; Сдвиг вправо на cnt разрядов cnt=1,
; Сдвиг вправо на cnt разрядов cnt=CL
RCR пр, cnt
ROL пр, cnt ; Сдвиг влево на cnt разрядов cnt=1
; Сдвиг влево на cnt разрядов cnt=CL
RCR пр, cnt
2) Логический
SHR пр, cnt
SHL пр, cnt
3) Арифметический
SAR пр, cnt
SAL пр, cnt
Замечание
Коды команд логического и арифметического сдвига влево совпадают. SHL/SAL
4 Строковые команды
1) Команды перемещения
MOVSB (MOVSW) ; mem[DS:SI] >mem[ES:DI
если DF=0, то инкремент SI и DI
если DF=1, то декремент SI и DI
LODSB (LODSW) ; mem[DS:SI] > A ( A=AL- байт, A=AX – слово)
если DF=0, то инкремент SI
если DF=1, то декремент SI
STOSB (STOSW) ; A > [ES:DI] ( A=AL- байт, A=AX – слово)
если DF=0, то инкремент DI
если DF=1, то декремент DI
2) Команды сравнения
SCASB (SCASW) ; A – mem[ES:DI]
если DF=0, то инкремент DI
если DF=1, то декремент DI
CMPSB (CMPSW) ; mem[DS:SI] – mem[ES:DI]
если DF=0, то инкремент SI и DI
если DF=1, то декремент SI и DI
3) Повторение строковых команд
REP MOVSB(W) ; повторять, счетчик цикла СХ=СХ-1 пока СХ?0
REPE/REPZ ; повторять пока СХ?0 и ZF=1
REPNE/REPNZ ; повторять пока СХ?0 и ZF=0
Примеры
1) Групповая пересылка байтов
CDL ; сбросить флаг DF в 0 для пересылки с увеличением адресов
LEA SI, source ; смещение адреса источника source > SI
LEA DI, ES:dest ; смещение адреса приемника dest >DI
MOV CX, 100 ; количество элементов 100 > счетчик СХ
REP MOVSB ; скопировать байты
2) Сравнение строк
CLD
MOV CX, 100 ; количество элементов 100 > счетчик СХ
CMPSВ ; Сравнение строк до тех пор пока либо значение СХ не
; станет равным 0, либо не будет найдена пара несовпада-
; ющих строк (т.е. поиск несовпадающих строк)
REPNE CMPS dest, source ; Поиск совпадающих строк
3) Сканирование строк
CLD
LEA DI, ES:b_string
MOV AL, ? ?
MOV CX, 100
REPE SCASВ b_string
5 Команды передачи управления
5.1. Команды безусловных переходов.
Производят модификацию регистра инструкций IP или регистров IP и CS без сохранения прежних значений этих регистров.
а) команды передачи управления
JMP addr
JMP ист
б) Переход на процедуру
CALL addr ; переход на процедуру по адресу addr CS:IP > стек
CALL ист ; переход на процедуру по адресу ист CS:IP > стек
в) Возврат из процедуры
RET ; возврат из процедуры стек > CS:IP
RET n ; возврат из процедуры стек > CS:IP, SP=SP+n
5.2 Условные
Jсс offset ; переход, если условие сс выполняется
; где сс = С и NC, Z и NZ и т.д.
5.3 Организация циклов
LOOP offset ; СХ=СХ-1, возврат по смещению offset, если СХ?0
Разновидности
LOOPE/LOOPZ offset ; CX=CX-1, возврат по смещению offset, если СХ?0, ZF=1
LOOPNE/LOOPNZ offset ; CX=CX-1, возврат по смещению offset, если СХ?0, ZF=0
JCXZ offset ; переход по смещению, если СХ=0
5.4 Команды программного прерывания
INT n ; где n=0…255, FLAGS > стек, 0 >IF, 0 >TF,
; вектор прерывания > CS:IP
IRET ; стек > CS:IP, стек > FLAGS
Примеры
1 Условная передача управления
Вычислить c=a*a+b , но если ответ превосходит размер байта, то передать управление на метку error
MOV AL, A
MUL AL
JC error ; если a*а>255, то CF=1 и переход на error
ADD AL, B
JC error ; если a*а+b>255, то CF=1 и переход на error
MOV C, AL
2. Управление циклом
Вычислить факториал числа байтовой переменной n (значение 0…8)
n! = n(n-1)(n-2)..1
MOV AX, 1
MOV CL, n
MOV CH, 0 ; CX=n
JCXZ F1 ; при n=0 обойти цикл
MOV SI, 1
F: MUL SI ; (AX*SI >(DX,AX))
INC SI
LOOP F
F1:
3. Усреднение чисел без знака
LEA BX, table
MOV CX, 100
CALL average
average PROC
SUB AX, AX ; Присвоить делимому 0
SUB DX, DX
PUSH CX ; сохранить значение счетчиков в стеке
Add_w:
ADD AX, [BX] ; добавить текущее значение к сумме
ADC DX, 0
ADD BX, 2
LOOP add_w ; все ли слова просуммированы ?
POP CX ; Да
DIV CX ; вычислить среднее
average RET
ENDP
Общие сведения об аппаратных и программных прерываниях (командаINT n)
Все возможные прерывания нумеруются числами от 0 до 255. Для каждого прерывания при необходимости составляется своя процедура обработки прерывания (ПОП). Начальные адреса этих процедур (векторные прерывания) записываются в самые первые ячейки памяти (первый Кбайт памяти).
Эти начальные адреса попадают сюда при загрузке ОС в оперативную память. Четыре ячейки (байта) выделяются для адресации каждой ПОП (младшие 2 байта – значение IP, старшие 2 байта – значение CS).
Устройство, в котором произошло событие, требующее внимания ОС, посылает в МП сигнал прерывания (ЗПр) и номер этого прерывания, точнее команду INT n (n=0..255) по сигналу от микропроцессора ППр.
Получив номер вектора прерывания n, МП сохраняет в стеке регистр флагов FLAGS и адрес возврата и передает управление по адресу n-го вектора прерывания, т.е. передает управление n-ой ПОП, которая начинает обрабатывать данное прерывание (Подробнее см. раздел Ввод-вывод по прерыванию).
ПОП – это, в общем, обычная процедура. Если она использует какие-то регистры, то она в начале своей работы сохраняет в стеке значения этих регистров, а в конце работы восстанавливает их. Поэтому, когда будет возобновлена работа прерванной программы, в регистрах останутся те же значения, которые были в них в момент прерывания. Для возобновления работы прерванной программы по команде IRET из стека восстанавливаются регистры IP, CS и регистр флагов.
Функции DOS
Рассмотренный механизм прерываний первоначально был предназначен для того, чтобы ОС могла следить за событиями во внешних устройствах ЭВМ (принтере, дисководах и др.). Но затем этот механизм стали использовать и в других целях. Например, в различных программах приходится выполнять одни и те же действия: выводить символы на экран или вводить символы с клавиатуры и т.д.
Чтобы избавить авторов программ от необходимости программировать эти действия в каждой программе заново, такие часто повторяющиеся действия описывают один раз в виде соответствующих процедур и включают их в состав ОС. Теперь все программы могут пользоваться этими процедурами. Эти процедуры ОС можно вызывать с помощью программных прерываний, т.е. с помощью команды
INT n, n=0…255
Эта команда в программе вызывает искусственное (насильственное) прерывание с номером n.
Хотя по команде INT n можно вызвать ПОП для любого n (например, n=0), но следует использовать эту команду только для вызова процедур ОС. В состав ОС (точнее MS DOS) входит много процедур и для них не хватает номеров прерываний. Поэтому эти процедуры объединены в группы, чтобы процедуры из одной группы вызывались по прерываниям с одним и тем же номером.
Процедуры одной группы принято называть функциями соответствующего прерывания. Чтобы различить их, перед выполнением команды INT n в регистр АН записывают номер нужной функции
MOV AH, <номер функции>
INT < номер прерывания>
Получив по команде INT n управление, ОС по номеру из регистра АН определяет, к какой именно функции произошло обращение и передает ей управление. Для выполнения функции может потребоваться определенная информация, например, для функции вывода символа на экран нужно указать код этого символа. Такая информация передается через регистры. Какие именно параметры надо передавать и через какие регистры – зависит от конкретной функции.
Некоторые функции прерывания 21h
Чтобы после завершения программы вернуть управление операционной системе, эта программа обращается к функции 4ch прерывания 21h/
MOV AL, <код завершения>
MOV AH, 4ch
INT 21h
где <код завершения> - некоторое целое число, передающее информацию о успешной работе вызванной программы или об возникшей ошибке.
Вывод на экран (в текстовом режиме)
Для вывода одного символа на экран ПК используется информация 02 прерывания 21h.
MOV DL, <код выводимого символа>
MOV AH, 2
INT 21h
Выводимый символ высвечивается в позиции курсора, после чего курсор сдвигается на одну позицию вправо (или на начало новой строки из последней позиции текущей строки).
Для вывода на экран строки (последовательности символов) можно с помощью функции 09 прерывания 21h.
DS:DX – начальный адрес строки
MOV AH, 9
MOV 21h
Перед обращением к этой функции в регистр DS должен быть помещен номер того сегмента памяти, в котором находится выводимая строка, а в регистр DX – смещение строки внутри этого сегмента. При этом в конце строки должен находиться символ '$’, который служит признаком конца строки и который сам не выводится.
6 Специальные команды
1) Манипуляции с флагами регистра FLAGS
а) с флагом переноса CF
CLC ; 0 > CF
STS ; 1 > CF
CMC инвертирование CF
б) с флагом направления DF
CLD ; 0 > DF
STD ; 1 > DF
в) с флагом прерываний IF
CLI ; 0 > IF
STI ; 1 > IF
2) Команда останова
HALT ; останов и ожидание сигнала сброса или сигнала
; прерывания
3) Команда ожидания
WAIT ; переход МП в состояние ожидания внешнего
; активного сигнала
4) Холостая команда
NOP
1.2.6. Программирование на языке ассемблера микропроцессора I8086
В этом разделе приводится в основном краткий конспект книги Григорьева В.Л. Программирование однокристальных микропроцессоров. – М.: Энергоатомиздат, 1987. 288 с.
В языке ассемблер есть командные операторы, т.е. операторы которые транслятор переводит в команды МП (они впоследствии будут выполняться), операторы распределения данных и директивы ассемблера - команды для транслятора.
Исходный модуль программы представляет собой последовательность операторов (или предложений) языка ассемблера, которые классифицируются на:
- командные операторы, определяют генерируемые ассемблером машинные команды. Они содержат мнемонику и (необязательно) один или два операнда;
- операторы распределения данных, резервирующие ячейки памяти для программных данных;
- директивы ассемблера (или псевдокоманды), содержащие специальные указания для ассемблера.
Иногда операторы распределения данных относят к директивам.
Формат операторов.
Операторы имеют свободный формат, т.е. любое поле оператора может начинаться с любой позиции строки, но поля должны быть отделены от предыдущего поля одним или несколькими пробелами. Формат командных операторов имеет вид:
{Метка:} {Префикс} Код операции {Операнд(ы)} {; Комментарии}
Фигурными скобками обозначены необязательные поля.
Директива ассемблера и операторы распределения данных имеют следующий формат:
{Имя} Директива {Операнд(ы)} {; Комментарии}
Имя директивы никогда не заканчивается двоеточием. Некоторые директивы требуют обязательного наличия имени, например, SEGMENT, ENDS, PROC и другие. В других директивах поле имени должно быть пустым, например NAME, ASSUME, ORG, PUBLIC и другие. В операторах распределения данных DB, DW, DD имя является необязательным.
Поле директивы содержит одно из ключевых неизменяемых слов ассемблера и определяет его действия в процессе ассемблирования. Операнды директив аналогичны операндам командных операторов.
В языке ассемблера имеются три пары взаимосвязанных директив , требующих согласованного употребления :
SEGMENT/ENDS(сегмент / конец сегмента)
PROC/ENDP (процедура или подпрограмма/конец процедуры)
MACRO/ENDM (начало определения макрокоманды/ конец определения макрокоманды)
Элементы операторов .
Операторы состоят из:
- ключевых слов;
- идентификаторов ( меток и переменных );
- численных констант;
- символьных цепочек;
- специальных символов;
- комментариев.
Ключевые (или зарезервированные) слова являются именами, имеющими для ассемблера определенный смысл.
Примерами служат мнемоники команд и директив (MOV, PROC и др.).
Идентификатор
(общий термин меток и имен переменных) - это определяемая программистом последовательность символов. Первым символом в последовательности должна быть буква или один из символов @, -, ?, но один знак ? не может быть идентификатором. Остальные символы могут начинаться с прописной или строчной буквы латинского алфавита или одним из следующих специальных символов @, -, ? . Ассемблер различает идентификаторы по первым символам, количество этих символов зависит от версии языка ассемблер.
Операнды команд ( регистры, переменные, метки, константы ) имеют атрибут типа , который сообщает ассемблеру некоторую информацию об операнде. Например, тип abc сообщает ассемблеру, что операнд является численной константой, а не адресом ячейки памяти.
Ассемблер определяет для программиста набор следующих регистров МП:
общие типа BYTE - регистры AL, AH, BL, BH, CL, CH, DL, DH
общие типа WORD - регистры AX,BX,CX,DX,SP,BP,SI,DI
сегментные типа WORD - CS,DS,SS,ES.
Переменная
- это единица программных данных, имеющая символическое имя. Переменная имеет три атрибута:
1) сегмент (SEG) , идентифицирует сегмент , содержащий переменную;
2) смещение (OFFSET) представляет собой расстояние в байтах переменной от начала (базы) содержащего ее сегмента ( диапазон 0..65535 );
3) тип (TYPE) , идентифицирует единицу памяти, выделяемую для хранения переменной, т.е. 1 (байт), 2 (слово), 4 (двойное слово).
Ассемблер использует атрибуты переменной для определения формата генерируемой машинной команды.
Метка
- это имя, относящееся к ячейке памяти, в которой находится команда, и предназначенное для использования как операнда в командах управления .Метка имеет 4 атрибута :
-сегмента (аналогичен такому же атрибуту переменной);
-смещения (аналогичен такому же атрибуту переменной);
-расстояние (дистанция), определяет возможность перехода по команде передачи к метке, находящейся или внутри сегмента (т.е. управления с помощью двухбайтного смещения -тип NEAR) или вне текущего сегмента (т.е. с помощью 4-байтного указателя сегмент: смещение - тип FAR);
-предположение о сегментном регистре CS. Когда при трансляции (1-ый проход) ассемблер встречает метку как операнд, он не знает ее смещение. Он делает предположение о ее расположении: близкая - NEAR , если знает, что смещение в пределах ±128байт, т.е. SHORT
Ассемблер считает имя меткой, если выполняется одно из следующих правил:
-имя перед кодом операции заканчивается двоеточием, например,
Команды сохранения
STA [STORE] - сохранить;
STA addr [A -> MEM[addr]] - сохранить из аккумулятора данные в ячейку памяти с адресом addr.
STA @X [A -> Х[MEM] ] - сохранить из аккумулятора данные в ячейку памяти, адрес которой хранится в регистре Х.
Арифметические и логические операции.
ADDA addr [A + addr -> A] - добавить в аккумулятор константу.
ADDA @X [A + X[MEM] -> A] - добавить в аккумулятор данные из ячейки, адрес которой хранится в регистре Х.
ANDA addr [A&MEM[addr] -> A] - логическое умножение содержимого аккумулятора и данных из ячейки с адресом addr; результат - в аккумуляторе.
ANDA @X [A&X[MEM] -> A] - логическое умножение содержимого аккумулятора и данных из ячейки, адрес которой хранится в регистре Х; результат умножения - в аккумуляторе.
CMPA addr [A - MEM[addr]] - вычитает из содержимого аккумулятора содержимое ячейки с адресом addr, при этом содержимое аккумулятора не меняется, но формируется признак нуля.
Команды работы со стеком.
LDSP addr [адрес -> SP] - инициализация стека.
Команды условной передачи управления.
BEQ offset - если признак нуля Z=1, то происходит переход. оffset – восьмиразрядное число со знаком. Смещение происходит относительно счетчика команд, т.е. содержимое счетчика команд суммируется со смещением и получается адрес следующей команды.
BNE offset – если Z=0, то переход на offset;
BR offset – всегда переход на offset.
JMP addr – преход на команду с адресом addr. Такой переход называется безусловным.
Команды работы с подпрограммами.
CALL addr – обращение к подпрограмме (СК->стек, addr->CК);
RETURN – возвращение из подпрограммы (Стек->СК).
Микропроцессор с регистрами общего назначения (МПРОН).
РОН – регистры, в которых могут храниться как адреса, так и данные. Любой из регистров общего назначения может исполнять роль аккумулятора, индексного регистра, указателя стека.
Команды могут быть для восьми- (CLRB), так и шестнадцатиразрядных данных (CLR).
NOP [no operation] - выбирая эту команду, МП ничего не делает, а переходит к следующей команде.
Команда, используется для организации задержки.
CLR(В) op - обнуление содержимого операнда op.
CОM (В) op - инвертирование операнда op.
NEG(В) op - меняет знак у операнда op.
Команды загрузки/сохранения .
LD(В) reg, op - загрузить операнд op в регистр reg .
ST(В) reg, op - сохранить данные операнда в регистре reg.
ADD(В) op,reg - op+reg-> reg
AND(В reg, op - op® >reg
CMP(В) reg, op – reg- op формируется признак нуля. Результат никуда не записывается. Выполняется тогда, когда надо сравнить два числа, если они равны, то формируется признак нуля.
Команды условной передачи управления.
BEQ offset - если признак нуля Z=1, то происходит переход на offset.
BNE offset – если Z=0, то переход на offset;
BR offset – всегда переход на offset.
JMP ор – переход по адресу в операнде (безусловный переход.)
Команды работы с подпрограммами.
CALL op – обращение к подпрограмме;
RET – возвращение из подпрограммы.
1.2.2. Структурная схема и система команд микропроцессора I8080
Структурная схема МП I8080 (КР580ВМ80) представлена на рисунке ниже
Условные обозначения:
СК- счетчик команд;
А- аккумулятор;
РП- регистр признаков;
АЛУ - арифметико-логическое устройство;
УУ - устройство управления.
Рассмотрим основные функции составляющих МП.
Арифметико-логическое устройство (АЛУ). В МП имеется АЛУ, предназначенное для выполнения арифметических и логических операций. В АЛУ рассматриваемого МП выполняются арифметические операции сложения и вычитания и логические операции И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ.
Регистры общего назначения можно использовать во всех арифметических и логических командах. Эти регистры можно объединять в пары, тогда получится 16-тиразрядный регистр:
(В,С) – В-пара;
(D,E) – D-пара;
(H,L) – H-пара.
В то же время каждый их них имеет определенную специализацию. Так например, Н-пара часто используется для адресации к памяти (в нее помещается адрес ячейки и производится косвенная регистровая адресация).
Управляющие сигналы.
Управляющие сигналы устройства управления показаны на рисунке ниже
Рис. Управляющие сигналы устройства управления
Синхросигналом Синхр можно записать в регистр управляющее слово (УС).
Сброс
- по этому сигналу счетчик команд СК обнуляется.
Прием (ПМ)
- сигнал приема МП данных с ШД.
Выдача (ВД) - сигнал выдачи МП данных на ШД.
Работу МП можно приостановить, если снять сигнал готовности (Гот)
Получив сигнал ЗПр, микропроцессор перестает выполнять текущую программу и переходит на подпрограмму обслуживания устройства, которое выдало этот запрос. Этот сигнал проверяется на последнем такте каждого машинного цикла команды.
ЗЗх и ПЗх - обеспечивают режим прямого доступа к памяти. Получив сигнал ЗЗх, МП отключается от магистрали и с этого момента КПДП ( контроллер прямого доступа к памяти ) начинает управлять магистралью.
Управляющее слово (УС).
D7 – ЧТ (Чтение) выставляется 1, если предполагается, что на данном машинном цикле будут читаться данные из памяти
D6 – ВВД (Ввод). выставляется 1, если предполагается, что на данном машинном цикле будут вводиться данные, т.е. адресная шина содержит адрес устройства ввода, а шина данных-вводимую информацию.
D5 – Ц1 (М1) (Первый цикл команды). Признак машинного цикла выборки первого байта команды.
D4 – ВЫВ (Вывод). Выставляется 1, если предполагается, что на первом машинном цикле будут выводиться данные.
D3 – ПОС (Подтверждение останова). Признак останова по команде HALT.
D2 – СТК (Операции со стеком). Выставляется 1, если предполагается обращение к стеку (не получила развития).
D1 - ЗП/ВЫВ (Запись или вывод). Совмещается с командой вывода, следовательно, необходимо учитывать разряд D4.
D0 – ППр (Подтверждение прерывания).
Регистр признака.
Выполнение какой-либо операции может ставиться в зависимость от значения результата выполнения предыдущей операции, например, в том случае, когда при сложении появляется единица переноса.
Чтобы можно было обратиться к информации о результатах вычислений, АЛУ соединяют со специальным набором триггеров, которые устанавливаются в 1 или сбрасываются в 0 в зависимости от результата произведенных вычислений. Каждый из триггеров хранит какой-нибудь признак. В совокупности эти триггеры образуют регистр признаков (регистр флагов), приведенный на рисунке ниже.
S
|
Z
|
0
|
AC
|
0
|
P
|
1
|
CY
|
D7
|
D6
|
D5
|
D4
|
D3
|
D2
|
D1
|
D0
|
Регистр признаков МП
|
Признак знака S. Отрицательные числа представляются в МП в дополнительном коде. Следовательно, старший разряд отображает знак числа:1- для отрицательных чисел, 0 - для положительных. Поэтому старший разряд результата выполнения операций в АЛУ запоминается в виде признака знака для дальнейшего использования.
Признак нуля Z. Признак нуля отмечает случай появления в АЛУ результата 0000 00002.Признак нуля позволяет организовывать циклы, в течение которых МП-система находится в ожидании какого-то события.
Признак переноса CY. Является одним из важнейших признаков. При сложении двух восьмиразрядных чисел этот признак показывает, нужно ли переносить 1 в младший разряд следующего байта. Он также показывает, нужно ли занимать единицу из старшего байта при вычитании двух восьмиразрядных чисел.
Признак вспомогательного переноса AC. Один из вариантов признака переноса является признак вспомогательного переноса AC, который устанавливается в единицу, если происходит перенос разряда из младшей тетрады байта в старшую. Используется при сложении чисел, записанных в двоично-десятичном коде.
Признак паритета (четности) Р. Признак устанавливается равным 1. если в результате операции общее число единиц является четным. Используется, как правило, при контроле четности данных при передаче, так как позволяет выявить возможные при передаче ошибки.
Система команд МП.
Всю систему команд МП можно разбить на следующие группы:
1) команды пересылок;
2) арифметические команды;
3) логические команды и команды сдвига;
4) команды управления;
5) специальные команды.
Рассмотрим каждую группу команд в отдельности.
1) Команды пересылок.
Команды пересылок предписывают микропроцессору передачу данных из одного блока в другой, например, из одного регистра в другой. Эти команды всегда определяют источник и приемник данных, причем в команде сначала следует адрес приемника, а потом адрес источника.
Содержимое источника при этом не изменяется.
Команда MOV
MOV А,В; В>А
MOV А,М; М>А, M адрес ячейки памяти , который предварительно надо поместить в H-пару.
NED EQU 'AB'
MOV DX, NED
обеспечивает загрузку 16-тиричного числа 4142Н в регистр DX ( в код ASCII буква А имеет код 41Н, а буква В - 42Н.
Символьные цепочки (или символьные константы) - заключаются в апострофы и обычно имеют максимальную длину до 255 символов (за исключением символов возврата каретки и перевода строки).Например,
NED: NOP
-имя находится в поле имени директивы LABEL; например,
NED LABEL FAR
-имя находится в поле директивы EQU, например,
NED EQU THIS NEAR
-имя находится в поле имени пары директивPROC/ENDP
NED PROC NEAR
.
.
.
NED ENDP
Численная константа - это численное значение, вычисляемое во время ассемблирования по заданному выражению. Константа отличается от адреса памяти (метка или переменная) тем, что она определяет число. Численные константы можно представлять в системах счисления с основание 2 (111001В), 8 (16Q), 10 (15 или 15D), 16 (38H, 0A3H). Если константа начинается с символа, то число предваряется нулем (0А3Н). Диапазон всех чисел соответствует диапазону 16-тиразрядных двоичных чисел (включая знаковый разряд). Отрицательные числа представляются в дополнительном коде. В качестве численных констант допускается использовать односимвольные (типа BYTE) и двухсимвольные (типа WORD) цепочки, например фрагмент
Основы микропроцессорной техники
Основы микропроцессорной техники
1.2. Архитектура однокристальных процессоров и программирование на языке ассемблера
Под архитектурой МП понимается его структурная схема и система команд
1.2.1. Архитектура простейших гипотетических микропроцессоров
Рассмотрим гипотетический процессор с аккумулятором (МПА), структура которого приведена на рисунке ниже.
Рис. Структура гипотетического процессора с аккумулятором (МПА)
Z
- признак нуля, признак результата завершения команды в АЛУ. Z=1, если результат равен 0 и Z=0, если результат не равен 0.
SP - указатель стека. Стек- это такой способ организации хранения данных, при котором существует доступ только к последней ячейке памяти, в которую была записана информация. В указателе стека хранится адрес верхушки стека - ячейки, в которую последний раз была записана информация.
Х - индексный регистр. В него записывается адрес ячейки, из которой надо взять данные или куда надо поместить данные. Вторая функция индексного регистра - хранение промежуточных данных.
EAR - регистр адреса, предназначен для формирования и хранения адреса ячейки с данными. Если необходимо обратиться к данным, то адрес выставляется на ША из этого регистра.
Система команд для МПА.
Команды работы с аккумулятором.
NOP [no operation] - выбирая эту команду, МП ничего не делает, а переходит к следующей команде. Команда, используется для организации задержки.
CLRA [A = 0] - обнуление содержимого аккумулятора.
CMA - инвертирование содержимого аккумулятора.
NEGA [A = -A] - меняет знак у числа в аккумуляторе.
Команды загрузки.
LDA data [data -> A] - загрузить в аккумулятор константу.
LDA addr [MEM[addr] ->A] - загрузить в аккумулятор данные из ячейки памяти с адресом addr.
LDA @X - загрузить в аккумулятор данные из ячейки памяти, адрес которой хранится в регистре X.
solid windowtext
|
R2
|
R3
|
0
|
0
|
1
|
1
|
1
|
1
|
1
|
0
|
1
|
1
|
2
|
1
|
1
|
0
|
1
|
3
|
1
|
1
|
1
|
0
|
Аналогично при нулевом уровне во второй строке матрицы
можно определить нажатые клавиши второго столбца матрицы
номер клавиши
|
TURBO ASSEMBLER считает имена полей
TURBO ASSEMBLER считает имена полей глобальными, т.е. активными во всех местах программы или модуля . Хотя в будущих версиях имена полей могут стать локальными.
Описав тип RECORD и несколько переменных данного типа можно использовать различные способы для чтения и записи значений в битовые поля этих переменных.
Директива STRUCTURE ( STRUC) .
Эта директива обеспечивает определение и доступ к переменным со сложными типом данных. Структура, ограниченная директивами STRUC и ENDS с одинаковыми именами, представляет собой шаблон (карту), который присваивает имена и атрибуты( тип, длина , размер) набору полей. Единицами полей структуры являются байт, слово, двойное слово. Следовательно, каждое поле в структуре определяется директивами DB,DW,DD. Поля такого шаблона используются для определения переменных с новым типом данных, который порождает директива STRUC. Обращение к различным полям в таких переменных осуществляется с использованием оператора в виде точки (.)
Память структуре как шаблону не распределяется. Структура связывается с конкретной областью памяти, если имя поля структуры фигурирует в команде вместе с базовым адресом, в качестве которого может быть имя переменной или один из базовых регистров ВХ, ВР. Определяя различные базовые адреса можно связывать структуру с различными областями памяти.
Приведем еще один пример структуры:
Номер нажатой клавиши определяется по
|
S2
|
S3
|
0
|
1
|
1
|
1
|
1
|
0
|
1
|
1
|
1
|
1
|
0
|
1
|
1
|
1
|
1
|
0
|
.Это постоянно делается в цикле.
Номер нажатой клавиши определяется по формуле:
Nкл=4i+j
i- номер строки матрицы
j-номер столбца матрицы
Сделаем еще одно важное замечание. Необходимо исключить дребезг клавиш. Для этого одна и та же клавиша опрашивается несколько раз (от 50 до 100). Если все опросы подтвердились, значит, клавиша действительно была нажата.
Индикация.
Индикация бывает двух типов: статическая и динамическая.
. При статической индикации на каждый элемент требуется отдельный порт(см. рис. ниже).
При динамической индикации возможное число подключаемых элементов возрастает до 8. Это достигается за счет параллельного подключения выводов всех 8-ми индикаторов к порту А. Еще один вывод подключается к порту В, как показано на рисунке ниже. При таком подключении через порт А будет осуществляться управление выводимой информацией, а через порт В - выбор светового индикатора, на который будет выводиться информация. Если подавать питание с большой частотой, то можно добиться одновременной индикации всех элементов.
1.3.7. Программируемый контроллер прерываний KP580BH59. Пример применения
Напомним, что система прерываний — это совокупность программных и аппаратных средств, реализующих механизм прерываний.
Аппаратные средства системы прерываний включают выводы микропроцессора:
INTR — вывод для входного сигнала внешнего прерывания. На этот вход поступает выходной сигнал от микросхемы контроллера прерываний КР580ВН59;
INTA — вывод микропроцессора для выходного сигнала подтверждения получения сигнала прерывания микропроцессором. Этот выходной сигнал поступает на одноименный вход INTA микросхемы контроллера прерываний КР580ВН59;
NMI — вывод микропроцессора для входного сигнала немаскируемого прерывания.
Кроме того, аппаратные средства системы прерываний содержат микросхему программируемого контроллера прерываний КР580ВН59.
Она предназначена для фиксирования сигналов прерываний от восьми различных внешних устройств. В силу ее важной роли при работе всей вычислительной системы, мы ее подробно рассмотрим ниже;
Итак, центральное место в схеме обработки аппаратных прерываний занимает программируемый контроллер прерываний (ПКП), например, микросхема КР580ВН59 (или КР580ВН59А), позволяющий организовать богатую систему обслуживания прерываний. Эта микросхема может обрабатывать запросы от восьми источников внешних прерываний. Перечислим функции, выполняемые микросхемой контроллера прерываний:
фиксирование запросов на обработку прерывания от восьми источников, формирование единого запроса на прерывание и подача его на вход INTR микропроцессора;
формирование номера вектора прерывания и выдача его на шину данных;
организация приоритетной обработки прерываний;
запрещение (маскирование) прерываний с определенными номерами.
На рисунке ниже показано схематическое представление внутренней структуры и физических выводов микросхемы КР580ВН59.
Рассмотрим назначение основных структурных компонентов контроллера прерываний
регистр запросов на прерывания (обозначение в литературе IRR - Interrupt Request Register) - восьмиразрядный регистр, фиксирующий поступление сигнала на один из входов ЗПр0-ЗПр7. Фиксация выражается в установке соответствующего бита в единичное состояние;
регистр маскирования прерываний (или IMR - Interrupt Mask Register — восьмиразрядный регистр, с помощью которого можно запретить обработку запросов на прерывания, поступающих на соответствующие входы (уровни) ЗПр0-ЗПр7. Для запрещения (маскирования) определенных уровней прерываний необходимо установить соответствующие биты регистра IMR. Эта операция осуществляется путем программирования порта 21h;
регистр обслуживаемых прерываний ISR (Interrupt Service Register) — восьмиразрядный регистр, единичное состояние разрядов которого показывает, прерывания каких уровней обрабатываются в данный момент в микропроцессоре;
схема разрешения приоритетов — функцией данного блока является разрешение конфликта при одновременном поступлении запросов на входы ЗПр0-ЗПр7;
схема управления — основной функцией данного блока является организация информационного обмена контроллера прерываний и микропроцессора через шину данных.
Рассмотрим возможное прохождение и обработку сигнала прерывания от некоторого внешнего устройства.
1) Контроллер получает запрос на прерывания.
2) Этот запрос фиксируется в регистре запросов прерываний.
3) Схема разрешения приоритетов выявляет запрос на прерывание с максимальным приоритетом и пропускает его на вход регистра обслуживания прерываний.
4) Сигнал поступает на схему управления, которая формирует сигнал на выводе Пр . Этот вывод связан с входом микропроцессора INTR. Таким образом, сигнал на входе контроллера достигает микропроцессора. При поступлении сигнала на вход INTR в микропроцессоре происходят следующие процессы:
1. Анализируется флаг IF. Единичное состояние этого флага говорит о том, что аппаратные прерывания разрешены, нулевое — запрещены.
2. Если прерывания запрещены, то запрос на прерывание «повисает» до момента установки IF в единицу.
3. Если прерывания разрешены, микропроцессор выполняет следующие действия:
сбрасывает флаг IF в ноль;
формирует сигнал подтверждения прерывания на выводе микропроцессора INTA. Этот вывод микропроцессора замкнут на вывод ППр контроллера.
5) Данный вывод внутри контроллера прерываний замкнут на его схему, которая выполняет сразу несколько действий при поступлении этого сигнала:
1. Сбрасывает бит в регистре запросов прерываний, соответствующий уровню поступившего запроса прерывания.
2. Устанавливает в регистре обслуживания прерываний 1 в разряде, соответствующем поступившему запросу прерываний, тем самым, фиксируя факт обработки прерывания в микропроцессоре.
3. Формирует с помощью блока управления номер вектора прерывания, значение которого формируется в буфере данных и далее поступает на выводы контроллера D0.. .D7.
Выводы D0.. , D7 замкнуты на шину данных, по которой номер вектора поступает в микропроцессор. В микропроцессоре этот номер используется для вызова соответствующей процедуры обработки прерывания.
Очень важный момент связан с процессом завершения обработки прерывания. Проблема здесь состоит в следующем. После принятия микропроцессором запроса на обслуживание прерывания в контроллере устанавливается бит в регистре ISR, номер этого бита соответствует уровню прерывания. Установка бита с данным номером блокирует все прерывания уровня, начиная с текущего, и менее приоритетные Если процедура прерывания закончит свою работу, то она сама должна этот бит сбросить, иначе все прерывания этого уровня и менее приоритетные будут игнорироваться. Для осуществления такого сброса необходимо послать код 20h в порт 20h.
MVI A,20h
OUT 20h
Другой не менее интересный момент заключается в том, что микропроцессор при принятии к обработке запроса на прерывание сбросил флаг IF в ноль, тем самым запретив все последующие аппаратные прерывания. Этим обстоятельством программист может пользоваться по своему усмотрению. Поскольку все запросы на прерывания с приоритетом, равным или меньшим текущему, будут запрещены в любом случае (это обусловлено логикой работы контроллера КР580ВН59), программист должен решить, насколько его замыслам могут помешать запросы на более приоритетные прерывания. Если это некритично, то лучше сразу, в начале процедуры обработки прерывания установить флаг IF в единицу, В большинстве случаев эту операцию нужно делать как можно раньше. Для установки флага IF в единицу в системе команд микропроцессора есть специальная команда, не имеющая операндов:
STI - разрешить аппаратные прерывания.
В процессе загрузки компьютера и в дальнейшем во время работы контроллер прерываний настраивается на работу в одном из режимов приоритетов
1.Жесткий приоритет (в литературе также встречается обозначение FNM (Fully Nested Mode) или режим вложенных прерываний.) В этом режиме каждому входу присваивается фиксированное значение приоритета, причем уровень ЗПр0 имеет наивысший приоритет, a ЗПр7 — наименьший.
Приоритетность прерываний определяет их право на прерывание обработки менее приоритетного прерывания более приоритетным (при условии, конечно, что IF = 1).
2.Циклический приоритет. ( В литературе также встречается обозначение ARM (Automatic Rotation Mode))— режим циклической обработки прерываний. В этом режиме значения приоритетов уровней прерываний также линейно упорядочены, но уже не фиксированным образом, а изменяются после обработки очередного прерывания по следующему принципу: значению приоритета последнего обслуженного прерывания присваивается наименьшее значение. Следующий по порядку уровень прерывания получает наивысшее значение, и поэтому при одновременном приходе запросов на прерывания от нескольких источников преимущество будет иметь этот уровень. Это дает возможность обеспечить «равноправие» при обработке прерываний.
Например. До поступления запроса на прерывания:
01234567
Поступил ЗПр3. После его выполнения очередь на обслуживание прерываний будет выглядеть следующим образом:
45670123
Как уже было сказано выше, указатели на процедуры обработки прерываний записаны в таблице векторов прерываний. Но как же МП определяет адрес каждой процедуры обработки? В памяти компьютера таблица векторов прерываний выглядит следующим образом. Имеется общий базовый адрес, от которого через равное количество ячеек (либо 4 - либо 8) находятся адреса соответствующих процедур обработки запросов прерываний. Базовый адрес задается двумя первыми начальными управляющими словами при начальной инициализации контроллера. Бывают ситуации, когда восьми входов ЗПр контроллера недостаточно. Тогда систему прерываний реализуют каскадированием. К одному контроллеру, называемому ведущим, подключают до восьми ведомых контроллеров. Таким образом, при желании число входов ЗПр можно увеличить до 64.
Как же здесь обслуживаются ЗПр? Ведущему (на его вход ВДм подается высокий уровень +5В) с помощью третьего начального управляющего слова сообщается о том, что к нему подключены ведомые ( на их входы ВДм подается низкий уровень 0).
При поступлении сигнала ЗПр ведущий знает, кто выставил запрос прерывания, и выдает кодовую комбинацию команды CALL и по шине каскадирования в соответствии с приоритетами сообщает, какой из ведомых должен выставить адрес addr16.
Программирование контроллера прерываний осуществляется через адресное пространство ввода-вывода посредством двух 8-битовых портов с адресами 20h и 21 h. Управление контроллером осуществляется путем посылки в определенной последовательности в эти порты управляющих слов, которые также управляют работой дешифраторов адресов. Управляющие слова делятся на две группы. Это начальные управляющие слова (НУС), задающие начальные установки работы ПКП и текущие управляющие слова (ТУС), позволяющие программировать ПКП во время его работы.
Начальные управляющие слова.
НУС 1.
Осуществляет сброс всех разрядов регистра запросов прерываний, очищает регистр маски, присваивает низший приоритет входу ЗПр7, сбрасывает триггеры обслуживающего регистра.
Формат НУС 1:
После НУС 1 нужно обязательно загружать НУС 2.
НУС 2.
Задает старший байт базового адреса подпрограмм обслуживания прерываний.
Если есть каскадирование, то за НУС 2 должно обязательно следовать НУС 3, которое является разным для ведущего и ведомого контроллеров.
Для ведущего: единицы устанавливаются в тех битах, к которым подключены ведомые.
Для ведомого: в последних трех битах выставляется номер входа ЗПр ведущего, к которому он подключен.
Ведущий ПКП выставляет на шину каскадирования ту трехразрядную кодовую комбинацию, которая записана в D2 D1D0 третьего начального управляющего слова ведомого ПКП, и тот ПКП, у которого эта комбинация совпадает, выставляет соответствующий адрес подпрограммы обработки прерывания.
Текущие управляющие слова.
ТУС 1
Этим управляющим словом программируется регистр маскирования прерываний.
ТУС 2.
Если К=0 и В=1, то будет сброшен бит в обслуживающем регистре прерывания, имеющего наивысший приоритет.
После обработки прерываний необходимо обязательно сбросить обслуживающий бит.
Если К=1 и В=1, то будет сброшен бит в обслуживающем регистре с номером К2 К1 К0 (номер запроса).
ТУС 3.
Режим спецмаскирования. Если во время обслуживания запроса наивысшего приоритета надо обслужить ЗПр с меньшим приоритетом, а сбрасывать ‘1’ в обслуживающем регистре до конца обслуживания запроса нельзя, то применяется спецмаскирование. На время обслуживания ЗПр меньшего приоритета прерывается обслуживание запроса наивысшего приоритета (таким образом можно принимать все ЗПр).
Рассмотрим теперь более подробную схему каскадирования (см. рис. ниже).
На этой схеме явно указана двунаправленная шина каскадирования (ведущий выдает, а ведомый принимает). Напомним, какой из контроллеров будет ведущим, а какой ведомым задается схемотехнически с помощью входа ВДм.
Сигналы ППр от МП подаются на все 3 контроллера одновременно. Получив первый сигнал ППр, ведущий контроллер выдает код команды CALL и каскадный код (т.е. номер входа ЗПр, к которому подключен выбранный ведомый) ведомого контроллера с высшим приоритетом. По второму и третьему сигналам ППр выбранный ведомый контроллер выдает 16-тиразрядный адрес подпрограммы обработки соответствующего прерывания (см. рис. ниже).
Поскольку сигнал ЗПр может быть принят микропроцессором в случайный момент времени, то необходимо помнить о следующих моментах:
- необходимо сохранить в стеке (команда PUSH) все регистры, которые используются в подпрограмме обработки прерываний;
- в конце подпрограммы восстановить содержимое всех используемых в подпрограмме регистров из стека (команда POP);
- для процессора I8080 перед возвратом из подпрограммы обработки прерываний надо выполнить команду EI (разрешить прерывание), так как этот МП после ухода на подпрограмму прерываний автоматически выполняет команду DI (запретить прерывания);
- в контроллере надо сбросить бит обслуживания прерывания после обслуживания прерывания.
1.3.8. Программируемый таймер KP580BИ54. Пример применения
Программируемый таймер (ПТ) может вырабатывает временные интервалы, длительность и форма представления которых задаются программно. Специальные режимы ПТ позволяют:
- делить входную частоту;
- вырабатывать однократные временные интервалы по внешнему сигналу или команде МП;
- вести подсчет внешних импульсов или измерять длительность временного интервала.
ПТ состоит из 3-х идентичных и не зависящих друг от друга вычитающих счетчика и могут иметь различные режимы работы и различные типы счета (двоичный или двоично-десятичный).
Любой из названных режимов работы любого из трех счетчиков ПТ может быть запрограммирован загрузкой в таймер управляющего слова. Текущее состояние счетных схем ПТ может быть прочитано микропроцессором. Структурная схема ПТ приведена на рисунке ниже.
Используемые условные обозначение ПТ:
- D0…D7 - двунаправленная шина данных;
- (ЧТ), (ЗП) - управляющие сигналы чтения и записи;
- А1, А0 – адресные входы;
- - выбор кристалла (устройства);
- CLK0 (ТИ0).. CLK2 (ТИ2) - тактовые импульсы;
- GATE0 (Р0)... GATE2 (Р2) - сигналы разрешения работы канала;
- OUT0 (Вых0)...OUT2 (Вых2)- выходные сигналы каналов.
- СЕ - счетчик/таймер;
- OL - выходная защелка;
- CR - регистр для хранения констант счета;
- RSTAT - регистр состояния;
- CWR - регистр управления.
Назначение основных частей МС.
Буфер шины данных D0…D7
представляет собой двунаправленный 8- разрядный буфер, используемый для сопряжения ПТ с ШД МП-системы. Через буфер принимаются управляющие слова и начальные значения кодов счетчиков и выдаются текущие состояния счетных схем ПТ.
Схема управления чтением и записью обеспечивает выполнение операций ввода и вывода информации в таймер. Адресные сигналы указывают один из счетчиков или регистр управляющего слова. Операции ПТ приведены в таблице.
Таблица операций ПТ КР580ВИ54
Операция
|
Сигнал
|
|
|
|
А1
|
А0
|
Запись данных в счетчик 0
|
0
|
1
|
0
|
0
|
0
|
Запись данных в счетчик 1
|
0
|
1
|
0
|
0
|
1
|
Запись данных в счетчик 2
|
0
|
1
|
0
|
1
|
0
|
Запись управляющего слова
|
0
|
1
|
0
|
1
|
1
|
Чтение содержимого счетчика 0
|
0
|
0
|
1
|
0
|
0
|
Чтение содержимого счетчика 1
|
0
|
0
|
1
|
0
|
1
|
Чтение содержимого счетчика 2
|
0
|
0
|
1
|
1
|
0
|
Отключение таймера от ШД
|
1
|
Х
|
Х
|
Х
|
Х
|
(выходы D - в высокоимпедансное состояние)
|
0
|
1
|
1
|
Х
|
Х
|
Счетчики каналов СЕ представляют собой 16-разрядные вычитающие счетчики с возможностью установки произвольного начального кода. Счет может выполняться в двоичном или двоично-десятичном коде. Входными сигналами каждого счетчика являются тактовые импульсы CLK, по отрицательным фронтам которых содержимое счетчика уменьшается на 1, и сигнал разрешения работы канала, разрешающий (GATE = 1) и запрещающий (GATE = 0) счет. Выходной сигнал канала формирует временной интервал в соответствии с запрограммированным режимом. Счетчики каналов таймера полностью независимы, Каждый из них может иметь свой режим работы и свой начальный код. Чтение содержимого каждого счетчика выполняется либо при прекращении счета, либо без его приостановки (режим чтения "на лету").
Выходная защелка OL 16-разрядная, необходима для запоминания и хранения содержимого счетчика СЕ по командам "Чтение ‘на лету’" и "Обратное чтение".
Регистр для хранения констант счета CR
16-разрядный, предназначен для хранения констант счета, содержимое регистра изменяется только при перезагрузке счетчика или при перепрограммировании режима его работы (запись управляющего слова).
Регистр состояния RSTAT 8-разрядный регистр состояния RSTAT содержит код типа счета, код режима работы канала, код чтения/записи констант счета, признак перезагрузки констант и состояние выхода OUT, содержимое RSTAT защелкивается в STATL по команде "Обратное чтение";
Регистр управления CWR 6-разрядный, предназначен для приема и хранения кода управляющего слова (разряды D5-D0), который задает режим работы канала, определяет тип счета и последовательность загрузки констант счета.
Режимы работы.
Каждый канал таймера может работать в одном из шести режимов.
Режим 0. Режим счетчика событий.
Обеспечивает выработку единичного выходного сигнала после поступления на ПТ заданного количества импульсов CLK
Выходной сигнал OUT устанавливается в 0 (низкий уровень) в момент загрузки управляющего слова, задающего данный режим при программировании таймера. После записи начального кода начинается счет импульсов CLK. Отсчитав заданное количество импульсов, выходной сигнал OUT устанавливается в 1 (высокий уровень) по отрицательному фронту CLK и сохраняет это значение до занесения следующего начального кода.
Режим 1. Режим программируемого одновибратора.
Обеспечивает выработку временного интервала, равного заданному количеству периодов CLK .
Выходной сигнал OUT в исходном состоянии имеет высокий уровень (т. е. 1) и принимает нулевые значения на время, пропорциональное значению начального кода счетчика. Интервал формируется от первого отрицательного фронта сигнала CLK после установки разрешающего входного сигнала GATE в единичном значении.
Режим 2. В режиме делителя частоты.
Таймер генерирует периодический сигнал с частотой в N раз меньшей, чем частота тактовых импульсов CLK, N - начальный код счетчика.
В течение N- 1 такта каждого периода выходной сигнал OUT равен 1, на последнем такте периода - нулю. Перезагрузка счетчика между двумя выходными импульсами приводит к изменению величины следующего периода. Формирование выходного сигнала осуществляется при GATE = 1 непосредственно после загрузки начального кода счетчика.
Режим 3. Режим генератора меандра.
Аналогичен режиму делителя частоты за исключением того, что выходной сигнал в течение первой половины периода равен 1, а во второй половине устанавливается в ноль. Если начальный код счетчика нечетен, то единичный выходной сигнал на один такт дольше нулевого.
Режим 4. В режиме программного стробирования.
Таймер формирует временной интервал, отсчитываемый от первого отрицательного фронта сигнала CLK после окончания записи кода N в ПТ.
Длительность интервала равна N периодам тактового сигнала. После окончания интервала выходной сигнал принимает нулевое значение на один период сигнала CLK. Если счетчик перезагружается во время счета, то предыдущий интервал прерывается и
формируется новый - с учетом принятого значения начального кода.
Режим 5. Режим аппаратного стробирования.
Аналогичен режиму программного стробирования, однако формирование интервала здесь начинается после установки входного сигнала GATE из 0 в 1. Для генерирования следующего интервала сигнал GATE должен быть предварительно установлен в ноль. Если это произойдет до окончания формирования текущего интервала, то он прерывается,
и начинается формирование нового интервала.
Программирование таймера
Программирование таймера осуществляется занесением управляющих слов для каждого счетчика и их начальных кодов. Отдельные каналы могут программироваться в любой последовательности. Начальный код счетчика может быть загружен не сразу после управляющего кода, а в любой последующий момент времени. Загрузка отдельных байтов начального слова может выполняться различным способом в соответствии с запрограммированной последовательностью.
Формат управляющего слова ПТ КР580ВИ54 приведен на рис.
Часто желательно читать содержимое счетчика без нарушения процесса счета. Имеется три метода чтения счетчиков Простое чтение, “Чтение на ‘лету’”, "Обратное чтение".
1. Простое чтение
Осуществляется путем выполнения обычной операции чтения. Для обеспечения стабильного показания счетчика работа счетчика должна быть приостановлена путем временного снятия сигнала разрешения (т.е. подачей GATE=0), либо путем прекращения подачи сигнала CLK на данный счетчик (с помощью внешней логической схемы)
2. “Чтение на ‘лету’”
Осуществляется путем подачи в таймер специальной команды “Чтение на ‘лету’” и последующего чтения. Во втором случае программист может обеспечить считывание без прерывания процесса счета путем подачи команды чтения счетчика на "лету", которая характеризуется следующими значениями разрядов управляющего слова:
- D7, D6 содержит код канала (т.е. номер счетчика);
- D5, D4 равны 0 (задают режим чтения счетчика на "лету");
- D3...D0 имеют произвольное значение.
-
Примеры программирования ПТ на разные режимы работы и его инициализации.
1. Программирование ПТ
MVI A,00110101B ; Счетчик 0 в режим делителя частоты (режим 2),
OUT 73H ; двоично-десятичный счет
MVI A,01010011B ; Счетчик 1 в режим программируемого одновибратора
OUT 73H ; (режим 1), двоично-десятичный счет
MVI A,10110000B ; Счетчик 2 в режим счетчика событий (режим 0),
OUT 73H ; двоичный счет
2. Инициализация ПТ
MVI A,0 ; Коэффициент деления
OUT 70H ; Счетчик 0 равен 10103
MVI A,00010000B ;
OUT 70H ;
MVI A,5H ; Длительность выделенного интервала составляет 5
; периодов входной последовательности импульсов
; ТИ1
OUT 71H ;
MVI A,0 ; Счетчик 1 будет считать число входных импульсов
; ТИ2 до максимально возможного значения
OUT 72H ;
Интерфейс с частотным датчиком.
В медленно меняющихся процессах можно измерять частоту сигнала. В быстро изменяющихся процессах частоту можно определить, измерив, период.
Пример схемы сопряжения частотного датчика (сигнал Х) с МП-системой с помощью таймера КР580ВИ53 приведен на рисунке ниже.
Существует два способа измерения частоты.
1. Измерение частоты.
Задаем время измерения tизм. Частоту fизм определяем по количеству периодов Тизм, которые уместились в интервал времени tизм. Время измерения задается с помощью эталонных импульсов:
tизм=Тэт * кэт.
Тэт – эталонный импульс;
кэт – количество импульсов.
При погрешности порядка 1% необходимо, чтобы в заданный интервал времени уложилось не менее 100 периодов.
2.Измерение периода.
Период сигнала датчика вычисляется по тому, сколько эталонных импульсов уместилось в периоде датчика:
Тд = Тэт * кэт.
Тэт
–эталонный импульс;
кэт – количество эталонных импульсов внутри измеряемого периода сигнала датчика.
Погрешность метода сравнима с Тэт. Возникает проблема создания tизм= Тд.
Пример.
Измерим период сигнала датчика с помощью программируемого таймера. Необходимо сформировать tизм, кратное заданному количеству измеряемых периодов Тд. Используем режим одновибратора для формирования tизм. Эталонные импульсы будем подсчитывать с помощью канала, запрограммированного в нулевом режиме.
Таким образом:
1.Первый канал надо запрограммировать в режим одновибратора, чтобы сформировать интервал измерения tизм, (кд – число периодов сигнала датчика – задается программно).
2.Вых.1 через инвертор подаем на вход Р2 второго канала, который программируем в режим счетчика событий.
3.Счетчик второго канала обнуляем.
4.Начало измерений запускаем выходным сигналом одного из выходов порта управления (перепад с низкого уровня на высокий, то есть сначала в этот разряд записывается 0, а потом - 1).
5.Процесс измерения заканчивается через интервал времени tизм путем снятия высокого уровня сигнала Р2.
6.Читаем содержимое счетчика канала 2.
Теперь в счетчике будет
0000h 0
0FFFFh -1
0FFFEh -2
.
.
.
-кэт
Чтобы получить кэт, надо изменить знак у прочитанного из второго канала значения.
1.3.9. Контроллер прямого доступа KP580BТ57
Ввод-вывод в режиме прямого доступа к памяти (ПДП).
Прямой доступ к памяти (ПДП) характерен для высокоскоростных внешних устройств, например, накопителей на магнитных дисках, сетевых карт и т.д. Этот режим ввода-вывода позволяет интерфейсным схемам устройства обмениваться данными с памятью без постоянного участия процессора. Операции ПДП выполняются под управлением схемы, называемой контроллером прямого доступа к памяти (КПДП). Этот контроллер исполняет роль процессора при обращении к памяти. Для каждого пересылаемого слова он формирует адрес памяти и сигналы системной магистрали, управляющие пересылкой данных. Поскольку КПДП производит пересылку блоков данных, он увеличивает адрес памяти, по которому будет записываться (или читаться) каждое следующее слово, и отслеживает количество таких операций. Чтобы инициировать пересылку блока данных, МП пересылает контроллеру начальный адрес этого блока (в регистр адресов), размер блока и направление пересылки (в счетчик циклов или ячеек). Последовательность работы КПДП при пересылке блока данных следующая (см.
рис. ниже):
1) От ВУ посылается сигнал ЗПДП (запрос прямого доступа к памяти) к КПДП;
2) КПДП выставляет сигнал ЗЗх (запрос захвата) к МП. МП, получив сигнал ЗЗх, отключается от системной магистрали и выставляет сигнал ПЗх (подтверждение захвата) к КПДП;
3) КПДП, получив ПЗх, выставляет сигнал ППДП (подтверждение прямого доступа к памяти) для ВУ и сигнал, запрещающий адресацию к ВУ. Далее КПДП начинает выполнять функции процессора по управлению системной магистралью. КПДП узнает адрес ячейки, объем передаваемых данных и направление обмена от МП.
Рассмотрим конкретный КПДП КР580ВТ57
КПДП КР580ВТ57.
Структурная схема контроллера КР580ВТ57 приведена на рисунке ниже, где приняты следующие обозначения:
ЗПДП0..ЗПДП3 – запросы внешних устройств;
ППДП0..ППДП3 – подтверждение прямого доступа для внешних устройств;
ЗЗх – запрос захвата магистрали;
ПЗх - подтверждение захвата микропроцессором;
ГТ - готовность устройства;
ТИ – тактовые импульсы;
Сбр – начальная установка контроллера;
ВК – выбор микросхемы;
А3..А0 – двунаправленная адресная шина для адресации внутренних регистров контроллера (входы) или выдачи младших четырех разрядов адреса памяти (выходы);
А7..А4 – разряды адреса памяти;
Стр А – строб адреса, используется для загрузки выдаваемого контроллером старшего байта адреса памяти во внешний регистр-защелку;
РА – разрешение адреса используется для блокировки во время режима ПДП всех устройств МП-системы, не имеющих прямого доступа к памяти;
ЗпП, ЧтП – выходные линии записи и чтения памяти;
ЗпВВ,ЧтВВ – двунаправленные линии, являющие с одной стороны входами при программировании контроллера и чтения его внутренних регистров, а с другой стороны выходами при обмене ПДП;
КС – конец счета;
М128 – при передаче блоками каждые 128 байт сопровождаются импульсом.
Двунаправленный 8-разрядный буфер данных, сопрягающий КПДП с ШД системы, предназначен для приема управляющего слова, выдачи старшего байта адреса ОЗУ, содержимого счетчика адресов и счетчика циклов и слова состояния контроллера.
Блок управления обеспечивает синхронизацию отдельных узлов КПДП при его программировании, чтении его состояния и собственно обмена.
При программировании блок управления адресует управляющие слова в регистр режима, счетчики адресов и циклов каждого канала и обеспечивает их запись по сигналу на входе . Блок также обеспечивает чтение счетчиков и регистра состояния по входному сигналу . Реализуемые блоком операции чтения и записи приведены в таблице ниже.
Операции чтения и записи, реализуемые блоком управления.
Операции
|
Сигнал
|
|
|
|
А3
|
Запись управляющих слов в счетчики каналов
|
0
|
0
|
1
|
0
|
Запись управляющего слова в регистр режима
|
0
|
0
|
1
|
1
|
Чтение содержимого счетчика каналов
|
0
|
1
|
0
|
0
|
Чтение регистра состояния
|
0
|
1
|
0
|
1
|
В режиме обмена блок вырабатывает текущий адрес ячейки ОЗУ и с учетом готовности ПУ формирует управляющие сигналы для ОЗУ и ПУ (, , , ), обеспечивающие запись данных в ОЗУ или ПУ. Блок также управляет окончанием передачи информации по исчерпании запрограммированного количества циклов или снятия запроса.
Каналы 0…3 содержат по два 16-разрядных счетчика:
- счетчик адресов;
- счетчик циклов.
Счетчик адресов задает текущий адрес ячейки памяти, с которой выполняется обмен. Содержимое 14-ти младших разрядов счетчика циклов, уменьшенное на 1, определяет количество циклов ПДП, а два старших его бита А14 и А15
отведены для задания режима обмена. (А14=1 – запись, А15=1 – чтение). Каждый канал включает в себя схему приема запроса на прямой доступ, которая в соответствии с разрешением блока приоритетов генерирует сигнал подтверждения ПДП. Блок приоритетов обеспечивает очередность обслуживания одновременных запросов со стороны нескольких ПУ либо по жесткому приоритету, либо по назначенному приоритету с учетом номера обслуживаемого канала.
Контроллер КР580ВТ57 может быть запрограммирован с помощью МП для работы в различных режимах. При этом МП адресуется к КПДП как к обычному модулю ввода-вывода.
Такой режим работы контроллера называется подчиненным режимом и служит для пересылки команд и адресов КПДП и для получения от него слова состояния (т.е. информации о состоянии контроллера). В основном режиме контроллер сначала запрашивает у МП системные шины с помощью сигнала 33х. После отключения МП от шин контроллер дает команду памяти записать данные с ШД (или выставить данные на ШД) и одновременно периферийному устройству выставить данные на ШД (или считать данные с ШД). Таким образом, информация передается между памятью и ПУ под управлением КПДП с помощью сигналов , , , .
При использовании КПДП требуется две различные конфигурации адресной шины: одна для подчиненного режима, другая – для основного. В подчиненном режиме (сигнал РА контроллера выключен) адрес формирует МП на ША А0…А15. В основном режиме (сигнал РА включен) старший байт адреса на линиях А8…А15 формирует контроллер со своих линий D0…D7, которые мультиплексно подключены к этим адресным линиям. Этот байт адреса фиксируется во внешнем буферном регистре управляющим сигналом СтрА. Младший байт адреса выдается на ША непосредственно линиями А0…А7 контроллера.
Программирование КПДП.
В начале работы на контроллер подается сигнал Сбр, который сбрасывает регистр режима. Это приводит к запрещению использования всех каналов ПДП и предотвращает конфликты на шинах МП-системы при включении питания. Затем загружаются счетчики каналов контроллера исходной информацией. Загрузка (инициализация) выполняется программным способом путем засылки информации в КПДП.
Адресации внутренних регистров КПДП
Регистр
|
Линии адреса
|
Регистр
|
Линии адреса
|
А3
|
А2
|
А1
|
А0
|
А3
|
А2
|
А1
|
А0
|
Счетчик А0
|
0
|
0
|
0
|
0
|
Счетчик Ц2
|
0
|
1
|
0
|
1
|
Счетчик Ц0
|
0
|
0
|
0
|
1
|
Счетчик А3
|
0
|
1
|
1
|
0
|
Счетчик А1
|
0
|
0
|
1
|
0
|
Счетчик Ц3
|
0
|
1
|
1
|
1
|
Счетчик Ц1
|
0
|
0
|
1
|
1
|
Регистр режима
|
1
|
0
|
0
|
0
|
Счетчик А2
|
0
|
1
|
0
|
0
|
Регистр состояния
|
1
|
0
|
0
|
0
|
Так как адрес ячеек памяти является 16-разрядным числом, то в счетчики адресов и счетчики циклов загружают последовательно два байта, сначала младший байт, затем старший. Оба байта должны быть посланы один за другим. На это время должна быть заблокирована система прерываний, чтобы не допустить передачи посторонних данных.
В соответствии с выше указанными таблицами МП может прочитать текущее содержимое 16-разрядных счетчиков адресов и счетчиков циклов каждого из двух следующих одна за другой команд ввода, сначала младшего байта, а затем старшего байта. После того как счетчики каналов контроллера инициированы, осуществляется загрузка управляющего слова в регистр режима.
Формат слова режима КПДП.
Четыре младших бита D0…D3 определяют состояние соответствующих каналов ПДП. При Di=0 (i й канал запрещен) контроллер не реагирует на запрос ЗПДПi. При Di=1 (i й канал разрешен) контроллер реагирует на запрос ЗПДПi.
Бит D4=0 определяет фиксированный приоритет (канал 0 имеет наивысший, а канал 3 – самый низкий приоритет) или циклический приоритет при D4=1, когда приоритеты каналов меняются после передачи каждого байта.
В этом режиме после того, как канал обнаружен, каналу со следующим порядковым номером присваивается наивысший приоритет для передачи следующего байта. Затем присваиваются приоритеты остальным каналам в соответствии с возрастанием их номеров. При этом считается, что канал 0 по приоритету следует за каналом 3.
После установки бита D5 расширенный (удлиненный) записи несколько увеличивается продолжительность управляющих сигналов и контроллера. Это позволяет не вводить дополнительного состояния ожидания с помощью сигнала Гт.
Если установлен бит D6 (режим останова КС), то после формирования сигнала КС по окончании передачи ПДП соответствующий канал ПДП запрещается. Дальнейшие передачи в этом канале возможны только после повторной загрузки регистра режима контроллера. Если бит D6=0, то появление сигнала КС не влияет на состояние канала ПДП, и закончить операции ПДП должно ПУ.
Установленный бит D7 автозагрузки позволяет использовать канал 2 для повторных передач предыдущего блока данных или сцепленных блоков данных без программного вмешательства между передачами блоков. Для этого счетчики канала 2 инициализируются обычным образом, а в счетчики канала 3 загружаются параметры повторной инициализации канала 2. После завершения в канале 2 передачи первого блока данных параметры из счетчиков канала 3 загружаются в счетчики канала 2. При этом состояние бита D6 в регистре режима не влияет на работу канала 2. В режиме автозагрузки, во-первых, при программировании канала 2 его начальные параметры автоматически дублируются в счетчиках канала 3, что в дальнейшем и обеспечивает повторяющиеся передачи одного и того же блока данных. Во-вторых, адрес блока, длина блока и информация о режиме для следующей передачи блока по каналу 2 могут быть посланы в канал 3 во время работы канала 2.
Слово состояния контроллера
Слово состояния КПДП содержит четыре бита КС0…КС3. Эти биты указывают какие каналы сгенерировали сигнал КС после того, как слово состояния было прочитано в последний раз. Таким образом, биты состояния КС0…КС3 указывают, была ли завершена передача блока данных в течение этого промежутка времени.
Признак обновления D4 устанавливается, когда в режиме автозагрузки параметры канала 3 передаются в счетчики канала 2, т.е. обновляется содержимое счетчиков канала 2. Следовательно, чтобы предотвратить преждевременное обновление информации в канале 3, необходимо считать слово состояния и проверить признак обновления прежде, чем сделать попытку перезагрузить канал 3. Этот признак можно перевести в нулевое состояние сигналом Сбр или отменой режима автозагрузки. Кроме того, признак обновления автоматически сбрасывается после обновления содержимого счетчиков канала 2 и передачи первого блока данных.
1.3.10. Программируемый связной адаптер KP580BB51
Общие сведения
При всем удобстве параллельной передачи информации такой способ хорош лишь при передаче на небольшие расстояния.
Основная проблема при последовательной передачи информации заключается в обеспечении битовой и символьной синхронизации. Эту проблему можно решить с помощью асинхронной посылки.
. Асинхронная посылка начинается старт-битом низкого уровня, а заканчивается стоп-битом высокого уровня (см. рис. ниже). Перепадом с высокого уровня напряжения на низкое источник говорит, что будут передаваться данные. Приемник при этом запускает часы. О длительности интервалов Dt источник и приемник договариваются заранее. Отсчитав половину длительности предполагаемого старт-бита, приемник проверяет уровень входного сигнала. Если он остается низким, то приемник начинает принимать данные, поскольку вслед за старт-битом идут информационные биты. Об их количестве источник и приемник также договариваются заранее (от 5 до 8 информационных битов). Приемник на середине длительности очередного интервала Dt считывает уровень сигнала.
После информационных битов идет необязательный контрольный бит. Если запрограммировать использование этого бита, то приемник формирует такой же бит и сравнивает его с пришедшим контрольным битом. Если эти сигналы совпадают, значит, информация принята без искажений, если нет, то выставляется флаг "ошибка паритета".
В конце передачи всегда проверяется значение уровня стоп - бита. Он должен быть высоким, в противном случае выставляется ошибка "отсутствие стоп-бита".
Рассмотрим подробнее, как происходит обмен данными между источником и приемником.
Источник.
1) Из МП байт информации поступает в буфер передатчика.
2) К этому байту в регистре сдвига передатчика подсоединяются -
- старт - бит
- бит контроля
- стоп бит.
Теперь окончательно сформирована асинхронная посылка (см. рис. ниже).
3) Асинхронная посылка побитно выталкивается в линию передачи данных приемнику.
Приемник.
1) С входа приемника биты последовательно вталкиваются в сдвиговый регистр приемника (см. рис. ниже).
2) Из сдвигового регистра приемника информационная часть принятой асинхронной посылки копируется в буфер приемника, при этом устанавливаются флаги ошибок, если они произошли.
3) Если ошибок нет, МП вводит принятый байт из буфера.
Надо позаботиться о том, чтобы на временном интервале асинхронной посылки 10Dt ошибка рассогласования хода часов источника и приемника e не превышала значение 1/2Dt. Если e будет больше, то будет либо недополучен бит, либо получен лишний бит. Следовательно, относительная ошибка рассогласования часов источника и приемника не должна превышать 5%. Напомним, асинхронная посылка обеспечивает и побитовую и побайтовую синхронизацию.
Программируемый связной адаптер (ПСА) КР580ВВ51 представляет собой универсальный синхронно - асинхронный приемо - передатчик, который можно запрограммировать в режимы асинхронной и синхронной передачи.
Место КР580ВВ51 в МПС показано на рисунке ниже.
Передача по телефонной линии (или по другой информационной линии) осуществляется в том случае, если расстояние между модемами более 1 км. Если расстояние меньше, то связные адаптеры можно соединять напрямую.
Напомним, что если линия длинная, то в ней происходит затухание сигнала. Для борьбы с этим явлением используют модуляцию с помощью модема, который при передаче данных осуществляет модуляцию передаваемого сигнала, а при приеме модулированного сигнала производит обратную операцию – демодуляцию, т.е. выделение полезного сигнала.
Структурная схема ПСА КР580ВВ51 приведена на рисунке ниже.
Структурная схема ПСА КР580ВВ51
На рисунке приняты следующие обозначения.
Терминал
- одним из вариантов терминала может служить модем.
ГПд - сигнал, свидетельствующий о том, что буфер передатчика пуст и передатчик готов к приему новой порции данных из МП.
КПд-
сигнал, свидетельствующий о том, что передатчик закончил передачу.
СПд - синхронизация передатчика, управляет скоростью передачи символа. Скорость передачи стандартизована, она задается при инициализации ПСА. В синхронном режиме работы частота синхронизации равна скорости передачи и множитель кратности равен единице (1х), а в асинхронном режиме передачи частота синхронизации выше скорости передачи в целое число раз, т.е. кратна скорости. Значение множителя кратности определяется частью слова режима и может равняться (1х), (16х) или (64х).
ГПр - сигнал, свидетельствующий о том, что буфер приемника полон и приемник адаптера готов передавать полученный символ в МП.
СПр – синхронизация приемника, управляет скоростью приема символа. Скорость приема стандартизована, она задается при инициализации ПСА. В синхронном режиме работы частота синхронизации равна скорости передачи и множитель кратности равен единице (1х), а в асинхронном режиме передачи частота синхронизации выше скорости передачи в целое число раз, т.е. кратна скорости. Значение множителя кратности определяется частью слова режима и может равняться (1х), (16х) или (64х).
Вид синхронизации – синхронизация в синхронном режиме может быть внешней и внутренней.
ЗПдТ - запрос передатчика терминала. Может быть использован как запрос о готовности терминала к передаче данных в адаптер.
ГПдТ - готовность передатчика терминала. Этот сигнал можно трактовать как готовность модема к работе.
ЗПрТ - запрос приемника терминала. Может быть использован для запроса о готовности приемника терминала принять данные от адаптера.
ГПрТ - готовность приемника терминала. Сообщает о готовности приемника терминала принять данные от адаптера.
Программирование ПСА.
При программировании ПСА в него должен быть загружен набор управляющих слов. Управляющие слова подразделяются на два формата:
- слово режима (начальное управляющее слово)
- слово команды (текущее слово)
Слово режима определяет общие характеристики ПСА, поэтому оно обязательно должно следовать сразу же после операции сброса (внешней или внутренней).
После записи слова режима в адаптер можно вводить синхросимволы или слова команды.
Слово команды (текущее управляющее слово) управляет реальной работой ПСА в выбранном режиме. Слово команды может записываться в любой момент времени в процессе обработки блока данных. Для возвращения ПСА к формату слова режима в слове команды можно установить в логическую единицу специальный разряд, который имитирует внутреннюю операцию сброса, автоматически переводящую адаптер к формату слова режима. Таким образом, слова команды должны следовать после слова режима или после символов синхронизации для синхронного режима. Типовая структура блока данных приведена на рисунке ниже.
Формат слова режима.
D7
|
D6
|
D5
|
D4
|
D3
|
STRUC DATE
DAY DB 1 ; Поле ДЕНЬ - начально в 1
MONTH DB ? ; Поле МЕСЯЦ - значение неустановлено
YEAR DW 2004 ; Поле ГОД - начальное значение 2000
ENDS DATE ; "DATE" - здесь является необязательным
Этот тип в дальнейшем можно использовать.
Описание переменных в структурах.
Для использования структур нужно зарезервировать в памяти пространство под их поля. Результатом будет переменная, имеющая тип структуры. Каждое такое описание переменной начинается с метки, за которой следует имя структуры (DATE) и заканчивается списком начальных значений в угловых скобках < >. Чтобы использовать начальные значения, определенные ранее при описании структуры, скобки нужно оставить пустыми.
Пример.
TEXT1 ENDS
DATAY SEGMENT 'DATA'
.
.
.
| |