Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №3 / Laboratornaya_rabota_3B (1).docx
Скачиваний:
4
Добавлен:
21.06.2022
Размер:
106.4 Кб
Скачать

Ход работы

Выполнение общего задания:

org $8000 ; Указываем адрес с которого начнет работу программа

Main: ; Главная функция.

mov #$7c,$30 ; Записать по адресу $30 код $7C

mov #$d4,$40 ; Записать по адресу $40 код $D4

mov #$3e,$41 ; Записать по адресу $41 код $3E

mov #$00,$43 ; Записать по адресу $43 код $00

lda $30 ; Записать в аккумулятор значение из ячейки с адресом $30

ldhx $40 ; Записать в HX два значения из ячеек начиная

; с адреса $40 (D4->H и 3E->X)

add $41 ; Складываем аккумулятор и значение из ячейки

; с адресом $41 (7C+3E=BA)

bmi L0 ; Если результат отрицательный (N=1),

; то переходит на метку L0

nega ; Если условие не выполнилось, то

; Изменение знака в аккумуляторе (0-A)

lda $43 ; Записать в аккумулятор значение из ячейки с адресом $43

L0:

brclr 5,$43,L1 ; Если 5-ый бит значения ячейки с адресом $43

; равен 0, то переходим на L1

mul ; иначе беззнаковое умножение A*X -> X:A

L1:

eor $30 ; А "исключающее ИЛИ" значение по адресу $30

; BA (+) 7С = С6

rorx ; Циклический сдвиг вправо 3E=0011 1110, C=0,

; X->0001 1111, C=0

Вопрос:

Какой код в результате окажется по адресу $30 и что будет во флагах N, V и Z?

Ответ:

В результате выполнения программы по адресу $30 хранится значение $7C. При этом в регистре CCR значения признака знака N, признака переполнения при обработке чисел со знаком V и признака нуля Z установлены в «0». Что можем наблюдать на рис. 2.

Рис. 2 Состояние регистров и памяти в режиме симуляции после выполнения задания

Задание на бригаду:

С использованием подпрограмм написать программу, которая вычисляет среднее арифметическое для тех элементов массива из 11 однобайтовых чисел без знака, у которых бит 4 равен 1.

Выполнение задания бригады:

org $8000

lda #$fe

psha ; Положили 11 значений в стек

lda #$f1

psha

lda #$38

psha

lda #$24

psha

lda #$ba

psha

lda #$ff

psha

lda #$e3

psha

lda #$a1

psha

lda #$02

psha

lda #$00

psha

lda #$57

psha

mov #$0B,$83 ; Кладем число 11 в ячейку $83

mov #$00,$81 ; 2 байта для результата суммирования

mov #$00,$82

mov #$00,$84 ; Счетчик чисел, подходящих по условию

N0: ; Метка для реализации цикла

jsr func_add ; Переход к подпрограмме func_add

dbnz $83,N0 ; Цикл. Уменьшаем значение в ячейке $83

; и если это значение не равно 0,то переходим к метке N0

ldhx $81 ; Загружаем делимое (H:A)

lda $82 ;

ldx $84 ; и делитель (X)

div ; H:A/X

bra Main_Loop ; Перейти на метку Main_loop

func_add:

pulh ; Выгружаем из стека 2 байта

; которые хранят адрес возврата из подпрограммы

pulx

pula ; Выгружаем число (одно из 11) и загружаем в аккумулятор

pshx ; Загружаем обратно адрес возврата

pshh

sta $80 ; Загружаем ту ячейку, которую хотим сложить

brset 4,$80,N1 ; Условие, если 4-ый бит числа, записанное в ячейке $80,

; равен единицы

rts ; Выход из подпрограммы, если условие не выполняется

N1:

inc $84 ; Увеличиваем счетчик чисел, подходящих условию

add $82 ; Складываем число с 2-ым байтом результата

sta $82 ; Сохраняем результат сложения в ячейку памяти по адресу $82

lda #$00 ; Обнуляем А

adc $81 ; Складываем бит переноса с первым байтом результата (А+$81+C)

sta $81 ; Сохраняем сумму в ячейку $81

rts ; Выход из подпрограммы

Main_Loop: ; Бесконечный цикл, обязателен.

nop

bra Main_Loop ; Перейти на метку Main_loop

Рис. 4. Блок-схема для задания на бригаду

Рис. 5. Содержание стека после загрузки массива

Рис. 6. Состояние регистров и памяти в режиме симуляции