Repne scasw

jnz NoZero; Нет нулевых элементов

inc cx; Номер последнего нулевого

NoZero:outword cx

 

Заметим, что выход из нашего цикла возможен при попадании на нулевой элемент массива, при исчерпании счётчика цикла, а также при совпадении обоих этих условий. Следовательно, после команд repne scasw необходимо проверить, имел ли место случай просто выхода из цикла без нахождения нулевого элемента, что мы и сделали командой условного перехода jnzNoZero .

Следующими рассмотрим команды загрузки элемента строки, которые являются командами пересылки и, при использовании в цикле, хорошо подходят для эффективной последовательной загрузки на регистр коротких (lodsb) или длинных (lodsw) элементов целочисленного массива. Эти команды отличаются только битом размера аргументов w, и имеют два неявных операнда op1 и op2, где op1=al для w=0, и op1=ax для w=1, а второй неявный операнд op2=<ds,si> является соответственно байтом или словом. Если обозначить буквой r регистры al или ax, то схему выполнения этих команд можно записать так:

mov r,<ds,si>; φ(si)

В качестве примера использования команды загрузки напишем фрагмент программы для реали­зации следующей задачи: найти сумму тех элементов беззнакового массива коротких целых чисел, значения которых больше 100. Если в массиве нет таких элементов, то будем в качестве ответа выдавать число ноль.

 

N equ10000

D segment

. . .

X db N dup (?)

. . .

D ends

C segment

assumecs:C,ds:D,ss:Stack

Start:mov ax,D

mov ds,ax

. . .

mov cx,N; Число элементов

sub dx,dx; Сумма=0

lea si,X; Адрес первого элемента

cld ; Прямой просмотр

L: lodsb

cmp al,100

jbe NoSum

add dl,al; Суммирование

adc dh,0; Прибавление CF

NoSum:loop L

outword dx

 

При суммировании коротких целых чисел мы получаем в качестве результата длинное целое число на регистре dx.

Последними в этом формате SS рассмотрим команды сохранения элемента строки, которые являются командами пересылки и, при использовании в цикле, хорошо подходят для эффективного присваи­вания всем элементам массива заданного короткого (stosb) или длинного (stosw) целого значения. Эти команды отличаются только битом размера аргументов w, и имеют два неявных операнда op1 и op2, где второй неявный операнд op2=al для w=0, и op2=ax для w=1, а первый неявный операнд op1=<es,di> является соответственно байтом или словом. Если обозначить буквой r регистры al или ax, то схему выполнения команд можно записать так:

mov <es,di>,r; φ(di)

В качестве примера использования команды сохранения напишем фрагмент программы для присваивания всем элементам массива длинных целых чисел значения единица.

 

N equ30000

D segment

. . .

X dw N dup (?)

. . .

D ends

C segment

assumecs:C,ds:D,es:D,ss:Stack

Start:mov ax,D

mov ds,ax

mov es,ax

. . .

mov cx,N; Число элементов

mov ax,1; Присваиваемое значение

lea di,X; Адрес первого элемента

cld ; Прямой просмотр








Дата добавления: 2015-10-05; просмотров: 793;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

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

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.