Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






SUB DX, StartAddr






 

3. sbb операнд1, операнд2

команда віднімання з урахуванням позики (прапора переносу cf). Принцип дії команди:

 

операнд1 = операнд1 - операнд2 - значення_cf

Ця команда враховує позику одиниці із старшого розряду при відніманні чисел.

Приклади: SBB AX, 2000h

SBB DX, [BX+SI+Index]

 

3. Розробити програму, яка використовує макрос, що реалізує операції розгалуження.

x + 1 якщо x < 0

y = x2 + 5 якщо x= 0

x2 якщо x > 0

masm

model small

.486

.stack 100h

 

func3 macro; макрос, що виконує (2x)

mov ax, x

mov bx, 2

mul bx

 

 

endm

func2 macro; макрос, що виконує (x+5)

mov ax, x

add ax, 5

endm

 

 

func1 macro; макрос, що виконує (x^3)

mov ax, x

mul ax

mul ax

endm

 

.data; сегмент даних

x dw 2; оголошення х

 

.code

begin:

MOV AX, @data

MOV DS, AX

xor AX, AX

 

mov dx, x

cmp dx, 0

 

jl M1; перехід на M1 якщо х менше 0

jg M2; перехід на M2 якщо х більше 0

 

 

func1; якщо х дорівнює 0

M1:

func3

jmp exit; перехід на мітку exit

 

M2:

func2

jmp exit; перехід на мітку exit

exit:

mov ax, 4c00h; стандартне завершення програми

int 21h

end begin

 

№ 22

1.Описати сегментні регістри

В програмній моделі процесора існують шість сегментних регістрів: cs, ds, ss основні, es, gs, fs – додаткові (в базовій моделі – перші чотири), тому в певний момент часу програма може безпосередньо звернутися лише до відповідної кількості сегментів. Програміст має забезпечити наявність адрес поточних сегментів у цих регістрах у відповідності з наступним:

 

Регістр cs містить адресу поточного сегмента кодів, звідки в процесор пересилаються коди виконуваних команд. При цьому зміщення команди у сегменті визначається вмістом вказівника команд ip.

Регістр ss вказує на початок поточного сегмента стеку.

Регістр ds містить адресу основного (поточного) сегмента даних програми.

За наявності додаткового сегмента даних для його адресування можна використовувати регістр es (gs, fs ).

 

Початкове настроювання cs і ss здійснює система, а за встановлення адреси сегмента даних відповідає програміст (див. перші дві команди у програмах-прикладах попередньої роботи та п. 2.1.4)

 

2.Описати множення двійкових чисел.

 

Множення двійкових чисел без знаку

Для множення чисел без знаку призначена команда

 

mul співмножник1

 

Другий операнд співмножник2 заданий неявно. Його розташування фіксоване і залежить від розміру співмножників. Розташування і розмір результату також визначені однозначно.

Варіанти розмірів співмножників, розташування другого операнда і результату наведені у таблиці.

 

  співмножник1   співмножник2   Результат  
Байт al 16 біт в ax al – молодша частина результату ah – старша частина результату
Слово ax 32 біти в парі dx: ax ax – молодша частина результату dx – старша частина результату
Подвійне слово eax 64 біти в парі edx: eax eax – молодша частина результату edx – старша частина результату

 

Приклади: MUL Width

MUL CX

 

Множення двійкових чисел зі знаком

Для множення чисел зі знаком призначена команда

 

imul співмножник1

Ця команда виконується так же, як і команда mul. Особливістю команди imul є формування знаку. Якщо результат малий і розміщується в одному регістрі (тобто якщо cf = of = 0), то вміст другого регістра (старшої частини) є розширенням знаку – всі його біти дорівнюють старшому біту (знаковому розряду) молодшої частини результату.

У протилежному випадку якщо (cf = of = 1) знаком результату є знаковий біт старшої частини результату, а знаковий біт молодшої частини є значущим бітом двійкового коду результату.

 

Приклади: IMUL Length

IMUL BX

 

 

3.Скласти програму мовою асемблера обчислення значення функції

z = pq2+ 2pq – p/q

 

model small

p486

.stack 100h

.data

z dd?; Спочатку розташовуємо більш довгі дані

p db 2

q db 1

pq2 dw?

2pq dw?

p/q dw?

.code

begin:

mov ax, @data

mov ds, ax

 

sub eax, eax

sub ebx, ebx

sub ecx, ecx

 

mov bl, p

mov al, q

mul al

mul bl; pq2

mov pq2, eax;

 

sub eax, eax

sub ebx, ebx

sub ecx, ecx

 

mov bl, q

mov al, p

mul bl; y2

mul 2

mov 2pq, eax

 

sub eax, eax

sub ebx, ebx

sub ecx, ecx

 

 

mov bl, q

mov al, p

div bl

mov p/q, eax

 

sub eax, eax

sub ebx, ebx

sub ecx, ecx

 

mov ax, 2pq

mov bx, pq2

add ax, bx

sub eax, p/q

 

mov z, eax

mov ax, 4c00h

int 21h

end begin

 

№ 23

 

1.Описати ділення двійкових чисел.

 

Ділення двійкових чисел без знаку

 

Для ділення чисел без знаку призначена команда

 

div дільник

 

Дільник може знаходитися у пам'яті або у регістрі і мати 8, 16 або 32 біт. Розташування діленого фіксоване і залежить від розміру операндів. Результатом команди ділення є значення частки і залишку.

 

Розташування операндів і результату при діленні

  Ділене   Дільник   Частка   Залишок  
Слово 16 біт в регістрі ax Байт – регістр або клітинка пам'яті Байт в регістрі al Байт в регістрі ah
32 біт dx – старша частина ax – молодша частина Слово 16 біт – регістр або клітинка пам'яті Слово 16 біт в регістрі ax Слово 16 біт в регістрі dx
64 біт edx – старша частина eax – молодша частина Подвійне слово 32 біт – регістр або клітинка пам'яті Подвійне слово 32 біт в регістрі eax Подвійне слово 32 біт в регістрі edx

 

Ділення двійкових чисел зі знаком

 

Для ділення чисел зі знаком призначена команда

 

idiv дільник

 

Команда виконується аналогічно команді div.

 

Приклади: IDIV NewLength

IDIV CX

 

 

2.Описати команди арифметичних зсувів sаr, sаl.

SAR dst, count Арифметичний зсув вправо
SAL dst, count Арифметичний зсув вліво

 

 

3.Скласти програму мовою асемблера обчислення значення функції

z = 2y3- y2x + x3

masm

model small

p486

.stack 100h

.data

z dd?; Спочатку розташовуємо більш довгі дані

y db 2

x db 1

2y3 dw?

Y2x dw?

X3 dw?

.code

begin:

mov ax, @data

mov ds, ax

 

sub eax, eax

sub ebx, ebx

sub ecx, ecx

 

mov bl, 2

mov al, y

mul al

mul al

mul bl

mov 2y3, eax;

sub eax, eax

sub ebx, ebx

sub ecx, ecx

 

mov bl, x

mov al, y

mul al; y2

mul bl

mov Y2x, eax

 

sub eax, eax

sub ebx, ebx

sub ecx, ecx

 

 

mov al, x

mul al

mul al; x3

mov x3, eax

 

sub eax, eax

sub ebx, ebx

sub ecx, ecx

 

mov ax, 2y3

mov bx, y2x

sub ax, bx

add eax, x3

mov y, eax

mov ax, 4c00h

int 21h

end begin

 

№ 24

1.Описати команди перетворення типів даних.

Команди перетворення типів

Ці команди не мають операндів, вони працюють з фіксованими регістрами:

cbw – команда перетворення байта (в регістрі al) в слово (в регістрі ax) шляхом поширення значення старшого біта al на всі біти регістра ah.

cwd – команда перетворення слова (в регістрі ax) в подвійне слово (в регістрах dx: ax) шляхом поширення значення старшого біта ax на всі біти регістра dx.

cwde – команда перетворення слова (в регістрі ax) в подвійне слово (в регістрі eax) шляхом поширення значення старшого біта ax на всі біти старшої половини регістра eax.

cdq – команда перетворення подвійного слова (в регістрі eax) в четвірне слово (в регістрах edx: eax) шляхом поширення значення старшого біта eax на всі біти регістра edx.

2.Описати команди зсувів shr, shl.

Мнемоніка команди Короткий зміст операції
SHR dst, count Логічний зсув вправо
SHL dst, count Логічний зсув вліво

1.Зсунути вміст ah на 1 біт вправо (поділити вміст ah на 2):


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

mylektsii.su - Мои Лекции - 2015-2024 год. (0.019 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал