
- •Системное программное обеспечение
- •Расширение системы команд в процессоре 80286
- •Расширение системы команд в процессоре 80286
- •Расширение системы команд в процессоре 80286
- •Расширение системы команд в процессоре 80286
- •Расширение системы команд в процессоре 80286
- •Расширение системы команд в процессоре 80286
- •Расширение системы команд в процессоре 80286
- •Расширение системы команд в процессоре 80286
- •Расширение системы команд в процессоре 80286
- •Расширение системы команд в процессоре 80286
- •Расширение системы команд в процессоре 80286
- •Расширение системы команд в процессоре 80286
- •Расширение системы команд в процессоре 80286
- •Расширение системы команд в процессоре 80386
- •Расширение системы команд в процессоре 80386
- •Расширение системы команд в процессоре 80386
- •Расширение системы команд в процессоре 80386
- •Расширение системы команд в процессоре 80386
- •Расширение системы команд в процессоре 80386
- •Расширение системы команд в процессоре 80386
- •Расширение системы команд в процессоре 80386
- •Расширение системы команд в процессоре 80386
- •Расширение системы команд в процессоре 80386
- •Расширение системы команд в процессоре 80386
- •Расширение системы команд в процессоре 80386
- •Расширение системы команд в процессоре 80386
- •Расширение системы команд в процессоре 80386
- •Расширение системы команд в процессоре 80386
- •Расширение системы команд в процессоре 80386

Системное программное обеспечение
Лекция № 6 «Расширение системы команд в процессорах 80286 и 80386»

Расширение системы команд в процессоре 80286
В систему команд процессора 80286 был введен ряд специальных команд, которые можно разбить на следующие группы:
1. Команды для использования компиляторами языков высокого уровня, хотя, безусловно, их можно применять в чисто ассемблерном коде.
bound regW, memDW
Команда bound проверяет, находится ли индекс в заданном диапазоне — и иногда называется проверкой диапазона в языках высокого уровня. Поскольку большинство таких языков выполняет вызов специальных подпрограмм для проверки индексов массивов, использование bound может увеличить скорость программы, сохраняя безопасность проверки диапазонов, которую многие программисты запрещают для увеличения скорости.

Расширение системы команд в процессоре 80286
Команда bound требует два операнда. Первый из операндов должен быть 16-битовым регистром и должен содержать проверяемое индексное значение. Второй операнд - это адрес 32- битового двойного слова в памяти, содержащего младшее и старшее значение диапазона индекса. Если величина первого операнда не входит в установленный диапазон, процессор осуществляет прерывание 5. В программе необходимо установить соответствующую процедуру перехвата и обслуживания этого прерывания.
Прерывание 5 в BIOS – это печать экрана, что приводит к конфликту: если при проверке индекса он оказывается за пределами диапазона, а клавиша <PrtScr> не запрещена, то возникновение ошибки приведет к печати содержимого экрана и будет происходить

Расширение системы команд в процессоре 80286
Эта команда не меняет флаги.
; в сегменте данных |
|
|
||
BoundMas |
|
label |
word |
|
Low_Bound |
dw |
0 |
|
|
Upp_Bound |
dw |
20 |
|
|
mas |
dw |
10 dup (?) |
|
|
; в сегменте кода |
|
|
||
|
xor |
di,di |
;очистка индексного регистра |
|
cycl: |
|
|
|
|
|
mov |
ax,mas[di] |
;перебор элементов массива |
|
|
add |
di,2 |
|
|
|
bound |
di,BoundMas |
|
;если значение в di не будет попадать в границы, то будет вызван
;обработчик прерывания 5, где можно скорректировать
;значение ip в стеке с тем, чтобы выйти
;из бесконечного цикла, например, на метку М2 или
;выполнить другие действия
jmp cycl
М2:

Расширение системы команд в процессоре 80286
enter n, level
Команда предназначена для выделения соответствующего пространства в стеке для локальных переменных процедуры.
Такие переменные динамические — они существуют только во время работы подпрограммы. Эти методы обычно применяются в языках высокого уровня как составная часть их методов использования функций и процедур, но при желании их можно применять и в чисто ассемблерном коде.
Команда enter обычно первая строка процедуры. enter требует двух операндов, каждый из которых должен быть числом. Первый операнд представляет собой число байтов, которые необходимо зарезервировать в стеке. Второй операнд представляет собой уровень вложения процедуры.

Расширение системы команд в процессоре 80286
Если 3 процедуры включаются одна в другую, самая внутренняя находится на уровне 2, средняя — на уровне 1, а внешняя
— на уровне 0. Уровни вложения нужны для поддержки таких языков, как Паскаль, который позволяет дочерним процедурам получать доступ к локальным переменным, описанным в родительских процедурах. Команда enter аналогична трем командам процессора 8086:
push bр |
; |
Сохранить текущее значение |
bр |
|
mov |
bp,sp ; |
Записать указатель стека в |
bр |
Вначале bр засылается в стек для сохранения его исходной величины.
sub sp,n ; Выделить стековое пространство для переменных
Затем в bр устанавливается значение указателя стека sp, что позволит командам использовать регистр для адресации локальных переменных. Затем выделяется место под переменные путем вычитания первого параметра команды enter из указателя стека.

Расширение системы команд в процессоре 80286
В любой процедуре, использующей enter, перед выходом из процедуры командой ret необходимо выполнить команду
leave
для освобождения стекового пространства, выделенного enter, и для восстановления sp и bр. Команда leave выполняет те же действия, что и две команды процессора 8086:
mov |
sp,bp |
; |
Восстановить |
указатель стека из bр |
pop |
bр |
; |
Восстановить |
значение bр |
Копирование bр в sp освобождает пространство, занятое в стеке перед восстановлением величины bр, которая могла использоваться другими процедурами для адресации их собственных локальных переменных. В качестве примера полной процедуры, использующий enter и leave, можно привести подпрограмму:

Расширение системы команд в процессоре 80286
proc1 proc
;зарезервировать в стеке место для локальных переменных ;proc1 16 байт
;лексический уровень вложенности 0 enter 16,0
...
leave ret
proc1 endp
Эти команды не меняют флаги.
2. Новые команды для работы со стеком. Команда
pusha
сохраняет регистры ах, cx, dx, bx, sp, bp, si и di в стеке в перечисленном порядке. Обратите внимание, что указатель стека также сохраняется. Но величина sp, копируемая в стек, соответствует значению sp перед выполнением pusha.

Расширение системы команд в процессоре 80286
Команда
рора
удаляет все регистры основного назначения из стека. Выполнение рора (обычно после предшествующей pusha) извлекает регистры di, si, bp, sp, bx, dx, cx и ax в соответствующем порядке. Все регистры общего назначения восстанавливают значения, которые они имели перед выполнением предыдущей команды pusha. Сегментные регистры не сохраняются и не восстанавливаются командами pusha
и рора.
Обычно это необходимо в начале и конце процедур обслуживания прерываний, хотя можно использовать эти команды и в простых процедурах.
Эти команды не меняют флаги.

Расширение системы команд в процессоре 80286
3. Команды ввода-вывода строк в порты Синтаксис команд аналогичен описанию примитивов команд
обработки строк. ins dest, port
Команда вводит данные из порта ввода-вывода, номер которого загружен в регистр dx, в память по адресу es:[di]. Сегментная составляющая адреса должна быть обязательно в регистре es. Замена сегментного регистра недопустима. Непосредственное задание порта в команде также недопустимо - для этого используется регистр dx. Размеры вводимых элементов (байт или слова) зависят от способа описания приемника в программе на Ассемблере. Транслятор, обработав команду ins и выяснив тип операнда, генерирует одну из машинных команд: