Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LH05-3N.DOC
Скачиваний:
24
Добавлен:
11.03.2015
Размер:
100.86 Кб
Скачать

Команды вычитания.

3. Пример использования команд вычитания SUB и SBC.

В качестве примера рассмотрим вычисление по формуле Z=(X+5)-Y, где двухбайтовые операнды X и Y располагаются в ячейках с адресами 0E0h (0E0h-старший байт, 0E1h-младший) и 0E2h (0E2h-старший байт, 0E3h-младший) соответственно, а результат Z помещается в слове по адресу 0E4h (0E4h-старший байт, 0E5h-младший).

LDA 0E1 ;Загрузить в аккумулятор младший байт операнда X.

ADD #05 ;Прибавить #5.

STA 0E5 ;Временно сохранить промежуточный результат.

LDA 0E0 ;Загрузить в аккумулятор старший байт операнда X.

ADC #00 ;Прибавить бит переноса от предыдущего сложения.

STA 0E4 ;Временно сохранить промежуточный результат.

LDA 0E5 ;Загрузить в аккумулятор младший байт суммы (X+5).

SUB 0E3 ;Вычесть младший байт операнда Y.

STA 0E5 ;Сохранить младший байт результата Z.

LDA 0E4 ;Загрузить в аккумулятор старший байт суммы (X+5).

SBC 0E2 ;Вычесть старший байт операнда Y с учетом возможного заема во время ;предыдущей операции вычитания.

STA 0E4 ;Сохранить старший байт результата Z.

Список тестов:

Значение в ячейках 50 и $51

Значение в ячейках $52 и $53

Результат в ячейках $54 и $55 после вычитания младшего байта

Содержимое регистра CC после выполнения команды SUB

Результат в ячейках $54 и $55 после вычитания старшего байта

Содержимое регистра CC после выполнения команды SBC

$10FB

$1005

$11FB

111.xN.C

$00FB

111.x.Z.

$FF80

$0F10

$FF75

111.x...

$F075

111.xN..

$FFFF

$0001

$0003

111Hx...

$0003

111Hx.Z.

$0000

$0008

$00FD

111.xN.C

$FFFD

111.xN.C

Команды инкремента и декремента.

4. Пример использования команд INC и DEC

Команды INC и DEC соответственно увеличивают или уменьшают на единицу значение в регистре или одной из первых 511 ячеек памяти.

Предположим, что нам нужно разместить по адресам $50-$6F числа убывающей арифметической прогрессии (Ti=Ti-1-K), где T1 хранится по адресу $70, a модуль разности-по адресу $71.

LDA #$20 Будем вычислять 20 членов прогрессии.

STA $72 Проинициализировать ячейку $72-счетчик цикла.

LDA $70 Загрузка в аккумулятор значения первого члена прогрессии.

CLRX Очистить содержимое индексного регистра для индексной адресации со смещением первой ячейки памяти из списка.

STA $50, X Поместить текущее значение аккумулятора в ячейку X относительно смещения $50.

SUB $71 Вычислить значение следующего члена прогрессии.

INCX Увеличить значение X для адресации следующей ячейки памяти.

DEC $72 Уменьшить счетчик цикла.

BNE $0107 Пока не заполним все 20 ячеек, повторять цикл.

Если ввести в ячейки $70 и $71 значения $80 и $02 соответственно, то после выполнения программы содержимое интересующего нас участка памяти будет таким:

0050 80 7E 7c 7a 78 76 74 72 70 6e 6c 6a 68 66 64 62

0060 60 5E 5c 5a 58 56 54 52 50 4e 4c 4a 48 46 44 42 ' Команды умножения и арифметического дополнения.

5. Пример использования команды MUL.и NEG

Команда MUL) умножает содержимое аккумулятора на содержимое регистра X. Результат помещается в слове, образованном этими же байтами. Старшим байтом результата является регистр X, младшим - аккумулятор. Команда NEG производит арифметическое дополнение (вычитает текущее значение из 0) либо содержимого одного из регистров, либо содержимого ячейки памяти. Доступны только первые 511 ячеек.

В данном ассемблере команда MUL является командой беззнакового умножения, т.е. ее операнды рассматриваются как байтовые числа от 0 до 256. Байтовые числа могут также рассматриваться как числа со знаком, т.е. числа от -128 до +127. Все числа, у которых бит 7 (знаковый) сброшен, считаются положительными, а укоторых установлен-отрицательными

В данном примере реализуется подпрограмма знакового умножения двух чисел.

0100 B6 50 LDA $50 Загрузить первый множитель в аккумулятор.

BPL $0105 Если он отрицателен, то

NEGA сделать отрицание.

LDX $51 Загрузить второй множитель в аккумулятор.

BPL $010A Если он отрицателен, то

NEGX сделать отрицание.

MUL Умножить.

STX $52 Сохранить старший байт результата.

STA $53 Сохранить младший байт результата.

LDA $50 Загрузить первый множитель в аккумулятор.

EOR $51 теля положительны, либо оба множителя отрицательны, то

BPL $011D выйти из программы.

NEG $53 Отрицание младшего байта.

BCC $011B Если младший байт равен нулю, то перешагнуть инкремент.

INC $52 Инкремент старшего байта.

NEG $52 Отрицание старшего байта.

NOP Нет операции.

Список тестов:

Значение в ячейке $50

Значение в ячейке $51

Результат в ячейках $52 и $53

$FF (-$01)

$FF (-$01)

$0001

$FF (-$01)

$75

$FF8B (-$0075)

$80(-$80)

$01

$FF80(-$0080)

$80(-$80)

$FF(-$01)

$0080

6. Программа вычисления суммы квадратов числовой последовательности.

В качестве итогового примера предлагается рассмотреть программу, которая вычисляет сумму квадратов первых n чисел, где число n помещается в ячейку $50, а итоговая сумма заносится в ячейки $51 и $52. Так как значение суммы ограничено числом 65535-максимальным, которое помещается в два байта, корректное значение получится только лишь для чисел n, меньших, либо равных $8E.

CLR $51 Обнулить старший байт суммы.

CLR $52 Обнулить младший байт суммы.

LDA $50 Загрузить в аккумулятор текущее значение счетчика.

TAX Скопировать его в регистр X для умножения самого на себя.

MUL Умножить.

ADD $52 Прибавить к младшему байту результата младший байт предыдущего значения суммы.

STA $52 Сохранить новое значение.

TXA Скопировать в аккумулятор старший байт квадрата текущего числа.

ADC $51 Прибавить к нему старший байт предыдущего значения суммы, с учетом возможного переноса из младшего байта.

STA $51 Сохранить новое значение.

DEC $50 Уменьшить значение счетчика цикла.

BNE $0104 Повторять цикл, пока счетчик не обнулится.

Список тестов:

Значение в ячейке $50

Результат в ячейках $51 и $52

$15

$0CEF

$09

$011D

$8E

$B7B7

$8F

$0798*

*В этом случае произошло переполнение, так как двух байт не хватило для размещения полученного результата. Желающим узнать истинное значение суммы предлагается самостоятельно модифицировать программу таким образом, чтобы суммы размещалась не в двух, а в трех байтах.

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