Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методички по ассемблеру / Методичка_часть1 Архитектура Вычислительных Систем-Новиков.doc
Скачиваний:
88
Добавлен:
02.05.2014
Размер:
1.31 Mб
Скачать

Краткие теоретические сведения.

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

  2. Команды сдвига и циклического сдвига

Команды манипулирования битами.

Эти команды манипулируют группами битов в регистрах или ячейках памяти. Они разделены на три группы: логические команды, команды сдвига и команды циклического сдвига.

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

Эти команды названы логическими потому, что они действуют по правилам формальной логики, а не арифметики. Например, логическое утвержде­ние "если А истинно и В истинно, то С истинно" находит свое отражение в команде AND (и) микропроцессора 8x86, которая применяет его к соответствующим битам двух операндов.

Точнее говоря, команда AND полагает равным 1 все те биты операнда приемника, в позициях которых содержится 1 у обоих операндов. А в те биты приемника, в позициях которых содержится любая другая комбинация значении (или 00, или О и 1), полагаются равными нулю.

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

Логические команды OR, AND и XOR.

Операндами команд AND, OR и XOR могут быть байты или слова. В этих коман­дах можно сочетать два регистра, регистр с ячейкой памяти или непосредственное значение с регистром или ячейкой памяти.

Команда AND маскирует (обнуляет) некоторые биты, после чего можно выпол­нить дальнейшую обработку остальных битов. Как уже упоминалось, в каждой позиции бита, где оба операнда содержат 1, операнд-приемник также будет содер­жать 1. В тех же позициях, где операнды имеют любую другую комбинацию значе­ний, операнд-приемник будет содержать 0. Запомните, что при исполнении коман­ды AND биты операнда-приемника становятся, равны 0 всюду, где операнд-источ­ник содержит 0, и сохраняются там, где операнд-источник содержит 1.

Приведем несколько примеров команд AND:

AND АХ,ВХ ;Выполнить AND над двумя регистрами

AND AL,MEM_BYTE ;Выполнить AND над регистром и ячейкой памяти

AND MEM_BYTE ; или наоборот

AND BL,1101В ;Выполнить AND над константой и регистром

AND TABLE[BX],MASK3 ; или ячейкой памяти

Рассмотрим следующий пример применения команды AND. Пусть порт 200 соединен с 16-битовым регистром состояния внешнего устройства системы и бит 6 показывает, включено (1) или выключено (0) устройство. Если Ваша программа может продолжать работу только в случае, когда устройство включено, то она должна содержать следующий цикл:

CHK_PWR: IN AХ,200 ;Прочитать состояние устройства

AND AX,1000000B ;Изолировать индикатор включения

JZ CHK_PWR ;Подождать включения питания, ... ; а затем продолжить работу

Команда JZ (jump if zero - перейти если нуль), которая нами еще не рассматрива­лась, заставляет микропроцессор 8x86 вернуться к команде IN с меткой CHK_PWR, если флаг нуля ZF равен 1, и перейти к следующей команде в противном случае. В нашем примере флаг ZF равен 1 только в том случае, когда индикатор включения (бит 6) равен 1, так как команда AND обнуляет все остальные биты регистра АХ.

Команда OR полагает равным 1 те биты операнда-приемника, в позициях которых хотя бы один из операндов содержит 1. Эта команда обычно используется для принудительного присваивания 1 заданным битам. Например, команда

OR BX,OCOOH

полагает два старших бита (14 и 15) регистра ВХ равными 1 и оставляет другие биты не измененными.

Команда XOR используется, если надо выяснить, в каких битах значения операндов различаются, или если надо обратить состояния заданных битов. Команда XOR полагает равным 1 все те биты приемника, в позициях которых операнды имеют различные значения, иначе говоря, те биты, в позициях которых один из операндов имеет значение-0, а другой - 1. Если оба операнда содержат в данной позиции либо 0, либо 1, то команда XOR обнуляет этот бит приемника.

Например, команда

XOR BX,0C000H

обращает состояния двух старших битов регистра ВХ (14 и 15) и сохраняет осталь­ные биты неизмененными.

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

Команда NOT (HE) обращает состояние каждого бита регистра или ячейки памяти и ни на какие флаги не воздействует. Таким образом, команда NOT заменяет каждый 0 на 1, а каждую 1 – на 0. Другими словами, она выполняет для операнда дополнение до единицы.

Команда проверки TEST.

Команда TEST (test — проверить) выполняет операцию AND над опе­рандами, но воздействует только на флаги и не изменяет значения операндов. Команда TEST изменяет флаги точно так же, как команда AND: она обнуляет флаги CF и OF, изменяет флаги PF, ZF и SF, а флаг AF оставляет неопределенным.

Когда вслед за командой TEST указана команда JNZ (jump if not zero - перейти, если не нуль), переход произойдет только в том случае, если хотя бы в одной позиции бита оба операнда содержат 1.

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

У микропроцессора 8x86 есть семь команд, осуществляющих сдвиг 8-или 16-битового содержимого регистров или ячеек памяти на одну или несколько позиций влево или вправо. Три из них сдвигают операнд, а остальные четыре его вращают или циклически сдвигают.

Для всех семи команд флаг переноса CF является как бы расширением операн­да битом 9 или битом 17. Иначе говоря, флаг CF приобретает значение бита, сдви­нутого за один из концов операнда. Команды сдвига и циклического сдвига вправо помещают во флаг CF значение нулевого бита. Команды сдвига и цикли­ческого сдвига влево помещают в него значение бита 7 (при операциях над бай­том) или бита 15 (при операциях над словом).

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

Команды сдвига и циклического сдвига имеют два операнда: приемник и счетчик. Приемником может быть 8- или 16-битовый регистр общего назначения или ячейка памяти. Счетчик может быть цифрой 1 или значением без знака в регистре CL.

Рис. 1. Команды сдвига и циклического сдвига

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

Команды SAL (shift arithmetic left - сдвинуть влево арифметически) и SAR (shift arithmetic right - сдвинуть вправо арифметически) сдвигают числа со знаком. Команда SAR сохраняет знак операнда, репродуцируя его при выполне­нии сдвига. Команда SAL не сохраняет знак, но заносит 1 во флаг переполнения OF в случае изменения знака операнда. При каждом сдвиге операнда команда SAL заносит 0 в вакантный нулевой бит этого операнда.

Команды SHL (shift logical left - сдвинуть влево логически) и SHR (shift logical right - сдвинуть вправо логически) сдвигают числа без знака. Команда SHL идентична команде SAL. Команда SHR аналогична команде SHL, но сдвигает операнд не влево, а вправо. При каждом сдвиге операнда команда SHR заносит 0 в вакантный старший бит этого операнда (бит 7 при сдвиге байта, бит 15 при сдвиге слова).

Помимо флагов CF и OF команды сдвига изменяют флаги PF, ZF и SF, а флаг AF оставляют неопределенным.

Чтобы познакомиться с работой команд сдвига, предположим, что регистр AL содержит ОВ4Н, а флаг переноса CF равен 1. В двоичном коде

AL = 10110100 CF = 1

Команды сдвига воздействуют на регистр AL и флаг CF следующим образом:

После SAL AL,1 :

AL = 01101000 CF = 1

После SAR AL,1:

AL = 11011010 CF = О

После SHL AL,1:

AL = 01101000 CF = 1

После SHR AL,1:

AL = 01011010 CF = 0

Имеется несколько интересных приложений команд сдвига. Например, в следующем фрагменте команд команда SHL используется для преобразования двух неупакованных BCD-чисел (старшая цифра извлекается из регистра BL, младшая - из регистра AL) в упакованное BCD-число в регистре AL:

MOV CL,4 ;3агруэить счетчик сдвига в CL

SHL BL,CL ;Сдвинуть старшую цитру в старшие четыре бита BL

OR AL,BL ;Получить упакованное BCD-число слиянием AL и BL

Поскольку сдвиг операнда на один бит влево удваивает значение операнда (умножает на 2), а сдвиг на один бит вправо уменьшает значение операнда вдвое (делит на 2), то команды сдвига можно использовать в качестве команд быстрого умножения и деления.

Следующие команды сдвига показывают, каким образом можно разделить на четыре содержимое регистра АХ. Во всех случаях предполагается, что регистр CL содержит 2.

SHL AX,CL ;Умножить число без знака на 4

SAL AX,CL ;Умножить число со знаком на 4

SHR AX,CL ;Разделить число без знака на 4

SAR AX,CL ;Разделить число со знаком на 4

Применяя команды сдвига вместо команд умножения и деления, можно сэкономить немало времени. Каждая из предыдущих команд сдвига выполняется за 16 тактов. Еще 4 такта требуется для загрузки значения в регистр CL, итого - 20 тактов. Сравнивая это время с минимальными временами исполнения команд MUL (118 тактов), IMUL (l28 тактов), DIV (144 такта) и IDIV (165 тактов), мы видим, что команды сдвига выполняют эти действия в шесть-восемь раз быстрее, чем команды умножения и деления!

В то время как отдельная команда сдвига может умножить или разделить только на степень числа 2, манипулирование несколькими регистрами позволяет выполнить умножение или деление на другие числа. Например, приведенная ниже последовательность команд умножает содержимое регистра АХ на 10:

MOV ВХ,10 ;Сохранить содержимое в ВХ

SHL АХ,1 ;Сдвинуть AХ (умножить на 2)

SHL AХ,1 ;Сдвинуть AХ еще раз (умножить на 4)

ADD АХ,ВХ ;Сложить с исходным, значением АХ (умножить на 5)

SHL АХ,1 ;Сдвинуть AХ еще раз (умножить на 10)

Хотя в этой последовательности пять команд, но выполняется она в 11 раз быст­рее одной команды MUL!

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

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

При исполнении команды ROL (rotate left - сдвинуть влево циклически) и ROR (rotate right - сдвинуть вправо циклически) вышедший за пределы операнда бит входит в него с противоположного конца. При исполнении команд RCL (rotate left through carry - сдвинуть влево циклически вместе с флагом переноса) и RCR (rotate right through carry - сдвинуть вправо циклически вместе с флагом перено­са) в противоположный конец операнда помещается значение флага переноса CF. Все команды циклического сдвига воздействуют только на флаги CF и OF.

Чтобы познакомиться с работой команд циклического сдвига, вернемся к исходным данным предыдущего примера:

AL = 10110100 CF = 1

Команды циклического сдвига воздействуют на регистр AL и флаг CF следующим образом:

После ROL AL,1:

AL = 01101001 CF = 1

После ROR AL,1:

AL = 01011010 CF = 0

После RCL AL,1:

AL = 01101001 CF = 1

После RCR AL,1:

AL = 11011010 CF = 0

Индивидуальное задание.

Каждому студенту выдается 4-х значный вариант. Согласно этого варианта вычислить следующее выражение и определить, четное полученное число или нечетное и отрицательное оно или положительное:

F = Y оп1 КОН1 оп2 Х оп3 КОН2

КОН1, КОН2 – числовые константы, согласно табл. 1

оп1, оп2, оп3 – операции сложения, вычитания, умножения и деления согласно табл. 2

X, Y – переменные, тип которых определяется согласно табл. 3

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

Числовые константы из табл. 1 берутся согласно первой цифре варианта, операции сложения и вычитания из табл. 2 – согласно второй цифре варианта, а размер и тип переменных – из табл. 3 согласно третьей цифре варианта.

Ввод значений переменных с клавиатуры производится на языке Си, вычисление выражения производится на Ассемблере, вывод результат — на языке Си.

Если размер результат будет более 16 бит – результат преобразовывать в 16-битный.

Таблица 1.

Первая цифра варианта

0

1

2

3

4

5

6

7

8

9

КОН1

10

96

20

12

130

24

64

32

6

40

КОН2

32

16

8

4

128

64

36

22

14

72

Таблица 2.

Вторая цифра варианта

0

1

2

3

4

5

6

7

8

9

оп1

/

/

*

*

/

*

+

/

*

оп2

+

+

%

%

*

*

+

+

оп3

*

*

/

/

*

/

/

/

Таблица 3.

Третья цифра варианта

0

1

2

3

4

5

6

7

8

9

X

char

un char

int

un int

int

un char

int

char

char

un int

Y

int

un int

char

un char

int

un int

int

int

char

un char

Примечания: – char – 8 битн. со знаком

– un. char – 8 битн. без знака

– int – 16 битн. со знаком

– un. int – 16 битн. без знака

Пример. У студента индивидуальный вариант 990. Строим индивидуальное выражение для вычисления: F = Y * 40 + X — 72

Согласно варианту переменные X и Y должны быть описаны следующим образом

char x;

int y;

Программа выглядит следующим образом:

;y*40=y*32+y*8;

; адрес у = 300, адрес x= 400

; Первоначально исходные данные заносятся на стартовые адреса памяти

mov ax,[y]

mov bx,ax

mov cl,3

shl ax,cl ;y*8

mov cl,5

shl bx,cl ; y*32

add bx,ax

mov al,[x]

cbw ;преобразуем 8-битное x в 16 битное

add bx,ax ;y*40+x

sub bx,72 ;y*40+x-72

mov f,bx

; проверяем на четность

mov iChet,bx

and iChet,0001h

; проверяем на знак

mov iSign,bx

and iSign,8000h

; результаты сохраняем с адесов Y=500, X=600 четность, 506 и 606 – знаковость

Содержание отчета:

  1. Название работы

  2. Цель работы

  3. Приборы и оборудование

  4. Краткие теоретические сведения

  5. Индивидуальное задание

  6. Распечатанный текст программы

  7. Выводы.

Вопросы к защите лабораторной работы.

  1. Логические команды: формат и правила применения

  2. Команды сдвига: формат и правила применения.

  3. Команды циклического сдвига: формат и правила применения.