Інструкція LODS
Інструкція LODS, яка завантажує файл чи слово з пам’яті у акумулятор (накопичувач), підрозділяється на дві інструкції – LODSB та LODSW. LODSB завантажує байт, який адресується за допомогою пари регістрів DS:SI, у регістр AL та зменшує чи збільшує регістр SI (у залежності від стану флага напрямку). Якщо флаг напрямку встановлений у 0 (встановлений за допомогою інструкції CLD), то регістр SI збільшується, а якщо флаг напрямку дорівнює 1 (встановлений за допомогою інструкції STD), то регістр SI зменшується. І це вірно не тільки для інструкцій LODSB, флаг напрямку керує напрямком, у якому змінюються усі регістри-показники рядкових інструкцій. Наприклад, у наступному фрагменту програми:
cld mov si,0 lodsb
інструкція LODSB завантажує регістр AL змістом байта зі зміщенням 0 у сегменті даних та збільшує значення регістру SI на 1. Це еквівалентно виконанню наступних інструкцій:
mov si,0 mov al,[si] inc si
однак інструкція LODSB працює суттєво швидше (та займає на два байта мнеш), ніж інструкції:
mov al,[si] inc si
Інструкція LODSW аналогічна інструкції LODSB. Вона зберігає у регістрі AX слово, яке адресується парою регістрів DS:SI, а значення регістра SI зменшується чи збільшується на 2, а не 1. Наприклад, інструкції:
std mov si,0 lodsw
завантажують слово зі зміщенням 10 у сегменті даних у регістр RU, а потім значення SI зменшується на 2. Інструкція STOS Інструкція STOS – це доповнення інструкції LODS. Вона записує значення розміром у байт чи слово з акумулятора у чарунку пам’яті, на яку вказує пара регістрів ES:DI, а потім зменшує чи збільшує DI. Інструкція STOSB записує байт, який міститься у регістрі AL, у чарунку пам’яті по адресі ES:DI, а потім збільшує чи зменшує регістр DI, в залежності від флагу напрямку. Наприклад, інструкції:
std mov di,0ffffh mov al,55h stosb
записують значення 55h у байт зі зміщенням 0FFFFh у сегменті, на який вказує регістр ES, а потім зменшує DI до значення 0FFFEh. Інструкція STOSW працює аналогічно, записуючи значення розміром у слово, яке міститься у регістрі AX, по адресі ES:DI, а потім збільшує чи зменшує значення регістра DI на 2. Наприклад, інструкції:
cld mov di,0ffeh mov al,102h stosw
записують значення 102h розміром у слово, записане у регістрі AX, по зміщенню 0FFEh у сегменті, на який вказує регістр ES, а потім значення регістра збільшується до 1000h. Інструкції LODS та STOS можна чудово використовувати разом для копіювання буферів. Однак для переміщення байта чи слова з одного місця на інше є ще кращий спосіб. Це інструкція MOVS.
|