Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие Макушкиной по МОЯ.doc
Скачиваний:
49
Добавлен:
16.11.2019
Размер:
1.33 Mб
Скачать

3.2.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, а затем значение регистра DI увеличивается до 1000h.

Инструкции LODS и STOS можно прекрасно использовать вместе для копирования буферов. Например, следующая подпрограмма копирует завершающуюся нулевым символом строку, записанную по адресу DS:SI, в строку по адресу ES:DI:

;

; Подпрограмма для копирования завершающейся нулем строки

; в другую строку

;

; Ввод:

; DS:SI - строка, из которой выполняется копирование

; ES:DI - строка, в которую выполняется копирование

;

; Вывод: нет

;

; Изменяемые регистры: AL, SI, DI

;

CopyString PROC

cld ; обеспечить увеличение SI и

; DI в строковых инструкциях

CopyStringLoop:

lodsb ; получить символ исходной

; строки

stosb ; записать символ в выходную

; строку

cmp al,0 ; последним символом строки

; был 0?

jnz CopyStringLoop ; нет, обработать следующий символ

ret ; да, выполнено

CopyString ENDP

Аналогично вы можете использовать инструкции LODS и STOS для копирования блока байт, которые не завершаются нулем, используя для этого цикл:

mov cx,ARRAY_LENGTH_IN_WORDS ; размер массива

mov si,OFFSET SourceArray ; исходный массив

mov ax,SEG SourceArray

mov dx,ax

mov di,OFFSET DestArray ; целевой массив

mov ax,SEG DestArray

mov es,ax

cld

CopyLoop:

lodsw

stosw

loop CopyLoop

Однако для перемещения байта или слова из одного места в памяти в другое есть еще более лучший способ. Это инструкция MOVS.