- •140010, Г. Люберцы, Московской обл., Октябрьский пр-т, 403.
- •Глава 1. Архитектура реального режима
- •1.1. Память и процессор
- •Глава 1
- •Глава 1
- •1.2. Распределение адресного пространства
- •Глава 1
- •1.3. Регистры процессора
- •Глава 1
- •Глава 1
- •9 7H Шестнадцатернчное обозначение числа
- •Глава 1
- •1.4. Сегментная структура программ
- •Глава 1
- •Глава 1
- •Глава 1
- •1.5. Стек
- •Глава 1
- •1.6. Система прерываний
- •Глава 1
- •Глава I
- •1.7. Система ввода-вывода
- •Глава I
- •Глава 1
- •Глава 2. Основы программирования
- •2.1. Подготовка и отладка программы
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •2.2. Представление данных
- •Глава 2
- •Глава 2
- •2.3. Описание данных
- •Глава 2
- •Глава 2
- •2.4. Структуры и записи
- •Глава 2
- •Глава 2
- •2.5. Способы адресации
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •2.7. Вызовы подпрограмм
- •Глава 2
- •2.8. Макросредства ассемблера
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 3. Команды и алгоритмы
- •Глава 3
- •Глава 3
- •Глава 3
- •Глава 3
- •Глава 3
- •Глава 3
- •Глава 3
- •Глава 3
- •3.2. Циклы и условные переходы
- •Глава 3
- •Глава 3
- •3.3. Обработка строк
- •Глава 3
- •3.4. Использование подпрограмм
- •Глава 3
- •Глава 3
- •3.5. Двоично-десятичные числа
- •Глава 3
- •Глава 3
- •3.6. Программирование аппаратных средств
- •Глава 3
- •37Ah Порт управлсш!я
- •Глава 3
- •Глава 3
- •Глава 4. Расширенные возможности
- •4.1. Архитектурные особенности
- •Глава 4
- •4.2. Дополнительные режимы адресации
- •Глава 4
- •4.3. Использование средств 32-разрядных процессоров в программировании
- •Глава 4
- •Глава 4
- •Глава 4
- •4.4. Основы защищенного режима
- •Глава 4
- •Глава 4
- •Глава 4
- •Глава 4
- •Idiv Деление целых чисел со знаком
- •Imul Умножение целых чисел со знаком
- •In Ввод из порта
- •Inc Инкремент (увеличение на 1)
- •Int Программное прерывание
- •Into Прерывание по переполнению
- •Iret Возврат из прерывания
- •1 Lods Загрузка операнда из строки : lodsb Загрузка байта из строки lodsw Загрузка слова из строки
- •Операнд
- •Xadd память, регистр
- •Xchg Обмен данными между операндами
- •Xlat Табличная трансляция
- •Xor Логическое исключающее или
- •Содержание
Операнд
Рис. ПИ. Действие команды shr.
Система команд процессоров Intel
275
В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда воздействует на флаги CF, OF, PF, SF и ZF.
mov AL,7
;AL=3, CF=1
shr AL,1
Пример 1
mov AX,lFFOh
;AX=01FFh, CF=0
mov CL,4
shr AX,CL
Пример 3
mov DX,9513h
mov CL,8
;DX=0095h, CF=0
386+ Допустим сдвиг 32-битовых операндов. Допустимо указание чис ла бит сдвига как с помощью регистра CL, так и непосредственным зна чением. Максимальная величина сдвига составляет 31 бит.
shr DX,CL
Пример 1
mov ESI,OFFFF0009h
;ESI=OOFFFFOOh, CF=0
shr ESI, 8
Пример 2
;B полях данных mem dd llllllllh ;В программном сегменте shr mem, 12
;mem=00011111h, CF=0
386+ SHRD Логический сдвиг вправо с двойной точностью
Трехоперандная команда shrd с операндами opl, ор2 и орЗ осуществляет сдвиг вправо первого из своих операндов opl. Число битов сдвига определяется третьим операндом орЗ. По мере сдвига операнда opl вправо выдвигаемые из него младшие биты, пройдя через флаг CF, теряются, а на освобождающиеся места со стороны его старших битов поступают младшие биты второго операнда ор2, как если бы он вдвигался своим правым (младшим) концом в opl. Однако после завершения сдвига значение операнда ор2 не изменяется (рис. П12). Во флаге CF остается последний выдвинутый из операнда opl бит. Максимальное число битов сдвига составляет 31.
В качестве первого операнда opl можно указывать 16- или 32-разрядный регистр общего назначения или 16- или 32-битовую ячейку памяти. Вторым операндом ор2 может служить только 16- или 32-разрядный ре-
276
Приложение
ор2 |
~* |
ор! |
~* |
CF |
Остается неизменным |
В процессе сдвига изменяется |
|
Рис. П12. Действие команды shrd.
гистр общего назначения. Третий операнд, характеризующий число битов сдвига, может находиться в регистре CL или быть непосредственным значением.
Команда воздействует на флаги OF, SF, ZF, PF и CF.
Пример 1
mov AX.OCOOlh
mov BX,900Eh
;AX=6000h, BX=900Eh, CF=1
shrd АХ.ВХД
Пример 2
mov AX.OCOOlh
mov BX,900Eh
;AX=BOOOh, BX=900Eh, CF=0
shrd AX,BX,2
Пример 3
mov AX,OC001h
mov BX,900Eh
;AX=D800h, BX=900Eh, CF=0
shrd AX,BX,3
Пример 4
mov EBX,OFFC8000h
mov ESI,12345678h
mov CL,16
shrd EBX,ESI,CL ;EBX=5678FFC8h,
;ESI=12345678h, CF=0
386P+ SIDT Сохранение в памяти содержимого регистра таблицы дескрипторов прерываний
Команда копирует содержимое регистра таблицы дескрипторов прерываний IDTR (линейный базовый адрес таблицы и ее границу) в поле из 6 байт, указанное в качестве операнда.
386Р+ SLDT Сохранение содержимого регистра таблицы локальных дескрипторов
Команда копирует содержимое регистра таблицы локальных дескрипторов LDTR (селектор таблицы) в 16- или 32-разрядный регистр или в 16- или 32-битовое поле памяти, указанные в качестве операнда.
386Р+ SMSW Сохранение слова состояния машины
Команда smsw считывает слово состояния машины (так называется младшая половина управляющего регистра процессора CRO) и загружает его в указанный в команде 16-разрядный регистр общего назначения или 16-битовое поле памяти.
Команду smsw можно использовать для перевода процессора из реального в защищенный режим или наоборот. В первом случае после чтения слова состояния командой smsw надо установить в нем бит 0 (бит РЕ) и загрузить назад в CRO командой Inisw. Во втором случае после после чтения слова состояния командой snisw надо сбросить в нем бит 0 и загрузить назад в CRO командой Imsw.
STC Установка флага переноса
Команда stc устанавливает флаг переноса CF в регистре флагов. Команда не имеет параметров и не воздействует на остатьные флаги процессора.
Пример
stc ;Флаг CF устанавливается
STD Установка флага направления
Команда STD устанавливает флаг направления DF в регистре флагов, , определяя тем самым обратное направление выполнения строковых операций (в порядке убывания адресов элементов строки). Команда не имеет параметров и не воздействует на остальные флаги процессора.
Пример
std ;Флаг направления устанавливается
STI Установка флага прерывания
Команда STI устанавливает флаг разрешения прерываний IF в регистре флагов, разрешая все аппаратные прерывания (от таймера, клавиатуры, дисков и т.д.). Команда не имеет параметров и .не воздействует на остальные флаги процессора.
Пример
sti разрешение аппаратных прерываний
STOS Запись в строку данных STOSB Запись байта в строку данных STOSW Запись слова в строку данных
Команды предназначены для операций над строками (строкой называется последовательность байтов или слов памяти с любым содержимым). Они копируют содержимое регистра AL (в случае операций над байтами) или АХ (в случае операций над словами) в ячейку памяти соответствующего размера по адресу, определяемому содержимым пары регистров ES:DI. После операции копирования регистр DI получает положительное (если флаг DF=0) или отрицательное (если флаг DF=1) приращение.
278
Приложение
Величина приращения составляет 1 или 2 в зависимости от размера копируемого элемента..
Вариант команды stos имеет формат
stos строка
(что не избавляет от необходимости инициализировать регистры ES:DI адресом строки строка). Заменить сегментный регистр ES нельзя. .
Рассматриваемые команды могут предваряться префиксом повторения rep. В этом случае они повторяются СХ раз, заполняя последовательные ячейки памяти одним и тем же содержимым регистра AL или АХ. Команда не воздействует на флаги процессора.
Пример 1
;В полях данных сегмента данных, адресуемого через ES;
id db 'ID: '
;В программном сегменте:
eld
mov DI,offset id+3
mov AL,'3*
stosb
mov AL,'9'
stosb
;Движение по строке вперед ;DI ' за знаком ':' ;Код ASCII цифры 3 ;Отправим в строку ;Код ASCII цифры 9 ;Отправим в строку
;Теперь в строке id записано 'Ш:39'
Пример 2
;В полях данных сегмента данных, адресуемого через ES;
array dw 10000 dup (') ;Место под массив слов
;В программном сегменте:
mov AX,-1 {Число-заполнитель
mov СХ, 10000 ;3аполнить 10000 слов
eld Движение по строке вперед
lea DI,array ;ES:DI -> array
rep stosw ;Bce 10000 элементов массива
;получают значение -1 (FFFFli)
Пример 3
;В полях данных сегмента данных, адресуемого через ES:
line db 80 dup (' ') ;В программном сегменте: mov AL,'>' СХ,5
;Пустая пока строка
mov
eld lea stos
Dl.line line
;Код ASCII знака '>' {Заполнить 5 слов {Движение по строке вперед ;ES:DI -> line
rep
{Первые 5 байт строки line {заполняются кодом ASCII {знака '>'
J
Система команд процессоров Intel_
279
Пример 4
;В полях данных сегмента данных, адресуемого через ES:
line dw 80 dup (0) ;В программном сегменте: mov AL,'>'
АН,ЗШ
СХ,5
;Строка, заполненная нулями
;Код ASCII знака '>'
mov
mov
eld
lea
stos
;Атрибут (синий по бюрюзовому)
;3аполнить 5 слов
Движение по строке вперед
DI,line line
;ES:DI -» line
rep
;Первые 5 слов строки line
;заполняются кодом ASCII
;знака 'Хвместе с атрибутом
;для последующего вывода на ;экран
386+ STOSD Запись двойного слова в строку данных
Команда аналогична командам МП 86 stosb и stosw, но позволяет записать в строку, адресуемую через регистры ES:EDI, двойное слово из регистра ЕАХ.
Пример
;В полях данных
dat dd 12789,2,550000,100000 ;В программном сегменте mov EAX.444777
push pop mov add
DS
ES=DS
ES
Dl.oflset dat
DI,4*2
;DS:SI ;чисел ;dat= 12789,2,444777,100000
stosd
3-й элемент массива
386P+ STR
Сохранение содержимого регистра состояния задачи
Команда str копирует содержимое регистра задачи TR (селектор сегмента состояния задачи) в двухбайтовый регистр общего назначения или 16-битовую ячейку памяти, указанные в качестве операнда.
SUB Вычитание целых чисел
Команда sub вычитает второй операнд (источник) из первого (приемника) и помещает результат на место первого операнда. Исходное значение первого операнда (уменьшаемое) теряется. Таким образом, если команду вычитания записать в общем виде
sub операнд_1, операнд_2
то ее действие можно условно изобразить следующим образом: операнд_1 — операнд_2 -> операнд__1
280 Приложение
В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго — регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команда воздействует на флаги OF, SF, ZF, AF, PF и CF,
Пример 1
mov AX, 100
mov BX,60
sub АХ,ВХ ;АХ=40 (АХ-ВХ), ВХ=60
Пример 2
mov DL/8' mov DH;0'
sub DL,DH ;DL=8 (преобразование кода
;ASCII в цифру
Пример 3
;;В полях данных
datl dw -168
dat2 dw 10
;;B программном сегменте
mov AX,data2
sub mem,AX ;mem = -178
386+ Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.
Пример
mov EAX, 1000000
mov ЕВХ,60000
sub EAX,EBX ;ЕАХ=40000
TEST Логическое сравнение
Команда test выполняет операцию логического умножения И над двумя операндами и, в зависимости от результата, устанавливает флаги SF, ZF и PF. Флаги OF и CF сбрасываются, a AF имеет неопределенное значение. Состояние флагов можно затем проанализировать командами условных переходов. Команда test не изменяет ни один из операндов.
В качестве первого операнда команды test можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго — регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака.
Система команд процессоров Intel
281
Правила побитового умножения:
Первый операнд-бит 0101
Второй операнд-бит 0011
Бит результата 0001
Флаг SF устанавливается в 1, если в результате выполнения команды образовалось число с установленным знаковым битом.
Флаг ZF устанавливается в 1, если в результате выполнения команды образовалось число, состоящее из одних двоичных нулей.
Флаг PF устанавливается в 1, если в результате выполнения команды образовалось число с четным количеством двоичных единиц в его битах.
Пример 1
test jne
АХ,1 bit yes bitno
;Переход, если бит 0 в АХ установлен ; Переход, если бит 0 в АХ сброшен
Пример 2
test SI,8
jne bityes
jc bitno
;Переход, если бит 3 в SI устаношген ;Переход, если бит 0 в АХ сброшен
Пример 3 |
|
test |
DX,OFFFFh |
jz |
null |
jnz |
smth |
Пример 4 |
|
test |
CX,OFOOOh |
jne |
bitsyes |
je bitsno
Пример 5
, test AX,AX
jz zero
jnz notzero
; Переход, если DX=0 ;Переход, если DX не О
;Переход, если какие-либо из ;4 старших битов СХ установлены ;Переход, если все 4 старших бита ;СХ сброшены
; Переход, если АХ=0 ;Переход, если АХ не О
386+ Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.
Пример
test
jz
jnz
EAX.SOOOOOOOh
Ь31
nob31
;Переход, если бит 31 ЕАХ равен О ; Переход, если бит 31 ЕАХ равен 1
282 Приложение
386Р+ VERR Проверка сегмента на чтение
Команда verr позволяет определить, разрешено ли чтение из сегмента, за которым закреплен селектор, передаваемый команде в качестве ее операнда. Операндом может служить 16-разрядный регистр общего назначения или 16-битовая ячейка памяти. .
386Р+ VERW Проверка сегмента на запись
Команда verw позволяет определить, разрешена ли запись в сегмент, за которым закреплен селектор, передаваемый команде в качестве ее операнда. Операндом может служить 16-разрядный регистр общего назначения или 16-битовая ячейка памяти.
486+ XADD Обмен и сложение
Команда xadd выполняет в одной операции сложение и обмен операндов. Команда требует двух операндов, причем первый операнд должен быть ячейкой памяти, а второй — регистром. После сложения операндов исходное содержимое памяти переносится во второй операнд (регистр), а полученная сумма записывается в память (на место первого слагаемого) (рис. П13). Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.