Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
43
Добавлен:
15.04.2015
Размер:
1.15 Mб
Скачать
  1. Перенос элемента из аккумулятора в строку

stos <приемник>

stosb

stosw

stosd

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

После выполнения команды происходит изменение содержимого регистра DI, равное значению размеру элемента строки: увеличение, если DF=0 или уменьшение, если DF=1.

Пример

Записать в строку 15 пробелов:

.data

string db 15 dup (?)

.code

mov ax,@data

mov ds,ax

mov es,ax

cld ; адрес увеличивается

mov al, “ “ ; в al загружается пробел

lea di, string ; в di загружается адрес строки

mov cx, 15

rep stosb ; пересылать 15 байт (пробелов)

:

.

Ввод элемента цепочки из порта в строку

ins <приемник>, <порт>

insb

insw

insd

b,d,w – размеры пересылаемых элементов.

Номер порта должен быть записан в регистр dx. Адрес приемника записать в es:di. Размер элемента цепочки должен быть согласован с элементом порта. В CX указать количество пересылаемых байт (слов, двойных слов). После ввода элемента команда ins производит коррекцию содержимого регистра di на величину, равную размера элемента.

push ds

pop es

mov dx, 5000h

lea di, pole ; адрес строки

mov cx, 10 ; в cx количество пересылаемых байт

rep insb

:

  1. Вывод элемента цепочки в порт

Outs <порт>, <источник>

outsb

outsw

outsd

Для работы этой команды необходимо предусмотреть:

  • номер порта записать в регистр dx

  • адрес источника записать в пару регистров DS: SI/ESI

  • размерность элемента строки совпадает с элементом порта.

Пример

mov dx, 378h

lea di, string

mov cx, 16

rep outsb

  1. Циклы

Для многократного выполнения некоторого блока команд используется команда loop <метка>

Команда контролирует состояние регистра – счетчика цикла CX. Если состояние счетчика cx <> 0, то управление передается на метку в начале цикла, если cx=0, то происходит выход из цикла. После каждого выполнения тела цикла состояние счетчика cx уменьшается на единицу.

Для преждевременного выхода из цикла применяются команды:

loope (или loopz)<метка>

Если cx>0 и zf=1, то управление передается на метку.

Если cx=0 или zf=0, то управление передается на следующую команду.

loopne (или loopnz)<метка>

Если cx>0 и zf=0, то управление передается на метку.

Если cx=0 или zf=1, то управление передается на следующую команду

Фрагмент программы поясняет обнуление некоторого массива данных:

.

Пример простейшего цикла.

Программа выполняет обнуление массива

.data

mas db 1,2,3,4,5,6,7,8,9,10

.code

………….

mov bx, offset mas

mov si, 0

mov cx, 10

nul:

mov [bx] [si], 0 ; обнуление

inc si

loop nul ; управление на метку nul и cx уменьшается на 1

;выход из цикла, когда CX=0

…………….

Пример использования в цикле команды loopne.

В данном примере программа находит в массиве нулевой байт и выходит из цикла.

.data

len equ 10

mas db 1,0,9,8,0,7,8,0,2,0

mes db “Нет нулевых элементов $”

.code

start:

mov ax,@data

mov ds,ax

mov cx,len

xor ax,ax

xor si,si

mov si,-1

cicl:

inc si

cmp mas[si],0

loopne cicl

jz exit ;если найден 0, то выход

mov ah,9

mov dx,offset mes ;иначе – нет нулей в строке

int 21h

exit:

mov ax,4c00h

int 21h

end start