Эта операция-примитив позволяет извлечь элемент цепочки и поместить его в регистр-аккумулятор 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 |






