BAULA1 (1110624), страница 10

Файл №1110624 BAULA1 (Лекции Баулы) 10 страницаBAULA1 (1110624) страница 102019-04-28СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 10)

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

N equ 30000

D segment

. . .

X dw N dup (?)

. . .

D ends

C segment

assume cs: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 ; Прямой просмотр

rep stosw

Рассмотрим ещё один пример. Напишем фрагмент программы для решения задачи присваивания всем элементам знакового массива целых чисел Y абсолютных значений соответствующих им элементов массива X, т.е. Y:=abs(X)(учтите, что этот оператор присваивания – это только иллюстрация, так в Паскале написать нельзя).

N equ 5000

D segment

X dw N dup (?)

Y dw N dup (?)

Diagn db 'Большое значение в X!$'

. . .

D ends

C segment

assume cs:C,ds:D,es:D,ss:Stack

Start:mov ax,D

mov ds,ax

mov es,ax

. . .

mov cx,N

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

lea si,X

lea di,Y

L: lodsw

cmp ax,0

jge L1

neg ax

jno L1

lea dx,Diagn

outstr

finish

L1: stosw

loop L

В приведённом примере массивы X и Y находятся в одном сегменте, поэтому регистры ds и es имеют одинаковые значения. Так как не у каждого отрицательного числа есть соответствующее ему абсолютное значение, то при обнаружении такой ситуации выдаётся аварийная диагностика, и выполнение программы прекращается.

На этом мы закончим наше краткое изучение строковых команд и перейдём к следующему классу команд – логическим командам.

9.2. Логические команды.

Все логические команды рассматривают свои операнды как упорядоченные наборы битовых значений. В таком наборе может содержаться 8 бит или 16 бит, в зависимости от размера операнда.1 Бит со значением 1 может трактоваться как логическое значение True, а нулевой бит – как логическое значение False.

Сначала рассмотрим двухадресные логические команды, имеющие такой общий вид

КОП op1,op2

Ниже приведены допустимые операнды таких команд:

op1

op2

r8

r8, m8, i8

m8

r8, i8

r16

r16, m16, i16

m16

r16, i16

Как видно, у этих команд допускаются такие же операнды, как и у команд сложения, вычитания и сравнения.

Будем нумеровать биты в операндах логических команд так же, как и в регистрах, от нуля до некоторого числа N. Число N равно 7 для коротких (байтовых) операндов и равно 15 для длинных (размером в слово):

N 0

. . .

Таким образом, операнды логической команды можно рассматривать как массивы логических элементов, проиндексированных от 0 до N. На языке Паскаль такие массивы можно, например, описать в следующем виде

Var op1,op2: array[0..N] of Boolean;

Схему выполнения команды логического умножения

and op1,op2

на языке Паскаль можно записать в виде

for i:=0 to N do op1[i]:=op1[i] and op2[i]

Схему выполнения команды логического сложения

or op1,op2

на языке Паскаль можно записать в виде

for i:=0 to N do op1[i]:=op1[i] or op2[i]

Схему выполнения команды неэквивалентности (её часто называют также командой сложения по модулю 2)

xor op1,op2

на языке Паскаль можно записать в виде

for i:=0 to N do op1[i]:=op1[i] <> op2[i]

Команда логического тестирования

test op1,op2

выполняется точно так же, как и команда логического умножения, но без записи результата на место первого операнда, т.е. как и у команды сравнения с кодом cmp её единственным результатом является установка флагов.

Все перечисленные выше логические команды устанавливают флаги так же, как команда вычитания, например, флаги CF и OF будут разны нулю (никакого переноса и переполнения, конечно, нет), во флаг знака SF переносится левый бит результата и т.д. Но, как мы вскоре увидим, интерес для программиста представляет здесь только флаг нулевого результата ZF, который, как обычно, равен единице (поднят) для полностью нулевого результата, и равен нулю (опущен), если в результате есть хотя бы один ненулевой бит.

Следует заметить, что мы использовали цикл языка Паскаль только для более строгого описания работы логических команд. Не следует понимать это слишком буквально: на самом деле логические команды на современных ЭВМ выполняют операции над битами своих операндов одновременно (чаще всего за один такт работы центрального процессора), а не в последовательном цикле. 2

9.3. Команды сдвига.

Команды сдвига предназначены для сдвига (изменения индексов) битов в своём операнде. Операнд при этом можно рассматривать как битовый вектор, элементы которого пронумерованы от 0 до N так же, как и для рассмотренных выше логических команд. Команды сдвига имеют формат

КОП op1,op2

где op1 может быть r8,m8,r16 или m16, а op2 – иметь значение единицы или быть коротким регистром cl.1 Мы рассмотрим сначала команды сдвига вида КОП op1,1 , а затем обобщим их на случай команд вида КОП op1,cl .

Команда сдвига операнда на один бит влево имеет показанный ниже вид

shl op1,1

и её выполнение можно так описать в виде цикла на Паскале:

CF:=op1[N]; for i:=N downto 1 do op1[i]:=op1[i-1]; op1[0]:=0

Как видим, при сдвиге битового вектора на одну позицию влево самый левый бит не теряется, а попадает во флаг переноса CF, а на освободившееся справа место записывается нулевой бит. Все команды сдвига устанавливают флаги по значению результата по тем же правилам, что и команды сложения и вычитания. Например, флагу – признаку отрицательного результата SF приваивается самый левый бит результата, т.е. SF:=op1[N]. Однако среди флагов, изменяемых командами сдвигов, в практическом программировании имеет смысл рассматривать только флаг переноса CF и флаг нуля ZF (он устанавливается в единицу, если, как обычно, получается полностью нулевой вектор-результат).

Команда сдвига влево часто называется логическим сдвигом влево, у кода операции этой команды есть синоним sal, который называется арифметическим сдвигом влево. Логический и арифмети­ческий сдвиги выполняются одинаково, а различие в их названиях будет понятно из дальнейшего изложения.

В том случае, если мы будем трактовать операнд команды сдвига влево на один бит как целое число, то результатом сдвига является умножение этого числа на два. При этом результат умножения получается правильным, если во флаг переноса CF попадает незначащий бит результата. Таким обра­зом, для беззнакового числа при правильном умножении на 2 должно быть CF=0, а для знакового опе­ранда результат получается правильным только тогда, когда значение флага переноса совпадает со знаковым (крайним слева) битом результата, т.е. после выполнения команды сдвига справедливо равенство CF=op1[N].

Рассмотрим теперь команды сдвига на один разряд вправо. По аналогии со сдвигом на один разряд влево, сдвиг на один разряд вправо можно трактовать как деление целого числа на два. Однако, так как деление на два должно выполняться по разным правилам для знаковых и беззнаковых целых чисел (вспомним различные команды div и idiv), то существуют две разные команды сдвига операнда на один бит вправо. Команда логического сдвига на один разряд вправо

shr op1,1

выполняется по правилу:

CF:=op1[0]; for i:=0 to N-1 do op1[i]:=op1[i+1]; op1[N]:=0

Эта команда эквивалентна делению на два беззнакового целого числа, результат при этом всегда получается правильным. Делению на два знакового целого числа эквивалентна команда арифметического сдвига операнда на один бит вправо

sar op1,1

она выполняется по правилу:

CF:=op1[0]; for i:=0 to N-1 do op1[i]:=op1[i+1]

Как видим, крайний левый бит аргумента при арифметическом сдвиге вправо не меняется. Особым здесь является случай, когда операнд равен минус единице, тогда операция деления этого операнда на два не эквивалентна операции арифметического сдвига вправо на один бит. Легко прове­рить, что (-1) div 2 = 0, а результат арифметического сдвига вправо операнда со значением –1 снова даёт -1 (т.е. sar -1,1 = -1).

Заметим далее, что, как и "настоящие" команды деления, сдвиг вправо даёт два результата: частное на месте своего операнда и остаток от деления на 2 во флаге CF. Действительно, легко видеть, что

CF:=op1 mod 2 для беззнакового операнда и

CF:=abs(op1 mod 2) для знакового операнда.

Таким образом, для проверки того, является ли целое число X нечётным, можно использовать следующие две команды

shl X,1

jc ODD; Нечётное X

Программисты, однако, не любят этот способ проверки на нечётность, так как при этом портится операнд X. Лучше проверять целое число X на нечётность двумя командами

test X,1

jne ODD; Нечётное X

Следующая группа команд сдвига – так называемые циклические сдвиги. Эти команды рассматривают свой операнд как замкнутый в кольцо: после бита с номером N располагается бит с номером 0, а перед битом с номером 0 – бит с номером N. Ясно, что при циклическом сдвиге операнд сохраняет все свои биты, меняются только номера этих битов. Команда циклического сдвига влево

rol op1,1

выполняется по правилу

shl op1,1; op1[0]:=CF

Команда циклического сдвига вправо

ror op1,1

выполняется по правилу

shr op1,1; op1[N]:=CF

Команда циклического сдвига через флаг переноса включают в кольцо сдвигаемых битов дополнительный бит – флаг переноса CF, который включается между битами с номерами 0 и N. Таким образом, в сдвиге участвуют N+1 бит. Команда циклического сдвига влево через флаг переноса

rcl op1,1

выполняется по правилу

t:=CF; rol op1,1; op1[0]:=t

Здесь t – некоторая вспомогательная (врéменная) переменная.

Команда циклического сдвига вправо через флаг переноса

rcr op1,1

выполняется по правилу

t:=CF; ror op1,1; op1[N]:=t

Команды циклического сдвига в практике программирования используются редко – когда надо проанализировать биты операнда и в операнде можно изменять порядок этих битов.

Теперь нам осталось описать команды сдвига, вторым операндом которых служит регистр cl. Каждая такая команда (КОП – любой из кодов операций сдвигов)

КОП op1,cl

Выполняется по правилу

for cl:=cl downto 1 do КОП op1,1 ; cl:=0

Таким образом, значение регистра cl задаёт число разрядов, на которые в цикле происходит сдвиг операнда, после цикла, как обычно, счётчик цикла (в данном случае регистр cl) обнуляется. Ясно, что задавать сдвиги более чем на N разрядов не имеет большого смысла.

Главное назначение логических команд – обрабатывать отдельные биты и группы битов в байтах и словах. Разберём несколько примеров использования логических команд в программировании на Ассемблере. Сначала составим фрагмент программы, в котором подсчитывается и выводится число битов со значением "1" во внутреннем машинном представлении переменной X размером в слово:

X dw ?

. . .

inint X

mov ax,X

sub cx,cx; число "1"

L: cmp ax,0

jz Pech

shl ax,1

adc cx,0; cx:=cx+CF

jmp L

Pech: outint cx

Заметим, что операция подсчёта числа битов машинного слова со значением "1" является весьма важной в архитектуре некоторых ЭВМ. В качестве примера рассмотрим отечественную ЭВМ третьего поколения БЭСМ‑6, которая производилась в 70-х годах прошлого века [3]. В этой ЭВМ сигналы прерывания устанавливали в "1" биты в специальном 48-разрядном регистре прерываний (каждый бит соответствовал своему типу прерывания). В этой архитектуре существовала специальная машинная команда для подсчёта количества "1" в своём аргументе, что позволяло быстро определить число ещё необработанных сигналов прерывания.

Характеристики

Тип файла
Документ
Размер
1,27 Mb
Материал
Тип материала
Высшее учебное заведение

Список файлов лекций

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6381
Авторов
на СтудИзбе
308
Средний доход
с одного платного файла
Обучение Подробнее