Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
chast_7.doc
Скачиваний:
2
Добавлен:
16.04.2019
Размер:
100.86 Кб
Скачать

[Править]Команда lea

lea — мнемоническое от англ. Load Effective Address. Синтаксис:

lea источник, назначение

Команда lea помещает адрес источника в назначениеИсточник должен находиться в памяти (не может быть непосредственным значением — константой или регистром). Например:

.data

some_var:

.long 0x00000072

.text

leal 0x32, %eax /* аналогично movl $0x32, %eax */

leal some_var, %eax /* аналогично movl $some_var, %eax */

leal $0x32, %eax /* вызовет ошибку при компиляции,

так как $0x32 - непосредственное

значение */

leal $some_var, %eax /* аналогично, ошибка компиляции:

$some_var - это непосредственное

значение, адрес */

leal 4(%esp), %eax /* поместить в %eax адрес предыдущего

элемента в стеке;

фактически, %eax = %esp + 4 */

7.1. Смр Сравнение

Сами операнды не изменяются. Таким образом, если команду сравнения записать в общем виде

стр операнд_1, операнд_2

то ее действие можно условно изобразить следующим образом:

операнд_1 - операнд_2 -> флаги процессора

В качестве первого операнда команды сmр можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно, как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Обычно вслед за командой сmр стоит одна из команд условных переходов, анализирующих состояние флагов процесс сора. При сравнении чисел без знака необходимо использовать команды условных переходов, предназначенные для анализа чисел без знака (ja, jb и проч.). При сравнении чисел со знаком необходимо использовать команды условных переходов, предназначенные для анализа чисел со знаком (jl, jg и проч.).

Пример 1

cmp АХ,10000 ;АХ-10000

je eqlOOOO ;Переход на метку eql0000,

;если АХ=10000

Пример 2

;В полях данных: base dw 8002h ;В программном сегменте: cmp DX,base DX-base jb below ;Переход на метку below,  ;если DX, рассматриваемое  ;как число без знака, меньше  ;числа без знака 8002h=32770

Пример 3

;В полях данных: base dw 8002h ;В программном сегменте: cmp DX,base DX-base jl less ;Переход на метку less, если  ;DX, рассматриваемое как  ;число со знаком, меньше  ;числа со знаком 8002h=-32766 

 Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.

Пример

cmp EAX,8000000 Oh

ja above ;Переход, если

;EAX=80000001h...FFFFFFFFh

 

Cmps Сравнение строк

 CMPSB Сравнение строк по байтам

 CMPSW Сравнение строк по словам

Команды предназначены для операций над строками (строкой называется последовательность байтов или слов памяти с любым содержимым). Они сравнивают по одному элементу каждой строки, фактически осуществляя вычитание второго операнда из первого и устанавливая в соответствии с результатом вычитания флаги CF, PF, AF, ZF, SF и OF. Команда cmpsb выполняет сравнение по байтам, команда cmpsw - по словам, а команда cmps может быть использована для сравнения как байтов, так и слов. В последнем случае размер сравниваемых элементов определяется их описанием (с помощью директив db или dw). Первый операнд адресуется через DS:SI, второй - через ES:DI. Таким образом, операцию сравнения можно условно изобразить следующим образом:

(DS:SI) - (ES:DI) -> флаги процессора

После каждой операции сравнения регистры SI и DI получают положительное (если флаг DF=0) или отрицательное (если флаг DF=1) приращение. Величина приращения составляет 1 или 2 в зависимости от размера сравниваемых элементов (байт или слово). Вариант команды cmps имеет формат

cmps строка_1, строка_2

(что не избавляет от необходимости инициализировать регистры DS:SI и ES:DI адресами строк строка_1 и строка_2 соответственно). В этом формате возможна замена сегмента первой строки:

cmps ES:строка_ 1, строка_2

Рассматриваемые команды могут предваряться префиксами повторения repe/repz (повторять, пока элементы равны, т.е. до первого неравенства) и repne/repiiz (повторять, пока элементы не равны, т.е. до первого равенства). В любом случае выполняется не более СХ операций над последовательными элементами. После выполнения рассматриваемых команд регистры SI и DI указывают на ячейки памяти, находящиеся за теми (если DF=0) или перед теми (если DF=1) элементами строк, на которых закончились операции сравнения.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]