Здавалка
Главная | Обратная связь

Логический сдвиг влево (shift left): SHL



Логический сдвиг вправо (shift right): SHR

Например:

mov al, 01000111b

shl al,1 ;CF=0, al=10001110b

mov al, 01000111b

shr al,1 ;CF=1, al=00100011b

mov bh, 0011100b

mov cl,3

shl bh,cl ;CF=1, al=11000000b

 

Арифметические сдвиги - предназначены для реализации быстрого умножения и деления знаковых чисел на степени двойки.

Арифметический сдвиг влево (shift arithmetic left): SAL

Арифметический сдвиг вправо (shift arithmetic right): SAR

Например:

mov ah,10001110b

sar ah,1 ;CF=0, al=11000111b

mov ah,10001110b

sal ah,1 ;CF=1, al=0011100b

Примечание. Команда sal при трансляции будет воспринята как shl, так как это разные мнемонические названия одной и той машинной команды.

Циклические сдвиги. Особенность циклических сдвигов в том, что "уходящий" бит не теряется, а возвращается в операнд, но с другого конца.

Циклический сдвиг влево (shift arithmetic left): ROL

Циклический сдвиг вправо (shift arithmetic right): ROR

Например:

mov ah,11000011b

rol ah,1 ;CF=1, al=10000111b

mov ah,11100010b

ror ah,1 ;CF=0, al=01110001b


Задание

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

Формула вычислений: X = (A * 2 + B * C ) / (D - 3)

Приведенная Программа сначала резервирует ячейки памяти под переменные, затем выполняет умножение однобайтовых чисел (A * 2), результат умножения - двухбайтовое число в регистре AX, сохраняется в регистре СХ, далее выполняется умножение однобайтовых чисел (В * С), результат - двухбайтовое число хранится в аккумуляторе AX. После сложения двух сомножителей и вычисления знаменателя (D-3) выполняется деление. Результат присваивается переменной Х.

1. Наберите приведенную программу 1, запишите исходный файл с расширением *.ASM, получите файл с расширением *.EXE.

2. Загрузите программу в отладчик TURBODEBUG (команда TURBODEBUG *.exe). Выполните программу по шагам, команда F7(F8), посмотрите, как она работает, получите результат.

3. Выполните программу с 5 вариантами различных начальных значений переменных A,B,C,D по шагам (см. таблицу 1) и запишите результат выполнения в таблицу 2 (в регистре AL - частное, AH - остаток). Переведите результат в десятичную систему.

Таблица 1

Вариант  
Значения A 0AH 20H
  B 5H 9H
C 8H 4H
D 9H 1CH
Частное AL            
Остаток AH            

 

;программа 1

;x =(a*2+b*c)/(d-3)

Model small

Stack 100h

Data

A db ?

B db ?

c db ?;Резервируем память для переменных

d db ?; A,B,C,D,X

X dw ?

Code

start:

mov ax,@data

Mov ds,ax

Mov a,3

Mov b,4

Mov c,2

Mov d,5

Mov al,2

Mul a

Mov cx,ax

Mov al,b

Mul c

Add ax,cx

Mov cl,d

Sub cl,3

Div cl

Mov x,ax

Mov ah,4ch

Int 21h

End start

 

4. Наберите приведенную программу 2, запишите исходный файл с расширением *.ASM, получите файл с расширением *.EXE.

5. Загрузите программу в отладчик TURBODEBUG (команда TURBODEBUG *.exe). Выполните программу по шагам, команда F7(F8), посмотрите, как она работает, получите результат. Обратите внимание на флаг CF.

6. Выполните программу с 5 вариантами различных начальных значений регистра al. Переведите результат запишите в таблицу 2 в двоичной и десятичной системе.

;программа 2

Model tiny

Stack 100h

Code

start:

Mov ah, 01001101b

Shr ah,1

Mov ah, 01001101b

Shl ah,1

Mov ah, 01001101b

Sar ah,1

Mov ah, 01001101b

Ror ah,1

Mov ah, 01001101b

Rol ah,1

Mov ax,4c00h

Int 21h

End start

Команды   SHL SHR SAR ROR ROL
Значение 01001101b          
01101010b          
10101101b          
11011011b          
10101100b          

 

Контрольные вопросы:

1. Чем отличается выполнение арифметических операций на языке ассемблера от языков высокого уровня?

2. По какому биту регистра флагов можно установить, что предшествующее вычитание привело к отрицательному результату?

3. По какому биту регистра флагов можно установить, что в результат арифметической операции превысил разрядную сетку?

4. В чем особенность выполнения арифметических операций с знаковыми и безнаковыми числами?

5. Назначение команды IMUL и ее основное отличие от команды MUL?

6. В чем особенность битовых команд от других команд языка ассемблера?

7. Как отражается на регистре флагов выполнение логических команд?

8. Опишите схематически работу одну из команд сдвигов?

9. В каком регистре необходимо указывать величину сдвига в команда сдвига?







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.