Загрузка элемента цепочки в аккумулятор



Эта операция-примитив позволяет извлечь элемент цепочки и поместить его в регистр-аккумулятор 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<1> ;prg_11_4.asm<2> MASM<3> MODEL small<4> STACK 256<5> .data<6> ;строки для сравнения<7> string1 db 'Поиск символа в этой строке.',0ah,0dh,'$'<8> string2 db 'Поиск символа не в этой строке.',0ah,0dh,'$'<9> mes_eq db 'Строки совпадают.',0ah,0dh,'$'<10> fnddb 'Несовпавший элемент в регистре al',0ah,0dh,'$'<11> .code<12> ;привязка ds и es к сегменту данных<13> assume ds:@data,es:@data<14> main:<15> mov ax,@data ;загрузка сегментных регистров<16> mov ds,ax<17> mov es,ax ;настройка es на ds<18> mov ah,09h<19> lea dx,string1<20> int 21h ;вывод string1<21> lea dx,string2<22> int 21h ;вывод string2<23> cld ;сброс флага df<24> lea di,string1 ;загрузка в es:di смещения<25> ;строки string1<26> lea si,string2 ;загрузка в ds:si смещения<27> ;строки string2<28> mov cx,29 ;для префикса repe — длина строки<29> ;поиск в строке (пока нужный символ и символ в строке не равны)<30> ;выход — при первом несовпавшем<31> repe cmps string1,string2<32> jcxz eql ;если равны — переход на eql<33> jmp no_eq ;если не равны — переход на no_eq<34> eql: ;выводим сообщение о совпадении строк<35> mov ah,09h<36> lea dx,mes_eq<37> int 21h ;вывод сообщения mes_eq<38> jmp exit ;на выход<39> no_eq: ;обработка несовпадения элементов<40> mov ah,09h<41> lea dx,fnd<42> int 21h ;вывод сообщения fnd<43> ;теперь, чтобы извлечь несовпавший элемент из строки<44> ;в регистр-аккумулятор,<45> ;уменьшаем значение регистра si и тем самым перемещаемся<46> ;к действительной позиции элемента в строке<47> dec si ;команда lods использует ds:si-адресацию<48> ;теперь ds:si указывает на позицию в string2<49> lods string2 ;загрузим элемент из строки в AL<50> ;нетрудно догадаться, что в нашем примере это символ — "н"<51> exit: ;выход<52> mov ax,4c00h<53> int 21h<54> 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.asmMASMMODEL smallSTACK 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 ;если элемент найден то переход на foundfailed: ;иначе, если не найден, то вывод сообщения nochar mov ah,09h lea dx,nochar int 21h jmp exit ;переход на выходfound: mov ah,09h lea dx,fnd int 21h ;вывод сообщения об обнаружении символа;корректируем di для получения значения;действительной позиции совпавшего элемента;в строке и регистре al dec dinew_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 ;на продолжение просмотра stringexit: ;выход mov ax,4c00h int 21hend main ;конец программы

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


Дата добавления: 2019-09-13; просмотров: 257; Мы поможем в написании вашей работы!

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






Мы поможем в написании ваших работ!