Справочник по языку Ассемблера IBM PC

             

Команда 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  



Содержание раздела