Решения на проблемите от глава 4 от пълната онлайн база данни по компютърни науки и курс за интернет кариера от самото начало

Resenia Na Problemite Ot Glava 4 Ot P Lnata Onlajn Baza Danni Po Komput Rni Nauki I Kurs Za Internet Kariera Ot Samoto Nacalo



Проблеми и техните решения

1) Напишете програма на асемблер, която започва от $0200 за 6502 µP и добавя неподписаните числа на 2A94 з (добавете) към 2ABF з (авгенд). Нека входовете и изходите са в паметта. Освен това създайте ръчно сглобения програмен документ.







Решение:



CLC
LDA $0213
ADC $0215
STA $0217
LDA $0214
ADC $0216
STA $0218



Сглобена програма:





2) Напишете програма на асемблер, която започва от $0200 за 6502 µP и изважда числата без знак, 1569 з (субтрахенд) от 2ABF з (minuend). Нека входовете и изходите са в паметта. Също така създайте асемблирания програмен документ на ръка.



Решение:

SEC
LDA $0213
SBC $0215
STA $0217
LDA $0214
SBC $0216
STA $0218

Сглобена програма:

3) Напишете програма на асемблер за 6502 µP, която брои от $00 до $09 с помощта на цикъл. Програмата трябва да започне от $0200. Освен това създайте ръчно сглобения програмен документ.

Решение:

LDA #$09
STA $0220; за сравняване на X и $09
LDX #$00
цикъл INX
CPX $0220
BNE контур

Сглобена програма:

4) Напишете програма на асемблер, която започва от $0200 за 6502 µP. Програмата има две подпрограми. Първата подпрограма добавя неподписаните числа на 0203 з (авгенд) и 0102 з (добавяне). Втората подпрограма добавя сумата от първата подпрограма, която е 0305 з до 0006 з (авгенд). Крайният резултат се съхранява в паметта. Извикайте първата подпрограма, която е FSTSUB, и втората подпрограма, която е SECSUB. Нека входовете и изходите са в паметта. Освен това създайте на ръка сглобения програмен документ за цялата програма.

Решение:

SECSUB CLC
LDA $021A
ADC $0234
STA $0236
LDA $021 млрд
ADC $0235
STA $0237
RTS

FSTSUB CLC
LDA $0216
ADC $0218
STA $021A
LDA $0217
ADC $0219
STA $021B
RTS

JSR FSTSUB

Сглобена програма:

5) Като се има предвид, че ан ¯IRQ манипулаторът добавя $02 до $01 в акумулатора като основна обработка, докато ¯NMI се издава, а основната обработка за ¯NMI добавя $05 до $04 в акумулатора, напишете асемблер за двата манипулатора, включително техните извиквания. Обаждането до ¯IRQ манипулаторът трябва да е на адрес $0200. The ¯IRQ манипулаторът трябва да започне на адрес $0300. The ¯NMI манипулаторът трябва да започне на адрес $0400. Резултатът от ¯IRQ манипулаторът трябва да бъде поставен на адрес $0500, а резултатът от ¯NMI манипулаторът трябва да бъде поставен на адрес $0501.

Решение:

NMISR PHA; Рутината на NMI започва тук на адрес $0400
PHX
PHY
;
LDA #$04
ADC #$05
STA $0501
;
PLY
PLX
PLA
RTI

ISR PHA ; тази инструкция е на адрес $0300
PHX
PHY
;
LDA #$01
ADC #$02
; JMP NMISR : коментира се, защото не е част от рутината
STA $0500; ще отиде в стека
;
PLY
PLX
PLA
RTI
;
JMP ISR; тази инструкция е на адрес $0200

6) Обяснете накратко как инструкцията BRK се използва за създаване на софтуерно прекъсване в компютър 65C02.

Решение:

Основният начин за прекъсване на софтуера за 65C02 µP е с помощта на подразбиращата се адресна инструкция BRK. Да приемем, че основната програма се изпълнява и среща BRK инструкция. От този момент адресът на следващата инструкция в компютъра трябва да бъде изпратен до стека, когато текущата инструкция завърши. След това трябва да се извика подпрограма за обработка на софтуерната инструкция. Тази подпрограма за прекъсване трябва да избута съдържанието на регистъра A, X и Y към стека. След като ядрото на подпрограмата бъде изпълнено, съдържанието на регистрите A, X и Y трябва да бъде изтеглено обратно от стека в техните регистри от завършващата подпрограма. Последният израз в рутината е RTI. Съдържанието на компютъра също се изтегля обратно от стека към компютъра автоматично поради RTI.

7) Създайте таблица, която сравнява и контрастира нормална подпрограма с рутинна услуга за прекъсване.

Решение:

8) Обяснете накратко основните режими на адресиране на 65C02 µP, като имате предвид примерите за инструкции на асемблерния език.

Решение:

Всяка инструкция за 6502 е един байт, последван от нула или повече операнди.

Режим на незабавно адресиране
При режима на незабавно адресиране след операнда е стойността, а не адресът на паметта. Стойността трябва да се предхожда от #. Ако стойността е шестнадесетична, тогава „#“ трябва да бъде последвано от „$“. Инструкциите за непосредствено адресиране за 65C02 са: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Читателят трябва да се консултира с документацията за 65C02 µP, за да знае как да използва инструкциите, които са изброени тук, но не са обяснени в тази глава. Примерна инструкция е:

LDA #$77

Режим на абсолютно адресиране
При режима на абсолютно адресиране има един операнд. Този операнд е адресът на стойността в паметта (обикновено в шестнадесетична форма или етикет). Има 64K10 = 65,53610 адреса на паметта за 6502 µP. Обикновено еднобайтовата стойност е на един от тези адреси. Абсолютните инструкции за адресиране за 65C02 са: ADC, AND, ASL, BIT, CMP, CPX, CPY, DEC, EOR, INC, JMP, JSR, LDA, LDX, LDY, LSR, ORA, ROL, ROR, SBC, STA , STX, STY, STZ, TRB, TSB. Читателят трябва да се консултира с документацията за 65C02 µP, за да знае как да използва инструкциите, които са изброени тук, както и за останалите режими на адресиране, които не са обяснени в тази глава. Примерна инструкция е:

ТЕ СА $1234

Режим на подразбиращо се адресиране
При подразбиращия се режим на адресиране няма операнд. Всеки включен µP регистър се подразбира от инструкцията. Подразбиращите се инструкции за адресиране за 65C02 са: BRK, CLC, CLD, CLI, CLV, DEX, DEY, INX, INY, NOP, PHA, PHP, PHX, PHY, PLA, PLP, PLX, PLY, RTI, RTS, SEC , SED, SEI, TAX, TAY, TSX, TXA, TXS, TYA. Примерна инструкция е:

DEX: Намалява регистъра X с една единица.

Режим на относително адресиране
Режимът на относително адресиране работи само с инструкции за разклоняване. При режим на относително адресиране има само един операнд. Това е стойност от -12810 до +12710. Тази стойност се нарича отместване. Въз основа на знака тази стойност се добавя или изважда от следващата инструкция на програмния брояч към резултата в адреса на предвидената следваща инструкция. Инструкциите за режим на относителен адрес са: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Примерните инструкции са:

BNE $7F : (клон, ако Z = 0 в регистъра на състоянието, P)

който добавя 127 към текущия програмен брояч (адрес за изпълнение) и започва изпълнението на инструкцията на този адрес. По същия начин:

BEQ $F9 : (клон, ако Z = : в регистъра на състоянието, P)

което добавя -7 към текущия програмен брояч и започва изпълнението на новия адрес на програмния брояч. Операндът е число, допълващо две.

Абсолютно индексно адресиране
При адресиране с абсолютен индекс, съдържанието на регистъра X или Y се добавя към дадения абсолютен адрес (където и да е от $0000 до $FFFF, т.е. от 010 до 6553610), за да има реалния адрес. Този даден абсолютен адрес се нарича основен адрес. Ако се използва регистър X, инструкцията за асемблиране е нещо подобно:

LDA $C453,X

Ако се използва регистър Y, това би било нещо подобно:

LDA $C453,Y

Стойността за регистъра X или Y се нарича стойност на броя или индекса и може да бъде навсякъде от $00 (010) до $FF (25010). Не се нарича офсет.

Инструкциите за адресиране на абсолютен индекс са: ADC, AND, ASL (само X), BIT (с акумулатор и памет, само с X), CMP, DEC (само памет и X), EOR, INC (само памет и X), LDA , LDX, LDY, LSR (само X), ORA, ROL (само X), ROR (само X), SBC, STA, STZ (само X).

Абсолютно индиректно адресиране
Това се използва само с инструкция за скок. С това даденият абсолютен адрес има адрес на указател. Адресът на указателя се състои от два байта. Двубайтовият указател сочи към (е адреса на) целевата байтова стойност в паметта. И така, инструкцията за асемблерния език е следната:

JMP ($3456)

Със скобите и $13 в адрес $3456, докато $EB е в адрес $3457 (= $3456 + 1), адресът на дестинация е $13EB и $13EB е указателят. Абсолютните $3456 са в скобите в инструкцията.

9) а) Напишете програма на машинен език 6502, за да поставите „Обичам те!“ низ от ASCII кодове в паметта, започващ от $0300 адреса с дължината на низа. Програмата трябва да стартира на адрес $0200. Вземете всеки знак от акумулатора, като приемете, че те са изпратени там един по един от някаква подпрограма. Освен това сглобете програмата на ръка. (Ако трябва да знаете ASCII кодовете за „Обичам те!“, ето ги: „I“:4916, интервал: 2016, „l“: 6C16, „o“:6F16, „v“:7616, ' e':65, 'y':7916, 'u':7516 и '!':2116. Забележка: всеки код заема 1 байт).

б) Напишете програма на машинен език 6502, за да поставите „Обичам те!“ низ от ASCII кодове в паметта, започващ от адреса $0300 без дължината на низа, но завършващ на 0016. Програмата трябва да започне от адреса $0200. Вземете всеки символ от акумулатора, като приемете, че те са изпратени там един по един от някаква подпрограма. Освен това сглобете програмата на ръка.

Решение:

a) Стратегия: Има 12 байта за низа: 1 байт за дължината на низа и 11 байта за низовия литерал. И така, трябва да има 12 итерации (цикли), като се брои от 0. Това е: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Това са 12 числа.

Цялото число 0 се поставя в регистъра X и числото 1110 = 1210 – 110 = B16 = $0B се поставя в място на адрес в паметта, да речем адрес $0250. За всяка итерация стойността в регистъра X се увеличава и резултатът се сравнява с $0B в местоположението на адреса $0250. Веднага след като стойността в X е равна на стойността от $0B, итерацията спира. В този момент дължината (броят байтове) на низа и литерала на низа заемат адресните местоположения от $0300 до $030B (включително). За да се увеличават адресите на паметта от $0300, се използва регистър Y. Кодът е:

LDA #$0 млрд
ТЕ СА $0250
LDX #$00
LDY #$00
STA $0300; дължината на 11 се поставя в A от някаква подпрограма и отива на $0300
цикъл INX
ТАМ
CPY $0250
BEQ цикъл

b) Стратегия: Има 12 байта за низа: 1 байт за $00 Null терминатора и 11 байта за низовия литерал. И така, трябва да има 12 итерации (цикли), като се брои от 0. Това е: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Това са 12 числа.

Цялото число 0 се поставя в регистъра X и числото 1110 = 1210 – 110 = B16 = $0B се поставя в място на адрес в паметта, да речем адрес $0250. За всяка итерация стойността в регистъра X се увеличава и резултатът се сравнява с $0B в местоположението на адреса $0250. Веднага след като стойността в X е равна на стойността от $0B, итерацията спира. В този момент броят байтове на низовия литерал плюс нулевия знак заемат адресните местоположения от $0300 до $030B (включително). За да се увеличат адресите на паметта от $0300, се използва регистър Y. Кодът е:

LDA #$0 млрд
ТЕ СА $0250
LDX #$00
LDY #$00
STA $0300; „I“ се поставя в A от някаква подпрограма и отива на $0300
цикъл INX
ТАМ
CPY $0250
BEQ цикъл