Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект по МПиМК / Лекция 04.doc
Скачиваний:
161
Добавлен:
15.06.2014
Размер:
415.74 Кб
Скачать

8.8. Инструкции строковых операций

Строковые операции выполняются с операндами в памяти, адресуемыми регистрами DS:SI (DS:ESI) для источника и ES:DI (ES:EDI) для приемника. Операции могут использоваться с префиксами условного или безусловного повтора. После каждой пересылки или сравнения индексные регистры (SI, DI или оба) участвующих операндов автоматически инкрементируются или декрементируются на количество байт, участвующих в операции (1, 2 или 4). Направление модификации определяется флагом DF: DF=0 – инкремент, DF=1 – декремент. Инструкции данной группы приведены в таблице 8.9.

Таблица 8.9

Команда

Описание

CMPSB

Сравнение строк байт, адресуемых DS:(E)SI и ES:(E)DI с записью результата сравнения в регистр флагов

CMPSD

Сравнение строк двойных слов, адресуемых DS:(E)SI и ES:(E)DI с записью результата сравнения в регистр флагов (386+)

CMPSW

Сравнение строк слов, адресуемых DS:(E)SI и ES:(E)DI с записью результата сравнения в регистр флагов

INSB

Запись байта, введенного из порта, адресуемого регистром DX, в ES:(E)DI (286+)

INSD

Запись двойного слова, введенного из порта, адресуемого регистром DX, в ES:(E)DI (386+)

INSW

Запись слова, введенного из порта, адресуемого регистром DX, в ES:(E)DI (286+)

LODSB

Копирование байта из DS:(E)SI в AL

LODSD

Копирование двойного слова из DS:(E)SI в EAX (386+)

LODSW

Копирование слова из DS:(E)SI в AX

MOVSB

Копирование байта из DS:(E)SI в ES:(E)DI

MOVSD

Копирование двойного слова из DS:(E)SI в ES:(E)DI (386+)

MOVSW

Копирование слова из DS:(E)SI в ES:(E)DI

OUTSB

Вывод байта, считанного из DS:(E)SI в порт, адресуемый регистром DX (286+)

OUTSD

Вывод двойного слова, считанного из DS:(E)SI в порт, адресуемый регистром DX (386+)

OUTSW

Вывод слова, считанного из DS:(E)SI в порт, адресуемый регистром DX (286+)

SCASB

Сканирование строки байт – сравнение AL с байтом из строки DS:(E)SI с записью результата сравнения в регистр флагов

SCASD

Сканирование строки двойных слов – сравнение EAX с двойным словом из строки DS:(E)SI с записью результата сравнения в регистр флагов

SCASW

Сканирование строки слов – сравнение AX со словом из строки DS:(E)SI с записью результата сравнения в регистр флагов

STOSB

Запись байта из AL в ES:(E)DI

STOSD

Запись двойного слова из EAX в ES:(E)DI

STOSW

Запись слова из AX в ES:(E)DI

REP

Префикс повтора строковых операций до обнуления (E)CX, (E)CX декрементируется на каждом повторе

REPE/REPZ

Префикс условного повтора строковых операций пока ZF = 1

REPNE/REPNZ

Префикс условного повтора строковых операций пока ZF = 0

Приведенный ниже пример демонстрирует использование строковых команд.

; пример 5

CSEG SEGMENT

ASSUME cs:CSEG, ds:CSEG, es:CSEG

ORG 100h

Start:

jmp PrStart

String1 DB 'Здравствуй, ',0

String2 DB 'мир!!!',0dh,0ah,'$',0

String3 DB 40 DUP('$')

PrStart:

mov di,OFFSET String3

mov si,OFFSET String1

call _Strcpy ; копирование одной строки во вторую

mov si,OFFSET String2

call _Strcat ; сцепление одной строки со второй

mov dx,di

mov ah,9

int 21h ; печать результирующей строки

int 20h

;Подпрограмма добавляет копию второй строки к первой

;

;Вход:

; ES:DI = указатель первой строки–приемника

; DS:SI = указатель второй строки–источника

_Strcat PROC

cld

push di

push si

mov cx,0ffffh

mov al,0

repne scasb ; переход на последний символ первой строки

dec di

call _Strcpy

pop si

pop di

ret

_Strcat ENDP

;Процедура копирует одну строку во вторую

;

;Вход:

; ES:DI = указатель первой строки–приемника

; DS:SI = указатель второй строки–источника

_Strcpy PROC

push di

push si

cld

StringLp:

lodsb

stosb ; копирование символов через AL

cmp al,0

jne StringLp

pop si

pop di

ret

_Strcpy ENDP

CSEG ENDS

END Start

Соседние файлы в папке Конспект по МПиМК