.RU

Операция сканирования цепочек - Конспект лекций Системное программирование (семестр 2) Возле названия каждой лекции...


^ Операция сканирования цепочек
Команды, реализующие эту операцию-примитив, производят поиск некоторого значения в области памяти. Логически эта область памяти рассматривается как последовательность (цепочка) элементов фиксированной длины размером 8, 16 или 32 бит.

Искомое значение предварительно должно быть помещено в регистр al/ax/eax. Выбор конкретного регистра из этих трех должен быть согласован с размером элементов цепочки, в которой осуществляется поиск.

Система команд микропроцессора предоставляет программисту четыре команды сканирования цепочки.

Выбор конкретной команды определяется размером элемента:

scas адрес_приемника (SCAning String) — сканировать цепочку;

scasb (SCAning String Byte) — сканировать цепочку байт;

scasw (SCAning String Word) — сканировать цепочку слов;

scasd (SCAning String Double Word) — сканировать цепочку двойных слов.
^ Команда scas
scas адрес_приемника

Команда имеет один операнд, обозначающий местонахождение цепочки в дополнительном сегменте (адрес цепочки должен быть заранее сформирован в es:edi/di).

Транслятор анализирует тип идентификатора адрес_приемника, который обозначает цепочку в сегменте данных, и формирует одну из трех машинных команд scasb, scasw или scasd.

Условие поиска для каждой из этих трех команд находится в строго определенном месте. Так, если цепочка описана с помощью директивы db, то искомый элемент должен быть байтом и находиться в al, а сканирование цепочки осуществляется командой scasb; если цепочка описана с помощью директивы dw, то это — слово в ax, и поиск ведется командой scasw; если цепочка описана с помощью директивы dd, то это — двойное слово в eax, и поиск ведется командой scasd. Принцип поиска тот же, что и в команде сравнения cmps, то есть последовательное выполнение вычитания

(содержимое_регистра_аккумулятора - содержимое_очередного_элемента_цепочки).

В зависимости от результатов вычитания производится установка флагов, при этом сами операнды не изменяются.

Так же, как и в случае команды cmps, с командой scas удобно использовать префиксы repe/repz или repne/repnz:

Таким образом, команда scas с префиксом repe/repz позволяет найти элемент цепочки, отличающийся по значению от заданного в аккумуляторе.

Команда scas с префиксом repne/repnz позволяет найти элемент цепочки, совпадающий по значению с элементом в аккумуляторе.

В качестве примера рассмотрим листинг 3, который производит поиск символа в строке.

В программе используется команда-примитив scas.

Символ задается явно (строка 20).

Префикс повторения — repne.

 

 Листинг 3. Поиск символа в строке командой scas

;prg_11_3.asm

MASM

MODEL       small

STACK       256

.data

;тексты сообщений

fnd db      0ah,0dh,'Символ найден! ','$'

nochar      db      0ah,0dh,'Символ не найден.','$'

;строка для поиска

string     db      'Поиск символа в этой строке.',0ah,0dh,'$'

.code

ASSUME     ds:@data,es:@data

main:

    mov     ax,@data

    mov     ds,ax

    mov     es,ax   ;настройка ES на DS

    mov     ah,09h

    lea     dx,string

    int     21h     ;вывод сообщения string

    mov     al,'а'  ;символ для поиска — `а`(кириллица)

    cld             ;сброс флага df

    lea     di,string       ;загрузка в es:di смещения строки

    mov     cx,29   ;для префикса repne — длина строки

;поиск в строке (пока искомый символ и символ в строке не совпадут)

;выход при первом совпадении

repne      scas    string

    je      found   ;если равны — переход на обработку,

failed:    ;иначе выполняем некоторые действия

;вывод сообщения о том, что символ не найден

    mov     ah,09h

    lea     dx,nochar

    int     21h     ;вывод сообщения nochar

    jmp     exit    ;на выход

found:             ;совпали

    mov     ah,09h

    lea     dx,fnd

    int     21h ;вывод сообщения fnd

;теперь, чтобы узнать место, где совпал элемент в  строке,

;необходимо уменьшить значение в регистре di и  вставить нужный обработчик

;  dec     di

... вставьте обработчик

exit:              ;выход

    mov     ax,4c00h

    int     21h

end        main
^ Загрузка элемента цепочки в аккумулятор
Эта операция-примитив позволяет извлечь элемент цепочки и поместить его в регистр-аккумулятор al, ax или eax. Эту операцию удобно использовать вместе с поиском (сканированием) с тем, чтобы, найдя нужный элемент, извлечь его (например, для изменения).

Возможный размер извлекаемого элемента определяется применяемой командой.

Программист может использовать четыре команды загрузки элемента цепочки в аккумулятор, работающие с элементами разного размера:

lods адрес_источника (LOaD String) — загрузить элемент из цепочки в регистр-аккумулятор al/ax/eax;

lodsb (LOaD String Byte) — загрузить байт из цепочки в регистр al;

lodsw (LOaD String Word) — загрузить слово из цепочки в регистр ax;

lodsd (LOaD String Double Word) — загрузить двойное слово из цепочки в регистр eax.

Рассмотрим работу этих команд на примере lods.
^ Команда lods
lods адрес_источника (LOaD String) — загрузить элемент из цепочки в аккумулятор al/ax/eax.

Команда имеет один операнд, обозначающий строку в основном сегменте данных. Работа команды заключается в том, чтобы извлечь элемент из цепочки по адресу, соответствующему содержимому пары регистров ds:esi/si, и поместить его в регистр eax/ax/al. При этом содержимое esi/si подвергается инкременту или декременту (в зависимости от состояния флага df) на значение, равное размеру элемента.

Эту команду удобно использовать после команды scas, локализующей местоположение искомого элемента в цепочке.

Префикс повторения в этой команде может и не понадобиться — все зависит от логики программы.

В качестве примера рассмотрим листинг 4. Программа сравнивает командой cmps две цепочки байт в памяти string1 и string2 и помещает первый несовпавший байт из string2 в регистр al. Для загрузки этого байта в регистр-аккумулятор al используется команда lods. Префикса повторения в команде lods нет, так как он попросту не нужен.

 

Листинг 4. Использование lods для загрузки байта в регистр al

;prg_11_4.asm

MASM

MODEL       small

STACK       256

.data

;строки     для     сравнения

string1     db      'Поиск символа в этой строке.',0ah,0dh,'$'

string2     db      'Поиск символа не в этой строке.',0ah,0dh,'$'

mes_eq      db      'Строки совпадают.',0ah,0dh,'$'

fnddb      'Несовпавший элемент в регистре al',0ah,0dh,'$'

.code

;привязка ds и es к сегменту данных

assume     ds:@data,es:@data

main:

    mov     ax,@data        ;загрузка сегментных регистров

    mov     ds,ax

    mov     es,ax   ;настройка es на ds

    mov     ah,09h

    lea     dx,string1

    int     21h     ;вывод string1

    lea     dx,string2

    int     21h     ;вывод string2

    cld     ;сброс флага df

    lea     di,string1      ;загрузка в es:di смещения

;строки string1

    lea     si,string2      ;загрузка в ds:si смещения

;строки string2

    mov     cx,29   ;для префикса repe — длина строки

;поиск в строке (пока нужный символ и символ в строке не равны)

;выход — при первом несовпавшем

repe       cmps    string1,string2

    jcxz    eql     ;если равны — переход на eql

    jmp     no_eq   ;если не равны — переход на no_eq

eql:               ;выводим сообщение о совпадении строк

    mov     ah,09h

    lea     dx,mes_eq

    int     21h     ;вывод сообщения mes_eq

    jmp     exit    ;на выход

no_eq:     ;обработка несовпадения элементов

    mov     ah,09h

    lea     dx,fnd

    int     21h     ;вывод сообщения fnd

;теперь, чтобы извлечь несовпавший элемент из строки

;в регистр-аккумулятор,

;уменьшаем значение регистра si и тем самым перемещаемся

;к действительной позиции элемента в строке

    dec     si      ;команда lods использует ds:si-адресацию

;теперь ds:si указывает на позицию в string2

    lods    string2 ;загрузим элемент из строки в AL

;нетрудно догадаться, что в нашем примере это символ — "н"

exit:              ;выход

    mov     ax,4c00h

    int     21h

end        main

 
^ Перенос элемента из аккумулятора в цепочку
Эта операция-примитив позволяет произвести действие, обратное команде lods, то есть сохранить значение из регистра-аккумулятора в элементе цепочки.

Эту операцию удобно использовать вместе с операцией поиска (сканирования) scans и загрузки lods, с тем, чтобы, найдя нужный элемент, извлечь его в регистр и записать на его место новое значение.

Команды, поддерживающие эту операцию-примитив, могут работать с элементами размером 8, 16 или 32 бит.

TASM предоставляет программисту четыре команды сохранения элемента цепочки из регистра-аккумулятора, работающие с элементами разного размера:

stos адрес_приемника (STOre String) — сохранить элемент из регистра-аккумулятора al/ax/eax в цепочке;

stosb (STOre String Byte) — сохранить байт из регистра al в цепочке;

stosw (STOre String Word) — сохранить слово из регистра ax в цепочке;

stosd (STOre String Double Word) - сохранить двойное слово из регистра eax в цепочке.
^ Команда stos
stos адрес_приемника (STOrage String) — сохранить элемент из регистра-аккумулятора al/ax/eax в цепочке.

Команда имеет один операнд адрес_приемника, адресующий цепочку в дополнительном сегменте данных.

Работа команды заключается в том, что она пересылает элемент из аккумулятора (регистра eax/ax/al) в элемент цепочки по адресу, соответствующему содержимому пары регистров es:edi/di. При этом содержимое edi/di подвергаются инкременту или декременту (в зависимости от состояния флага df) на значение, равное размеру элемента цепочки.

Префикс повторения в этой команде может и не понадобиться — все зависит от логики программы. Например, если использовать префикс повторения rep, то можно применить команду для инициализации области памяти некоторым фиксированным значением.

В качестве примера рассмотрим листинг 5. Программа производит замену в строке всех символов “а” на другой символ. Символ для замены вводится с клавиатуры.

 

Листинг 5. Замена командой stos символа в строке на вводимый с клавиатуры

;prg_11_5.asm

MASM

MODEL   small

STACK   256

.data

;сообщения

fnd     db      0ah,0dh,'Символ найден','$'

nochar  db 0ah,0dh,'Символ не найден.','$'

mes1    db      0ah,0dh,'Исходная строка:','$'

string  db      'Поиск символа в этой строке.',0ah,0dh,'$' ;строка для поиска

mes2    db      0ah,0dh,'Введите символ, на который следует заменить найденный'

        db      0ah,0dh,'$'

mes3    db      0ah,0dh,'Новая строка: ','$'

.code

 assume ds:@data,es:@data привязка ds и es к сегменту данных

main:           ;точка входа в программу

        mov     ax,@data        ;загрузка сегментных регистров

        mov     ds,ax

        mov     es,ax   ;настройка es на ds

        mov     ah,09h

        lea     dx,mes1

        int     21h     ;вывод сообщения mes1

        lea     dx,string

        int     21h     ;вывод string

        mov     al,'а'  ;символ для поиска-`а`(кириллица)

        cld             ;сброс флага df

        lea     di,string       ;загрузка в di смещения string

        mov     cx,29   ;для префикса repne — длина строки

;поиск в строке string до тех пор, пока

;символ в al и очередной символ в строке

;не равны: выход - при первом совпадении

cycl:

repne   scas string

        je      found   ;если элемент найден то переход на found

failed:         ;иначе, если не найден, то вывод сообщения nochar

        mov     ah,09h

        lea     dx,nochar

        int     21h

        jmp     exit    ;переход на выход

found:

        mov     ah,09h

        lea     dx,fnd

        int     21h ;вывод сообщения об обнаружении символа

;корректируем di для получения значения

;действительной позиции совпавшего элемента

;в строке и регистре al

        dec     di

new_char:       ;блок замены символа

        mov     ah,09h

        lea     dx,mes2

        int     21h     ;вывод сообщения mes2

;ввод символа с клавиатуры

        mov     ah,01h

        int     21h     ;в al — введённый символ

        stos    string  ;сохраним введённый символ

 ;(из al) в строке string в позиции старого символа

        mov     ah,09h

        lea     dx,mes3

        int     21h     ;вывод сообщения mes3

        lea     dx,string

        int     21h ;вывод сообщения string

;переход на поиск следующего символа ‘а’ в

строке

        inc     di              ;указатель в строке string на следующий,

 ;после совпавшего, символ

        jmp     cycl    ;на продолжение просмотра string

exit:           ;выход

        mov     ax,4c00h

        int     21h

end     main    ;конец программы

Следующие две команды появились впервые в системе команд микропроцессора i386. Они позволяют организовать эффективную передачу данных между портами ввода-вывода и цепочками в памяти. Следует отметить, что эти две команды позволяют достичь скорости передачи данных со скоростью выше той, которую может обеспечить контроллер DMA (Direct Memory Access — прямой доступ к памяти). Контроллер DMA — это специальная микросхема, предназначенная для того, чтобы освободить микропроцессор от управления процессом ввода-вывода больших массивов данных между внешним устройством (диском) и памятью. 
^ Ввод элемента цепочки из порта ввода-вывода
Данная операция позволяет произвести ввод цепочки элементов из порта ввода-вывода и реализуется командой ins, имеющей следующий формат:

ins адрес_приемника,номер_порта (Input String) - ввести элементы из порта ввода-вывода в цепочку.

Эта команда вводит элемент из порта, номер которого находится в регистре dx, в элемент цепочки, адрес которого определяется операндом адрес_приемника.

Несмотря на то, что цепочка, в которую вводится элемент, адресуется указанием этого операнда, ее адрес должен быть явно сформирован в паре регистров es:edi/di.

Размер элементов цепочки должен быть согласован с размерностью порта — он определяется директивой резервирования памяти, с помощью которой выделяется память для размещения элементов цепочки.

После пересылки команда ins производит коррекцию содержимого edi/di на величину, равную размеру элемента, участвовавшего в операции пересылки. Как обычно, при работе цепочечных команд учитывается состояние флага df.

Подобно командам, реализующим рассмотренные выше цепочечные операции-примитивы, транслятор преобразует команду ins в одну из трех машинных команд без операндов, работающих с цепочками элементов определенного размера:

insb (INput String Byte) — ввести из порта цепочку байт;

insw (INput String Word) — ввести из порта цепочку слов;

insd (INput String Double Word) — ввести из порта цепочку двойных слов.

К примеру, выведем 10 байт из области памяти pole в порт 5000h.

 

.data

pole    db      10 dup (‘ ‘)

.code

...

        push    ds

        pop     es      ;настройка es на ds

        mov     dx,5000h

        lea     di,pole

        mov     cx,10

rep     insb

...
^ Вывод элемента цепочки в порт ввода-вывода
Данная операция позволяет произвести вывод элементов цепочки в порт ввода-вывода. Она реализуется командой outs, имеющей следующий формат:

outs номер_порта,адрес_источника (Output String) — вывести элементы из цепочки в порт ввода-вывода.

Эта команда выводит элемент цепочки в порт, номер которого находится в регистре dx. Адрес элемента цепочки определяется операндом адрес_источника. Несмотря на то, что цепочка, из которой выводится элемент, адресуется указанием этого операнда, значение адреса должно быть явно сформировано в паре регистров ds:esi/si.

Размер структурных элементов цепочки должен быть согласован с размерностью порта. Он определяется директивой резервирования памяти, с помощью которой выделяется память для размещения элементов цепочки.

После пересылки команда outs производит коррекцию содержимого esi/si на величину, равную размеру элемента цепочки, участвовавшего в операции пересылки. При этом, как обычно, учитывается состояние флага df.

Подобно команде ins, транслятор преобразует команду outs в одну из трех машинных команд без операндов, работающих с цепочками элементов определенного размера:

outsb (OUTput String Byte) — вывести цепочку байт в порт ввода-вывода;

outsw (OUTtput String Word) — вывести цепочку слов в порт ввода-вывода;

outsd (OUTput String Double Word) — вывести цепочку двойных слов в порт ввода- вывода.

В качестве примера рассмотрим фрагмент программы, которая выводит последовательность символов в порт ввода-вывода, соответствующего принтеру (номер 378 (lpt1)).

 

.data

str_pech        db      'Текст для печати'

.code

...

        mov     dx,378h

        lea     di,str_pech

        mov     cx,16

rep     outsb

...

В заключение напомню, что для организации работы с портами недостаточно знать их номера и назначение. Не менее важно знать и понимать алгоритм их работы. Эти сведения можно найти в документации на устройство (но, к сожалению, далеко не всегда). 





pravovie-problemi-dogovora-dareniya.html
pravovie-problemi-ocherednosti-nasledovaniya-po-zakonu-v-rossijskoj-federacii-i-ustanovleniya-rodstva.html
pravovie-sistemi-v-sovremennom-mire.html
pravovij-rezhim-cnnih-paperv-v-ukran.html
pravovoe-gosudarstvo-socialnij-ideal-i-realnost.html
pravovoe-obespechenie-proceduri-bankrotstva-v-ukraine.html
  • occupation.bystrickaya.ru/nesluchajnie-paroli-generiruemie-mashinoj-issledovaniya-pered-vzlomom.html
  • uchebnik.bystrickaya.ru/urok-viktorina-what-where-when-po-teme-moskva.html
  • znaniya.bystrickaya.ru/rannim-utrom-odinnadcatogo-sentyabrya-7145-goda-na-pristani-ostrova-kulzya-stoyal-koldun-v-golubom-plashe-na-gorizonte-uzhe-pokazalas-kurerskaya-aldareya-iz-seroj-stranica-18.html
  • kontrolnaya.bystrickaya.ru/pros-tojsekre-t.html
  • uchenik.bystrickaya.ru/buhgalterskij-finansovij-uchet.html
  • thescience.bystrickaya.ru/himiya-v-biologii-medicine-i-v-proizvodstve-lekarstvennih-veshestv.html
  • lecture.bystrickaya.ru/45-narushenie-raboti-zhkt-mifi-i-realnost.html
  • college.bystrickaya.ru/0110-elektroenergiya-stranica-18.html
  • studies.bystrickaya.ru/chuma-plotoyadnih.html
  • knigi.bystrickaya.ru/respublika-tadzhikistan-i-vto-voprosi-soglasovaniya-interesov.html
  • textbook.bystrickaya.ru/kniga-predvaritelnij-obzor-kniga-nekotorie-osnovnie-ponyatiya-stranica-53.html
  • textbook.bystrickaya.ru/kniga-pervaya-4-stranica-20.html
  • institut.bystrickaya.ru/uchebnij-rabochij-plan-po-napravleniyu-130500-neftegazovoe-delo-kvalifikaciya-stranica-4.html
  • universitet.bystrickaya.ru/tajland-chast-3.html
  • bukva.bystrickaya.ru/nachalnik-departamenta-obshego-obrazovaniya-rektor-toipkro-stranica-4.html
  • credit.bystrickaya.ru/ponyatie-konflikta-ego-sushnost-chast-2.html
  • kontrolnaya.bystrickaya.ru/razdel-iv-obshi-polozheniya.html
  • literature.bystrickaya.ru/chajkovskij-am-nazvanie-knigi.html
  • control.bystrickaya.ru/budte-bditelni-gromkoe-nazvanie-novostrojki-ne-garantiruet-chistotu-prodazh.html
  • desk.bystrickaya.ru/otchet-po-vospitatelnoj-rabote-municipalnogo-obsheobrazovatelnogo-uchrezhdeniya.html
  • college.bystrickaya.ru/12-vodnie-resursi-2009-2010-13-voprosi-ihtiologii-2009-2010.html
  • letter.bystrickaya.ru/novgorodskaya-oblast.html
  • doklad.bystrickaya.ru/valyutnij-kurs-ponyatie-i-kursoobrazuyushie-faktori-zakon-denezhnogo-obrasheniya-valyutnaya-sistema-eyo-vidi-i-elementi.html
  • paragraf.bystrickaya.ru/zheleznodorozhnogo-transporta.html
  • kontrolnaya.bystrickaya.ru/programmnaya-sistema-prognozirovaniya-sostoyanij-kompyuternoj-seti-16-nedel.html
  • reading.bystrickaya.ru/leumettk-pedagog-izmetn-turali-isasha-malmat-beru.html
  • thesis.bystrickaya.ru/praktiko-orientirovannoe-socialno-ekonomicheskoe-obrazovanie.html
  • exchangerate.bystrickaya.ru/k-g-isupov-m-m-bahtin-cherti-universalizma.html
  • urok.bystrickaya.ru/programma-disciplini-po-kafedre-avtomatiki-i-sistemotehniki-informacionnie-tehnologii.html
  • zanyatie.bystrickaya.ru/trebovaniya-nout-k-prinyatiyu-upravlencheskih-reshenij-v-organah-gosudarstvennoj-i-municipalnoj-vlasti-rossii.html
  • diploma.bystrickaya.ru/vliyanie-kislotnih-osadkov-na-biosferu-zemli.html
  • kontrolnaya.bystrickaya.ru/rabochaya-programma-po-literature-osnovnoe-obshee-obrazovanie-8-v-klass.html
  • institut.bystrickaya.ru/talskih-v-n-mitropolskij-o-v-reakciya-biologicheskogo-raznoobraziya-na-izmenenie-klimata-i-meri-adaptacii-posledstviya-izmeneniya-klimata-v-uzbekistane-meri.html
  • kanikulyi.bystrickaya.ru/vozvrashenie-sherloka-holmsa-stranica-10.html
  • knowledge.bystrickaya.ru/nauchno-issledovatelskie-raboti-studentov-2009-goda-po-razdelu-ekonomicheskie-nauki-sostav-komissii-ngtu.html
  • © bystrickaya.ru
    Мобильный рефератник - для мобильных людей.