Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Финогенов-основы_языка_ассемблера.doc
Скачиваний:
26
Добавлен:
17.09.2019
Размер:
3.35 Mб
Скачать

Операнд

Рис. ПИ. Действие команды shr.

Система команд процессоров Intel

275

В качестве операнда можно указывать любой регистр (кроме сегмент­ного) или ячейку памяти размером как в байт, так и в слово. Не допуска­ется использовать в качестве операнда непосредственное значение. Ко­манда воздействует на флаги CF, OF, PF, SF и ZF.

Пример 1

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-битовое поле памяти, указанные в качестве операнда.

Система команд процессоров Intel 277

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.