Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_2011.doc
Скачиваний:
64
Добавлен:
09.12.2018
Размер:
1.15 Mб
Скачать
  1. Загрузка элемента строки в аккумулятор

Команда загружает элемент строки в аккумулятор AL. Эту команду удобно использовать с помощью команд сканирования, сравнения, которые локализуют место искомого компонента строки. Строка должна быть помещена по адресу ES:SI

lods <адрес>

lodsb

lodsw

lodsd

Пример программы, которая сравнивает две строки и первый не совпавший элемент строки помещает в аккумулятор:

.data

string1 db ‘1 2 3 4 5 6,$’

string2 db ‘1 2 3 8 5 6,$’

mes db ‘элементы совпали, $’

.code

assume ds:data, es:data

main:

mov ax,@data

mov ds,ax

mov es,ax

cld

lea di, string1

lea si, string2

mov cx,6

repe cmps string1, string2 ; сравнение пока cx>0 и zf=1

jcxz m

dec si ;в регистре si адрес не совпавшего элемента строки

lods string2 ; (можно lodsb) загрузка байта 8 в аккумулятор

jmp m1

m:

mov dx, offset mes ; загрузить адрес в dx

mov ah, 9h

int 21h ; вывод сообщения «Элементы совпали»

m1:

mov ax, 4c00h

int 21h

end main

  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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]