- •Тема 4 Программная модель микропроцессоров архитектуры ia-32
- •1. Особенности архитектуры ia-32
- •2. Структура микропроцессоров ia-32
- •3. Регистры
- •4. Формат команды микропроцессора ia-32
- •5. Типы данных
- •6. Пространство памяти
- •7. Режимы адресации
- •8. Система команд
- •8.1. Инструкции пересылки данных
- •8.2. Инструкции двоичной арифметики
- •8.3. Инструкции десятичной арифметики
- •8.4. Инструкции логических операций
- •8.5. Инструкции сдвигов
- •8.6. Инструкции обработки бит и байт
- •8.7. Инструкции передачи управления
- •8.8. Инструкции строковых операций
- •8.9. Инструкции работы с флагами
- •8.10. Инструкции загрузки указателей
- •8.11. Разные инструкции
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