Сканирование строки (SCASB/SCASW/SCAS) — КиберПедия 

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

Сканирование строки (SCASB/SCASW/SCAS)

2022-10-05 27
Сканирование строки (SCASB/SCASW/SCAS) 0.00 из 5.00 0 оценок
Заказать работу

Действия:

· сравнивает байт или слово, адресованные регистрами ES:DI с содержимым регистров AL или AX соответственно; если перед командой не стоит префикс repxx, то завершает работу. В противном случае

· увеличивает или уменьшает на 1 (на 2 для слова) в зависимости от флага направления адрес в регистре DI;

· уменьшает содержимое регистра CX на 1;

· если содержимое регистра CX не равно нулю и выполнилось условие, определяемое префиксом repxx, повторяет действия с первого шага. В противном случае выполняется очередная команда.

Форматы команд.

  Код Операнд
<метка>: [rep ]scasb  
<метка>: [rep ]scasw  
<метка>: [rep ]scas m

 

Флаги. Команды воздействуют на флаги A, C, O, P, S, Z.

Замечание 6.1 также справедливо для команды scas.

Использование строковых команд.

                   page 60,132
;--------------------------------------------------------------------
stacksg segment para stack 'Stack'
     dw          32 dup(?)
stacksg ends
;--------------------------------------------------------------------
datasg segment para 'Data'
name1 db          'Assemblers'
name2 db          10 dup(' ')
name3 db          10 dup(' ')
datasg ends
;--------------------------------------------------------------------
codesg segment para 'Code'
begin proc far
              assume  CS:codesg,DS:datasg,
              SS:stacksg,ES:datasg
     push DS
     sub AX,AX
     push AX
     mov AX,datasg
     mov DS,AX
     mov ES,AX
     call c10mvsb
     call d10mvsw
     call e10lods
     call f10stos
     call h10scas

     ret
begin endp
;                  Использование MOVSB
;                  ------------------------------
c10mvsb proc near
              cld
              lea SI,name1
     lea DI,name2
     mov CX,10;Переслать 10 байтов
     rep movsb   ; из name1 в name2
              ret
c10mvsb endp
;                  Использование MOVSW
;                  ------------------------------
d10mvsw proc near
              cld
              lea SI,name2
     lea DI,name3
     mov CX,5;Переслать 5 слов
     rep movsw  ; из name2 в name3
              ret
d10mvsw endp
;                  Использование LODSW
;                  ------------------------------
e10lods proc near
              cld
              lea SI,name1;Загрузить 1-е слово
     lodsw    ; из name1 в AX
              ret
e10lods endp
;                  Использование STOSW
;                  ------------------------------
f10stos proc near
              cld
              lea DI,name3
     mov CX,5
                   mov AX,2020h;Заполнить пробелами
     rep stosw    ; поле name3
              ret
f10stos endp
;                  Использование CMPSB
;                  ------------------------------
g10cmps proc near
              cld

              lea SI,name1
              lea DI,name2
     mov CX,10
     repe cmpsb   ;Сравнить name1 и name2
              jne g20 ;если не равны
     mov BH,01
g20: mov CX,10
     lea SI,name2
     lea DI,name3
     repe cmpsb   ;Сравнить name2 и name3
              je  g30 ;если равны
     mov BL,02   
       g30: ret
g10cmps endp
;                  Использование SCASB
;                  ------------------------------
h10scas proc near
              cld

              lea DI,name
mov CX,10
     mov AL,'m';Поиск символа ‘m’
     repne scasb    ; в name1
              jne h20 ;если нет
     mov BH,03
       h20: ret
h10scas endp

codesg ends
              end begin

6.3. Задания для самостоятельной работы

1. В сегменте данных представлена строка символов длиной N. Написать программу замены в этой строке первого встретившегося слева и первого встретившегося справа символов ‘*’ на пробел.

2. В сегменте данных представлена строка символов, конец которой отмечен ноль-символом (символом с кодом 0). Написать программу подсчета количества символов ‘*’ в этой строке.

3. В сегменте данных объявлены два подряд идущих поля
pattern db '***---'
disarea db 42 dup(?)
Напишите программу, которая заполнит все поле disarea следующим образом
***---***---***---***---... ***---
Для заполнения разрешается использовать только одну команду movsw с соответствующими подготовительными операциями.

4. Используя определение сегмента данных с базированием по абсолютному адресу видеобуфера, напишите программы

 

Задание
1 перемещения содержимого экрана на n строк вверх (нижние освободившиеся строки очищаются);
2 перемещения содержимого экрана на n строк вниз (верхние освободившиеся строки очищаются);
3 перемещения содержимого экрана на n колонок вправо (левые освободившиеся колонки очищаются);
4 перемещения содержимого экрана на n колонок влево (правые освободившиеся колонки очищаются);
5 перестановки между собой строк с заданными номерами m и n;
6 замены цвета на экране у всех символов ‘*’, имеющих белый цвет на черном фоне, на желтый цвет на голубом фоне;
7 уплотнения текста на экране путем удаления в каждой строке слева от текста всех пробелов, имеющих атрибут цвета «белый на черном»;
8 циклического перемещения содержимого экрана на n строк вверх (нижние освободившиеся строки заполняются вышедшими за границу верхними строками);
9 циклического перемещения содержимого экрана на n строк вниз (верхние освободившиеся строки заполняются вышедшими за границу нижними строками);
10 циклического перемещения содержимого экрана на n колонок вправо (левые освободившиеся колонки заполняются вышедшими за границу правыми колонками);
11 циклического перемещения содержимого экрана на n колонок влево (правые освободившиеся колонки заполняются вышедшими за границу левыми колонками);
12 очистки прямоугольного фрагмента экрана с заданными координатами  левого верхнего угла и длинами сторон  с обрамлением фрагмента в рамку;
13 копирования прямоугольного фрагмента экрана с заданными координатами  левого верхнего угла и длинами сторон  в область экрана с координатами  левого верхнего угла;
14 очистки экрана под ее диагональю (очистку производить пробелами с заданным атрибутом цвета);
15 очистки экрана над ее диагональю (очистку производить пробелами с заданным атрибутом цвета).

     

ПРИЛОЖЕНИЕ A.   Директивы


Таблица A. 1 Основные директивы ассемблера

Директива Назначение
1 2
assume <ср>:<ис>{,<ср>:<ис>} Связывает сегментный регистр <ср> с сегментом с именем <ис>
extrn <ви>:<тп>{,<ви>:<тп>} Информирует ассемблер о том, что переменные и метки <ви>, имеющие тип <тп>, определены в других модулях
group <ис>{,<ис>} Объединяет однотипные сегменты под одно имя. Общий их объем не должен превышать 64 Кбайт
include <иф> Включает файл с именем <иф> в исходный текст программы
<имя> label <тип> Назначает имени, определенному за данным оператором, новое <имя> и <тип>
name <им> Назначает имя <им> модулю

Продолжение таблицы A.1

1 2
org <кв> Назначает значение константного выражения <кв> адресному счетчику и соответственно изменяет адрес следующего определяемого элемента. В выражении можно использовать символ ‘$’, обозначающий текущее значение адреса
page m,n Предписывает компилятору формировать листинг, имеющий m строк на странице и n символов в каждой строке
<ип> proc [ near |far] Отмечает начало процедуры с именем <ип>
<ип> endp Отмечает конец процедуры с именем <ип>
public <ви>{,<ви>} Информирует ассемблер о том, что имя <ви> должно быть доступно для других модулей
<ис> segment <параметры> Отмечает начало сегмента с параметрами <параметры> (см. разд.3.3)
<ис> ends Отмечает конец сегмента.

Продолжение таблицы A.1

1 2
title <текст> Предписывает компилятору вверху каждой страницы листинга выводить <текст>

 

ПРИЛОЖЕНИЕ B.  КомаНдЫ

Таблица B. 1 Арифметические операции

Код Оп1 Оп2 Флаги Примечание
1 2 3 4 5
adc r r,m r,m v A,C,O, P,S,Z Если флаг C=1, то Оп1:=Оп1+1, иначе - нет. Затем Оп1:=Оп1+Оп2. Операция используется при сложении многословных величин для учета бита переполнения в последующих фазах операции
add r r,m r,m v A,C,O, P,S,Z Оп1:=Оп1+Оп2
cmp r r,m r,m v A,C,O, P,S,Z Сравнивает содержимое двух полей данных
dec r,m - A,O,P,S,Z Оп1:=Оп1-1
div r,m - A,C,O, P,S,Z Беззнаковое деление. Если Оп1 - однобайтный, то AL:=AX/Оп1; AH:=AX mod Оп1. Если Оп1 - двухбайтный, то AX:=<DX:AX>/Оп1 и  DX:=<DX:AX> mod Оп1
idiv r,m - A,C,O, P,S,Z Знаковое деление. Выполняется аналогично команде div над знаковыми операндами

 

 

Продолжение таблицы B.1

1 2 3 4 5
imul r,m - C,O Знаковое умножение. Если Оп1 - однобайтный, то AX:=AL*Оп1. Если Оп1 - двухбайтный, то <DX:AX>:=AX*Оп1
inc r,m - A,O,P,S,Z Оп1:=Оп1+1
mul r,m -   Беззнаковое умножение. Если Оп1 - однобайтный, то AX:=AL*Оп1. Если Оп1 - двухбайтный, то <DX:AX>:=AX*Оп1
neg r,m - A,C,O, P,S,Z Изменяет знак числа на противоположный
sbb r r,m r,m v A,C,O, P,S,Z Если флаг C=1, то Оп1:=Оп1-1, иначе - нет. Затем Оп1:=Оп1-Оп2. Операция используется при сложении многословных величин
sub r r,m r,m v A,C,O, P,S,Z Оп1:=Оп1-Оп2

 

Таблица B. 2. Команды передачи управления

Код Переход,  если Примечание
1 2 3
call -- Вызов процедуры

 

Продолжение таблицы B.2

1 2 3
ja/jnbe C=0, Z=0 Переход по «выше» или «не ниже или равно»
jae/jnb C=0 Переход по «выше или равно» или «не ниже»
jb/jnae C=1 Переход по «ниже» или «не выше или равно»
jbe/jna C=1 or A=1 Переход по «ниже или равно» или «не выше»
jc C=1 Переход по переносу
jcxz Регистр CX=0 Переход по CX=0
je/jz Z=1 Переход по «равно» или по «нулю»
jg/jnle Z=0 and S=O Переход по «больше» или «не меньше или равно»
jge/jnl S=O Переход по «больше или равно» или «не меньше»
jl/jnge S O Переход по «меньше» или «не больше или равно»
jle/jng Z=1 and S O Переход по «меньше или равно» или «не больше»
jmp -- Безусловный переход
jnc C=0 Переход, если нет переноса
jne/jnz Z=0 Переход по «не равно» или по «не ноль»
jno O=0 Переход, если нет переполнения
jnp/jpo P=0 Переход, если нет паритета или паритет нечетный
jns S=0 Переход, если нет знака
jo O=1 Переход по переполнению

Продолжение таблицы B.2

1 2 3
jp/jpe P=1 Переход, если есть паритет или паритет четный
js S=1 Переход, если есть знак
loop CX 0 CX:=CX-1; Затем, если CX 0, передает управление
loope loopz CX 0 and Z=1 CX:=CX-1; Затем, если CX 0 и результат сравнения - ноль (равно), передает управление
loopne loopnz CX 0 and Z=0 CX:=CX-1; Затем, если CX 0 и результат сравнения - не ноль (не равно), передает управление

 

Таблица B. 3. Команды загрузки и пересылки

Код Оп1 Оп2 Примечание
1 2 3 4
lea r m Загружает адрес поля Оп2 в регистр Оп1
lds r m Загружает 4-байтовое значение из памяти Оп2 в регистр DS (2 байта) и в регистр Оп1 (2 байта)
les r m Загружает 4-байтовое значение из памяти Оп2 в регистр ES (2 байта) и в регистр Оп1 (2 байта)
mov r r,m r,m v Оп1:=Оп2

 

Таблица B. 4. Строковые операции

Предикаты * Код Флаги Примечание
1 2 3 4
repe, repz, repne, repnz cmps A,C,O, P,S,F Сравнивает строки любой длины, адресуемые регистровыми парами DS:SI и ES:DI. Сравнение происходит побайтно, если в операндах указана ссылка на поле байт, или по словам, если - на массив слов
repe, repz, repne, repnz cmpsb A,C,O, P,S,F Сравнивает строки любой длины, адресуемые регистровыми парами DS:SI и ES:DI. Сравнение происходит побайтно. Операндов нет
repe, repz, repne, repnz cmpsw A,C,O, P,S,F Сравнивает строки любой длины, адресуемые регистровыми парами DS:SI и ES:DI. Сравнение происходит по словам. Операндов нет

 

Продолжение таблицы B.4

1 2 3 4
  Lods -- Загружает из памяти, адресуемой регистровой парой DS:SI, байт в регистр AL, если в операнде имеется ссылка на байтовое поле, или слово в регистр AX, если в операнде имеется ссылка на массив слов
  lodsb -- Загружает из памяти, адресуемой регистровой парой DS:SI, байт в регистр AL. Операндов нет
  lodsw -- Загружает из памяти, адресуемой регистровой парой DS:SI, слово в регистр AX. Операндов нет

Продолжение таблицы B.4

1 2 3 4
rep movs -- Пересылает данные из области памяти, адресуемой регистровой парой ES:DI, в область памяти, адресуемую парой DS:SI. Пересылка происходит побайтно, если в операндах указана ссылка на поле байт, или по словам, если в операндах имеется ссылка на массив слов
rep movsb -- Пересылает данные из области памяти, адресуемой регистровой парой ES:DI, в область памяти, адресуемую парой DS:SI. Пересылка происходит побайтно. Операндов нет
rep movsw -- Пересылает данные из области памяти, адресуемой регистровой парой ES:DI, в область памяти, адресуемую парой DS:SI. Пересылка происходит по словам. Операндов нет

Продолжение таблицы B.4

1 2 3 4
repe, repz, repne, repnz scas A,C,O, P,S,Z Выполняет сравнение байта, адресуемого регистровой парой DS:SI, с содержимым регистра AL, если в операнде имеется ссылка на байтовое поле, или слова с содержимым регистра AX, если в операнде имеется ссылка на массив слов
repe, repz, repne, repnz scasb A,C,O, P,S,Z Выполняет сравнение байта, адресуемого регистровой парой DS:SI, с содержимым регистра AL. Операндов нет
repe, repz, repne, repnz scasw A,C,O, P,S,Z Выполняет сравнение слова, адресуемого регистровой парой DS:SI, с содержимым регистра AX. Операндов нет

Продолжение таблицы B.4

1 2 3 4
rep stos -- Сохраняет в памяти, адресуемой регистровой парой DS:SI, байт из регистра AL, если в операнде имеется ссылка на байтовое поле, или слово из регистра AX, если в операнде имеется ссылка на массив слов
rep stosb -- Сохраняет в памяти, адресуемой регистровой парой DS:SI, байт из регистра AL
rep stosw -- Сохраняет в памяти, адресуемой регистровой парой DS:SI, слово из регистра AX

 

Таблица B. 5 Операции над флагами.

Код Примечание
1 2
clc Сброс флага переноса (C:=0)
cld Сброс флага направления (D:=0)
cli Сброс флага прерывания (I:=0)
cmc Переключение флага переноса (C:=not C)
stc Установка флага переноса (C:=1)

Продолжение таблицы B.5

1 2
std Установка флага направления (D:=1).
sti Установка флага прерывания (I:=1).

 

Таблица B. 6 Команды работы со стеком.

Код Оп Примечание
pop r, m Извлекает из стека слово и помещает в Оп
popa -- Извлекает из стека восемь слов и помещает в регистры DI, SI, BP, SP, BX, DX, CX, AX
popf -- Извлекает из стека слово и помещает в регистр флагов
push r, m Помещает слово из Оп в стек
pusha -- Помещает в стек восемь слов из регистров AX, CX, DX, BX, SP, BP, SI, DI
pushf -- Помещает в стек содержимое регистра флагов

 

Таблица B. 7 Побитовые логические операции.

Код Оп1 Оп2 Флаги Примечание
1 2 3 4 5
and r r, m r, m v C, O, P, S, Z Выполняет поразрядную конъюнкцию двух операндов Оп1:=Оп1 & Оп2
not r, m -- -- Выполняет поразрядную инверсию Оп1:=ØОп1

Продолжение таблицы B.7

1 2 3 4 5
or r r, m r, m v C, O, P, S, Z Выполняет поразрядную дизъюнкцию двух операндов Оп1:=Оп1 Ú Оп2
test r r, m r, m v C, O, P, S, Z Выполняет проверку байта или слова на определенную битовую комбинацию. Действует, как команда and, но не изменяет операнда.
xor r r, m r, m v C, O, P, S, Z Выполняет поразрядное сложение по модулю 2 Оп1:=ØОп1&Оп2 Ú Оп1&ØОп2

 

библиографический список

1. Абель П. Язык Ассемблера для IBM PC и программирования / Пер. с англ. Ю.В. Сальникова. М.: Высш. шк., 1992. 447 с.

2. Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT: Пер. с англ. / Предисл. Н.В. Гайского. М.: Финансы и статистика, 1992. 544 с.

3. Каган Б.М. Электронные вычислительные машины и системы: Учеб. пособие для вузов. М.: Энергоатомиздат, 1985.  552 с.

4. Орловский Г.В. Введение в архитектуру микропроцессора 80386. - С.-Пб.: Сенанс-Пресс LTD, 1992. 240 с.

 

Оглавление

Введение.................................................................................... 3

Работа 1. Системы счисления................................... 4

1.1. Позиционные системы счисления................................ 4

1.2. Двоичная арифметика...................................................... 5

1.3. Прямой, обратный и дополнительный коды................ 5

1.4. Формы представления чисел в ЭВМ.............................. 7

1.5. Задания для самостоятельной работы......................... 8

Работа 2. Адресация памяти..................................... 10

2.1. Адресные структуры........................................................ 10

2.2. Способы адресации......................................................... 10

Подразумеваемый операнд................................................... 11

Непосредственная адресация.............................................. 11

Прямая адресация................................................................. 11

Относительная адресация или базирование...................... 11

Укороченная адресация........................................................ 11

Регистровая адресация........................................................ 11

Автоинкрементная (автодекрементная) адресация........ 11

2.3. Особенности адресации памяти процессором семейства Intel 80x86 (реальный режим)   11

Сегментация памяти........................................................... 11

Регистровая адресация........................................................ 12

Формирование адресного кода............................................ 14

2.4. Задания для самостоятельной работы....................... 15

Работа 3. Форматы команд и структура программы    17

3.1. Кодирование команд...................................................... 17

3.2. Формат команд языка Assembler................................ 17

3.3. Основные директивы компилятора............................. 18

Директива SEGMENT....................................................... 18

Директива GROUP.............................................................. 20

Директива ASSUME........................................................... 20

Директивы определения данных.......................................... 21

Директива EQU................................................................... 22

Директива PROC................................................................. 22

Директивы EXTRN и PUBLIC......................................... 22

Директива END................................................................... 23

3.4. Мнемонические команды............................................. 23

3.5. Структура программы..................................................... 24

Структура и инициализация EXE-программ..................... 24

Структура и инициализация COM-программ.................... 25

3.6. Задания для самостоятельной работы....................... 26

Работа 4. Арифметические операции................. 30

4.1. Форматы и назначение команд.................................... 30

Сложение двоичных чисел (ADD)....................................... 30

Вычитание двоичных чисел (SUB)..................................... 30

Сложение с переносом (ADC)............................................. 30

Вычитание с заемом (SBB)................................................. 30

Умножение (MUL)............................................................... 30

Деление (DIV)........................................................................ 31

Знаковое умножение и знаковое деление (IMUL и IDIV) 31

Инкремент (INC)................................................................. 31

Декремент (DEC)................................................................. 31

Сравнение (CMP).................................................................. 32

4.2. Отображение арифметических значений (пример программы)    32

4.3. Задания для самостоятельной работы....................... 33

Работа 5. Команды передачи управления...... 35

5.1. Команды перехода........................................................... 35

Безусловный переход (JMP)................................................. 35

Условный переход (Jnnn).................................................... 36

5.2. Команды организации цикла........................................ 37

Команда (LOOP).................................................................. 37

Команда проверки регистра CX (JCXZ)........................ 38

5.3. Вызов процедуры.............................................................. 38

Команда вызова процедуры (CALL).................................. 38

Команда возврата из процедуры (RET)............................ 38

5.4. Задания для самостоятельной работы....................... 39

Работа 6. Обработка строковых данных......... 41

6.1. Команды пересылки........................................................ 41

Пересылка байтов (MOVSB)............................................. 41

Пересылка слов (MOVSW).................................................. 41

Пересылка байтов или слов (MOVS)................................. 42

Загрузка байта/слова (LODSB/LODSW)............................. 42

Загрузка байта или слова (LODS)...................................... 43

Запись байта/слова (STOSB/STOSW).................................. 43

Запись байта или слова (STOS).......................................... 43

6.2. Команды сравнения........................................................ 43

Сравнение байтов (CMPSB).............................................. 44

Сравнение слов (CMPSW)................................................... 44

Сравнение байтов или слов (CMPS).................................. 44

Сканирование строки (SCASB/SCASW/SCAS).................... 44

6.3. Задания для самостоятельной работы....................... 47

ПРИЛОЖЕНИЕ A. Директивы.......................................... 49

ПРИЛОЖЕНИЕ B. КомаНдЫ.............................................. 51

библиографический список.................................... 58

 


 

Лицензия №0243 от 20.01.99 г.

 

Подписано в печать 14.05.2000             Формат 60x84 1/16.

Бумага писчая.     Печать RISO.        6,5 усл.печ.л.

Тираж 100                                                 Заказ 153

 

Издательство Казанского математического общества.
420008, Казань, Университетская, 17.

 

 

Офсетная лаборатория Нижнекамского химико-технологического института.
423550, Нижнекамск, пр. Строителей, 47


* Предикаты повторения, если они есть, требуют выполнения команды, пока счетчик CX0 и выполняется условие, определенное предикатом. При этом происходит автоматическое увеличение индексных регистров SI и/или DI, если флаг направления D =0, и происходит их уменьшение, если D =1.


Поделиться с друзьями:

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.134 с.