Решења за проблеме поглавља 4 пуне онлајн базе података о рачунарским наукама и курса за каријеру на Интернету од почетка

Resena Za Probleme Poglavla 4 Pune Onlajn Baze Podataka O Racunarskim Naukama I Kursa Za Karijeru Na Internetu Od Pocetka



Проблеми и њихова решења

1) Напишите програм на асемблеру који почиње од $0200 за 6502 µП и додаје непотписане бројеве 2А94 Х (додати) у 2АБФ Х (аугенд). Нека улази и излаз буду у меморији. Такође, ручно израдите састављен програмски документ.







Решење:



ЦЛЦ
ЛДА $0213
АДЦ $0215
СТА $0217
ЛДА $0214
АДЦ $0216
СТА $0218



Састављени програм:





2) Напишите програм на асемблеру који почиње од $0200, за 6502 µП, и одузима непотписане бројеве, 1569 Х (субтрахенд) из 2АБФ Х (минуенд). Нека улази и излаз буду у меморији. Такође израдите састављен програмски документ, ручно.



Решење:

СЕЦ
ЛДА $0213
СБЦ $0215
СТА $0217
ЛДА $0214
СБЦ $0216
СТА $0218

Састављени програм:

3) Напишите програм на асемблеру за 6502 µП који броји од $00 до $09 користећи петљу. Програм би требало да почне од 0200 долара. Такође, ручно израдите састављен програмски документ.

Решење:

ЛДА #09$
СТА $0220 ; за поређење Кс и 09 долара
ЛДКС #00$
лооп ИНКС
ЦПКС $0220
БНЕ петља

Састављени програм:

4) Напишите програм на асемблеру који почиње од $0200 за 6502 µП. Програм има два потпрограма. Прва потпрограм додаје непотписане бројеве 0203 Х (аугенд) и 0102 Х (додати). Други потпрограм додаје збир из првог потпрограма који је 0305 Х до 0006 Х (аугенд). Коначни резултат се чува у меморији. Позовите први потпрограм који је ФСТСУБ и други подпрограм који је СЕЦСУБ. Нека улази и излази буду у меморији. Такође, ручно израдите састављен програмски документ за цео програм.

Решење:

СЕЦСУБ ЦЛЦ
ЛДА $021А
АДЦ $0234
СТА $0236
ЛДА 021 милијарди долара
АДЦ $0235
СТА $0237
РТС

ФСТСУБ ЦЛЦ
ЛДА $0216
АДЦ $0218
СТА $021А
ЛДА $0217
АДЦ $0219
СТА $021Б
РТС

ЈСР ФСТСУБ

Састављени програм:

5) С обзиром да је ан ¯ИРК руковалац додаје $02 до $01 на акумулатору као руковање језгром док ¯НМИ се издаје, а руковање језгром за ¯НМИ додаје $05 до $04 у акумулатору, напишите асемблерски језик за оба руковаоца укључујући њихове позиве. Позив на ¯ИРК руковалац треба да буде на адреси $0200. Тхе ¯ИРК руковалац треба да почне на адреси од $0300. Тхе ¯НМИ руковалац треба да почне на адреси од $0400. Резултат од ¯ИРК обрађивач треба ставити на адресу $0500, а резултат од ¯НМИ руковаоца треба ставити на адресу $0501.

Решење:

НМИСР ПХА ; НМИ рутина почиње овде на адреси од 0400 долара
ПХКС
ПХИ
;
ЛДА #$04
АДЦ #$05
СТА $0501
;
ПЛИ
ПЛКС
ПЛА
РТИ

ИСР ПХА ; ово упутство је на адреси $0300
ПХКС
ПХИ
;
ЛДА #$01
АДЦ #$02
; ЈМП НМИСР : коментарисано јер није део рутине
СТА $0500 ; ићи ће на стог
;
ПЛИ
ПЛКС
ПЛА
РТИ
;
ЈМП ИСР ; ово упутство је на адреси $0200

6) Укратко објасните како се БРК инструкција користи за стварање софтверског прекида у 65Ц02 рачунару.

Решење:

Главни начин да имате софтверски прекид за 65Ц02 µП је коришћење БРК имплицитне инструкције адресе. Претпоставимо да је главни програм покренут и да наиђе на БРК инструкцију. Од тог тренутка, адреса следеће инструкције у ПЦ-у треба да буде послата стеку како се тренутна инструкција заврши. Следеће треба позвати потпрограм за руковање софтверским упутствима. Овај потпрограм за прекид треба да гурне садржај регистра А, Кс и И у стек. Након што се изврши језгро потпрограма, садржај регистара А, Кс и И треба да буде повучен из стека у њихове регистре помоћу потпрограма који довршава. Последња изјава у рутини је РТИ. Садржај рачунара се такође аутоматски повлачи са стека на рачунар, због РТИ.

7) Направите табелу која упоређује и супротставља нормалну потпрограму са рутином услуге прекида.

Решење:

8) Укратко објасните главне начине адресирања 65Ц02 µП дајући примере инструкција асемблерског језика.

Решење:

Свака инструкција за 6502 је један бајт, праћен нула или више операнада.

Режим непосредног адресирања
Код режима непосредног адресирања, после операнда је вредност, а не меморијска адреса. Вредности мора да претходи #. Ако је вредност хексадецимална, онда „#“ мора бити праћено „$“. Инструкције за непосредно адресирање за 65Ц02 су: АДЦ, АНД, БИТ, ЦМП, ЦПКС, ЦПИ, ЕОР, ЛДА, ЛДКС, ЛДИ, ОРА, СБЦ. Читалац треба да консултује документацију за 65Ц02 µП да би знао како да користи упутства која су овде наведена, а која нису објашњена у овом поглављу. Пример упутства је:

ЛДА #77 долара

Режим апсолутног адресирања
Са режимом апсолутног адресирања, постоји један операнд. Овај операнд је адреса вредности у меморији (обично хексадецимална или ознака). Постоји 64К10 = 65,53610 меморијских адреса за 6502 µП. Типично, вредност од једног бајта је на једној од ових адреса. Апсолутна упутства за адресирање за 65Ц02 су: АДЦ, АНД, АСЛ, БИТ, ЦМП, ЦПКС, ЦПИ, ДЕЦ, ЕОР, ИНЦ, ЈМП, ЈСР, ЛДА, ЛДКС, ЛДИ, ЛСР, ОРА, РОЛ, РОР, СБЦ, СТА , СТКС, СТИ, СТЗ, ТРБ, ТСБ. Читалац треба да консултује документацију за 65Ц02 µП да би знао како да користи упутства која су овде наведена, као и за остале начине адресирања који нису објашњени у овом поглављу. Пример упутства је:

КОШТЕ 1234 долара

Режим подразумеваног адресирања
Са подразумеваним начином адресирања, не постоји операнд. Било који укључени µП регистар подразумева се инструкцијом. Подразумевана упутства за адресирање за 65Ц02 су: БРК, ЦЛЦ, ЦЛД, ЦЛИ, ЦЛВ, ДЕКС, ДЕИ, ИНКС, ИНИ, НОП, ПХА, ПХП, ПХКС, ПХИ, ПЛА, ПЛП, ПЛКС, ПЛИ, РТИ, РТС, СЕЦ , СЕД, СЕИ, ТАКС, ТАИ, ТСКС, ТКСА, ТКСС, ТИА. Пример упутства је:

ДЕКС: Смањите Кс регистар за једну јединицу.

Релативни начин адресирања
Релативни начин адресирања бави се само инструкцијама гранања. Са режимом релативног адресирања, постоји само један операнд. То је вредност од -12810 до +12710. Ова вредност се назива офсет. На основу знака, ова вредност се додаје или одузима од следеће инструкције програмског бројача до резултата на адреси намераване следеће инструкције. Релативна упутства за начин адресе су: БЦЦ, БЦС, БЕК, БМИ, БНЕ, БПЛ, БРА, БВЦ, БВС. Примери инструкција су:

БНЕ $7Ф : (грана ако је З = 0 у статусном регистру, П)

који тренутном програмском бројачу (адреса за извршење) додаје 127 и почиње извршавање инструкције на тој адреси. Слично:

БЕК $Ф9 : (грана ако је З = : у статусном регистру, П)

који додаје -7 тренутном програмском бројачу и започиње извршење на новој адреси програмског бројача. Операнд је комплементарни број двојке.

Апсолутно индексно адресирање
Код адресирања апсолутног индекса, садржај Кс или И регистра се додаје датој апсолутној адреси (било где од $0000 до $ФФФФ, тј. од 010 до 6553610) да би се добила права адреса. Ова дата апсолутна адреса се назива базна адреса. Ако се користи Кс регистар, инструкција за састављање је отприлике овако:

ЛДА $Ц453,Кс

Ако се користи И регистар, то би било отприлике овако:

ЛДА $Ц453,И

Вредност за регистар Кс или И назива се вредност бројања или индекса и може бити било где од $00 (010) до $ФФ (25010). То се не зове офсет.

Апсолутне инструкције за адресирање индекса су: АДЦ, АНД, АСЛ (само Кс), БИТ (са акумулатором и меморијом, само са Кс), ЦМП, ДЕЦ (само меморија и Кс), ЕОР, ИНЦ (само меморија и Кс), ЛДА , ЛДКС, ЛДИ, ЛСР (само Кс), ОРА, РОЛ (само Кс), РОР (само Кс), СБЦ, СТА, СТЗ (само Кс).

Апсолутно индиректно адресирање
Ово се користи само са упутствима за скок. Са овим, дата апсолутна адреса има адресу показивача. Адреса показивача се састоји од два бајта. Двобајтни показивач указује на (је адреса) одредишне вредности бајта у меморији. Дакле, инструкције асемблерског језика су следеће:

ЈМП (3456 УСД)

Са заградама и $13 у адреси $3456, док је $ЕБ у адреси $3457 (= $3456 + 1), одредишна адреса је $13ЕБ, а $13ЕБ је показивач. Апсолутних 3456 долара је у загради у упутству.

9) а) Напишите програм на машинском језику 6502 да ставите „Волим те!“ низ АСЦИИ кодова у меморији, почевши од адресе $0300 са дужином низа. Програм би требало да почне на адреси $0200. Узмите сваки карактер из акумулатора, под претпоставком да их неки потпрограм шаље тамо један по један. Такође, ручно саставите програм. (Ако требате да знате АСЦИИ кодове за „Волим те!“, ево их: 'И':4916, размак : 2016, 'л': 6Ц16, 'о':6Ф16, 'в':7616, ' е':65, 'и':7916, 'у':7516 и '!':2116. Напомена: сваки код заузима 1 бајт).

б) Напишите програм на машинском језику 6502 да ставите „Волим те!“ низ АСЦИИ кодова у меморији, почевши од адресе $0300 без дужине низа, али завршава се на 0016. Програм треба да почне на адреси $0200. Набавите сваки знак из акумулатора, под претпоставком да их неки потпрограм шаље тамо један по један. Такође, ручно саставите програм.

Решење:

а) Стратегија: Постоји 12 бајтова за стринг: 1 бајт за дужину стринга и 11 бајтова за литерал стринга. Дакле, мора бити 12 итерација (петља) рачунајући од 0. То је: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Ово је 12 бројева.

Цео број 0 се ставља у регистар Кс, а број 1110 = 1210 – 110 = Б16 = $0Б се ставља на адресу у меморији, рецимо адресу $0250. За сваку итерацију, вредност у регистру Кс се повећава, а резултат се пореди са $0Б на адреси адресе 0250. Одмах након што је вредност у Кс једнака вредности од $0Б, итерација се зауставља. У овом тренутку, дужина (број бајтова) стринга и стринг литерала заузимају локације адресе од $0300 до $030Б (укључиво). Да би се меморијске адресе повећале од $0300, користи се И регистар. код је:

ЛДА #$0Б
КОШТАЈУ 0250$
ЛДКС #00$
ЛДИ #00$
СТА $0300 ; дужина 11 се ставља у А помоћу неке потпрограме и иде до $0300
лооп ИНКС
ТАМО
0250 ЦПИ
БЕК петља

б) Стратегија: Постоји 12 бајтова за стринг: 1 бајт за $00 Нулл терминатор и 11 бајтова за литерал стринга. Дакле, мора бити 12 итерација (петља) рачунајући од 0. То је: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Ово је 12 бројева.

Цео број 0 се ставља у регистар Кс, а број 1110 = 1210 – 110 = Б16 = $0Б се ставља на адресу у меморији, рецимо адресу $0250. За сваку итерацију, вредност у регистру Кс се повећава, а резултат се пореди са $0Б на адреси адресе 0250. Одмах након што је вредност у Кс једнака вредности од $0Б, итерација се зауставља. У овом тренутку, број бајтова стринг литерала плус Нулл карактер заузимају адресе од $0300 до $030Б (укључиво). Да би се меморијске адресе повећале од $0300, користи се И регистар. код је:

ЛДА #$0Б
КОШТАЈУ 0250$
ЛДКС #00$
ЛДИ#00$
СТА $0300 ; 'И' се ставља у А од стране неке потпрограме и иде на $0300
лооп ИНКС
ТАМО
0250 ЦПИ
БЕК петља