Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






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

Команда lods

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

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

 

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

 

; prg_11_4.asm

MASM

MODEL small

STACK 256

.data

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

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

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

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

fnd db 'Несовпавший элемент в регистре 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

 


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

mylektsii.su - Мои Лекции - 2015-2024 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал