Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
SUB DX, StartAddr⇐ ПредыдущаяСтр 84 из 84
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 заданий неявно. Його розташування фіксоване і залежить від розміру співмножників. Розташування і розмір результату також визначені однозначно. Варіанти розмірів співмножників, розташування другого операнда і результату наведені у таблиці.
Приклади: 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 біт. Розташування діленого фіксоване і залежить від розміру операндів. Результатом команди ділення є значення частки і залишку.
Розташування операндів і результату при діленні
Ділення двійкових чисел зі знаком
Для ділення чисел зі знаком призначена команда
idiv дільник
Команда виконується аналогічно команді div.
Приклади: IDIV NewLength IDIV CX
2.Описати команди арифметичних зсувів sаr, sаl.
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.
1.Зсунути вміст ah на 1 біт вправо (поділити вміст ah на 2):
|