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

Эта операция-примитив позволяет извлечь элемент цепочки и поместить его в регистр-аккумулятор 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 адрес_источника (LOaD String) — загрузить элемент из цепочки в аккумулятор al/ax/eax.

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

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

Пример: Использование lods для загрузки байта в регистр al<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> fnd db 'Несовпавший элемент в регистре 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

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: