- •Лабораторный практикум
- •Тема: Система команд процессоров и методы адресации
- •A) Абсолютная адресация
- •Б) относительная адресация
- •В) вариант программы с использованием только регистров и стековой памяти
- •Тема: Команды сравнения и переходов
- •Первый вариант:
- •Второй вариант:
- •Третий вариант:
- •Варианты заданий к лабораторной работе
- •Тема: Организация подпрограмм и внутренние механизмы передачи параметров
- •А) Передача параметров через регистры
- •B) Пример передачи параметров через общую область памяти.
- •C) Передача параметров через стек.
- •D) Передача параметров через таблицу адресов
- •Варианты заданий для лабораторной работы
- •Тема: Организация прерываний
- •Тема: Введение в архитектуру ibm pc
- •Тема: Трансляция, компоновка и отладка программ
- •Тема: Режимы адресации
- •Тема: Программирование ветвлений и циклов
- •Тема: Арифметические операции целочисленной обработки информации
- •Тема: Программирование операций ввода-вывода
- •Приложение 1 Функциональная модель микроЭвм-2
- •Приложение 2.
- •2.1.1. Представление чисел и перевод из одного счисления в другое.
- •2.1.2. Сложение положительных чисел
- •2.1.3. Сложение и вычитание чисел со знаком
- •2.2.1. Преобразование двоичных чисел в десятичные
- •2.2.2. Преобразование десятичных чисел в двоичные
- •2.3. Двоично-десятичная система счисления
- •2.4. Восьмеричная система счисления
- •2.5. Шестнадцатеричная система счисления
- •Приложение 3 Программная модель микропроцессора Intel (Pentium III)
- •Приложение 4 Система команд микропроцессора Intel 8086
- •Приложение 5 Коды ascii (диапазон 0-127)
Б) относительная адресация
адрес |
код |
мнемокод |
комментарий |
|
|
|
; ##### Y:=(A/B - C*F)*E ##### |
00 |
00 |
.base b |
; rB - базовый |
00 |
31 00 |
start: mvi b,start |
; Относительный адрес - в rB: rB - базовый |
02 |
40 |
in 0 |
; ввод A |
03 |
1c 74 |
stor a,A |
;операнд А запомнить по относительному адpесу ;((rb)+34h) |
05 |
41 |
in 1 |
; ввод В |
06 |
1c 75 |
stor a,B |
; запомнить В по относительному адpесу ((rb)+35h) |
08 |
42 |
in 2 |
; ввод C |
09 |
1c 76 |
stor a,C |
; запомнить C по относительному адpесу ((rb)+36h) |
0b |
43 |
in 3 |
; ввод F |
0c |
1c 77 |
stor a,F |
; запомнить F по относительному адpесу ((rb)+37h) |
0e |
44 |
in 4 |
; ввод E |
0f |
1c 78 |
stor a,E |
; запомнить E по относительному адpесу ((rb)+38h) |
11 |
21 |
push b |
; (rB) (sp) сохранить базовый адpес в стеке ;(сохраняется для того, чтобы можно было ;использовать регистр rb, операнд базового адреса в ;регистре rb пока остается неизменным) |
12 |
14 75 |
load a,B |
; загpузить в ra B, используя относительный адpес |
14 |
20 |
push a |
; (rA)(sp)- сохранить содержимое ra в стеке (операнд ;помещается в верхушку стека, находящийся в стеке ;операнд базового адреса опускается ниже см.рис.1) |
15 |
15 74 |
load b,A |
; загpузить в rB A, используя относительный адpес (при ;этом базовый адрес из регистра rB стирается) |
17 |
90 01 |
mui a,1 |
; pаспpостpанить знак (переход от слова к двойному ;слову) |
19 |
9c 81 |
dvm a,1(sp) |
; pазделить (rA,rB) на содежимое веpхушки стека ;(результат помещается в rB Y=A/B) |
1b |
09 |
mov a,b |
; пеpеслать частное в rA |
1c |
29 |
pop b |
; (sp)(rB) : вытолкнуть из стека в rB A |
1d |
29 |
pop b |
; (sp)(rB) : восстановить из стека базовый адрес ;(базовый адрес восстанавливается для того, чтобы ;можно было обратиться к относительным ячейкам ;памяти) |
1e |
1c 79 |
stor a,tmp |
; запомнить по относительному адресу tmp результат ;A/B |
20 |
14 76 |
load a,C |
; загрузить в rA C |
22 |
21 |
push b |
; (rB)(sp) : сохранить содержимое базового регистра ;(сохраняется для того, чтобы можно было ;использовать регистр rB, операнд базового адреса в ;регистре rB пока остается неизменным) |
23 |
15 77 |
load b,F |
; загрузить в rB F ,используя относительный адрес (в регистре rB базовый адрес переписался на операндF !) |
25 |
80 |
mur a,a |
; (rB)*(rA)->(rA,rB),т.е. C*F (результат помещается в ;rB) |
26 |
09 |
mov a,b |
; результат C*F перемещается в rA |
27 |
29 |
pop b |
; (sp)(rB) : восстановить содержимое базового рег-ра |
28 |
21 |
push b |
; (rB)(sp) : сохранить содержимое базового регистра |
29 |
15 79 |
load b,tmp |
; загрузить A/B в rB,используя относит. адрес |
2b |
6a |
sbr b,a |
; (rB)-(rA) -> (rB) (Y=A/B - C*F из содержимого ;регистра rB вычитается содержимое регистра rA и ;помещается в регистр rB) |
2c |
38 |
xchg |
; обменять содержимое регистров rA и rB |
2d |
29 |
pop b |
; (sp)(rB) : восстановить содержимое базового рег-ра |
2e |
15 78 |
load b,E |
; загрузить в rB E, используя относительный адрес |
30 |
80 |
mur a,a |
; (rB)*(rA)->(rA,rB) (A/B - C*F)*E результат в rB |
31 |
38 |
xchg |
; обменять содержимое регистров rA и rB.рез-т в rA |
32 |
4d |
out 5 |
; вывести результат в порт 5 |
33 |
f8 |
stop |
; стоп |
34 |
00 |
A: .ds 1 |
; ячейки |
35 |
00 |
B: .ds 1 |
; для |
36 |
00 |
C: .ds 1 |
; хранения |
37 |
00 |
F: .ds 1 |
; исходных |
38 |
00 |
E: .ds 1 |
; данных |
39 |
00 |
tmp: .ds 1 |
; и промежуточного результата |
Получили "квазиперемещаемую" программу, т.е. программу, которая может функционировать в любых адресах памяти, если при загрузке скорректировать содержимое только одной ячейки - адрес начала программы. Проверим ее на работоспособность.
(В примере использованы предыдущие данные). Рассмотрим еще один вариант данной программы. В этом варианте будем использовать только регистры и стековую память.