Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
asm.doc
Скачиваний:
6
Добавлен:
09.11.2019
Размер:
913.41 Кб
Скачать

Циклічний зсув операнда вліво через ознаку переносу - rcl

Схема команди: RCL операнд , кількість зсувів

Призначення: операція циклічного зсув операнда вліво через ознаку переносу CF.

Алгоритм роботи:

  • зсув всіх бітів операнда вліво на один розряд, при цьому старший біт операнда стає значенням ознаки переносу CF;

  • одночасно старе значення ознаки переносу CF засовується в операнд праворуч і стає значенням молодшого біта операнда;

  • зазначені вище дві дії повторюються задану кількість раз, яка значена у другому операнді.

Циклічний зсув операнда вправо через ознаку переносу – rcr

Схема команди: RCR операнд , кількість зсувів

Призначення: операція циклічного зсув операнда вправо через ознаку переносу CF.

Алгоритм роботи:

  • зсув всіх бітів операнда вправо на один розряд; при цьому молодший біт операнда стає значенням ознаки переносу CF;

  • одночасно старе значення ознаки переносу — в операнд ліворуч і стає значенням старшого біта операнда;

  • зазначені вище дві дії повторюються задану кількість раз, яка значена у другому операнді.

Стан ознак після виконання команд циклічних зсувів : CF – значення залежить від результату роботи команди, OF – зміст ознаки має зміст при зсуві на один біт, в цьому випадку залежить від результату роботи команди.

  1. Бітові маски.

Бітова маска – представляє собою двійкову сталу в якої деякі з двійкових розрядів встановлені в 1. Наприклад,

00011100b

000000001111000b

1111000000000001111000b

Бітові маски застосовуються в логічних операціях для виділення окремих бітів, встановлення значень у окремі біти, тощо. Також можуть застосовуватися в арифметичних операціях та операції порівняння.

Розв’язування задач за тематикою заняття

Задача 1. Задано вміст регістрів AL (01110001b) , BL (11010101b) і DL (01010111b) . Знайти вміст регістрів після виконання групи команд :

or BL,AL

and AL,DL

not AL

xor DL,BL

text AL,DL .

Розв’язування. Значення регістрів після кожної команди :

Команди Вміст регістрів

or BL,AL ; al (1111 0101 ) bl (1101 0101 ) dl( 0101 0111 )

and AL,DL ; al (0101 0101 ) bl (1111 0101 ) dl( 0101 0111 )

not AL ; al (1010 1010 ) bl (1111 0101 ) dl( 0101 0111 )

xor DL,BL ; al (1010 1010 ) bl (1111 0101 ) dl( 1010 0010 )

text AL,DL ; al (1010 1010 ) bl (1111 0101 ) dl( 1010 0010 ).

Задача 2. Написати процедуру для обчислення виразу без використання операцій множення та ділення :

a = ((a*2+1)/4+(c*2-d)/8+(d-1))/4+5-b*16,

де a= 657, b=265, c=738, d= 273.

Розв’язування.

Data Segment para 'code'

a dw 657

b dw 265

c dw 738

d dw 273

Data Ends

Code Segment para 'code'

Main Proc far

;.................... Основна програма.....................................

Main Endp

Calc Proc near ; Процедура обчислення виразу.

mov AX,a ; Записати в регістр AX число а.

shl AX,1 ; AX*2

inc AX ; AX+1.

shr AX,2 ; AX/4

mov CX,c ; Записати в регістр CX число с.

shl CX,1 ; CX*2

sub CX,d ; Відняти d від вмісту регістра CX

mov DX,d ; Записати в регістр DX число d.

dec DX ; Зменшити вміст регістра DX на 1.

add AX,CX ; Додати до вмісту регістра AX

add AX,DX ; вміст регістрів CX і DX.

shl AX,2 ;

add AX,5 ; Додати 5 до вміст регістра AX.

mov BX,b ;

shr BX,4

sub AX,BX ; Відняти BX від вмісту регістра AX.

mov a,AX ; Записати вміст регістру AX в а.

ret ; Повернення з процедури.

Calc Endp ; Директива кінця процедури.

Code Ends Main

Задача 3. Дата зберігається у беззнаковій змінні dat розміром в слово наступним чином

Рік

Місяць

День

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Написати процедуру мовою асемблера, щоб значення року, місяця та дня із змінної dat записувалися відповідно у змінні year, mounth та day типу байт.

Розв’язування. Побудуємо бітові маски, в яких встановимо в 1 розряди, які відповідають одному з полів, та 0 в розряди інших полів.

m_year EQU 1111 1110 0000 0000b

m_mounth EQU 0000 0001 1110 0000b

m_day EQU 0000 0000 0001 1111b

Застосовуючи побудовані маски, логічні команди та команди зсувів отримуємо розв’язок задачі.

title Date.asm

m_year EQU 1111 1110 0000 0000b

m_mounth EQU 0000 0001 1110 0000b

m_day EQU 0000 0000 0001 1111b

Data Segment

dat dw ?

year db ?

mounth db ?

day db ?

Data

Code Segment Public

;** * фрагмент коду*****……..

ReCodeData proc mov BX,dat

mov AX,BX

and AX,m_year

shr AX,9

mov year,AL

mov AX,BX

and AX,m_mounth

shr AX,5

mov mounth,AL

mov AX,BX

and AX,m_day

mov day,AL

ReCodeData endp

; **************************

Code Ends

Задача 4. Написати процедуру підрахунку кількість одиничних бітів у машинному слові.

Розв’язування. Нехай вхідний параметр машинне слово знаходиться у регістрі AX, а результат записується у регістрі DX, тоді процедура має вигляд:

CountBit Proc Near ; Підпрограма знаходження одиничних

; бітів за допомогою команд зсувів.

sub DX,DX ; Встановити лічильник бітів в 0.

mov CX,16 ; Записати у СХ кількість ітерацій.

m1: mov BX,AX ; Збереження AX для наступних ітерацій.

and AX,0001h ; Виділення самого молодшого розряду.

add DX,AX ; Підрахунок одиничних бітів.

mov AX,BX ; Відновлення вмісту регістра AX.

shr AX,1 ; Зсув наступного біта в нульовий розряд.

loop m1 ; Цикл по кількості бітів у слові.

ret ; Повернення з процедури.

CountBit Endp ; Директива кінця процедури.

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