전체 온라인 컴퓨터 과학 데이터베이스 및 인터넷 취업 과정 4장의 문제를 처음부터 해결하는 방법

Jeonche Onlain Keompyuteo Gwahag Deiteobeiseu Mich Inteones Chwieob Gwajeong 4jang Ui Munjeleul Cheoeumbuteo Haegyeolhaneun Bangbeob



문제와 해결책

1) 6502 µP에 대해 $0200부터 시작하고 2A94의 부호 없는 숫자를 추가하는 어셈블리 언어 프로그램을 작성하십시오. 시간 (추가) 2ABF에 시간 (Agend). 입력과 출력이 메모리에 있도록 하세요. 또한, 조립된 프로그램 문서를 직접 제작합니다.







해결책:



씨엘씨
LDA$0213
ADC $0215
STA $0217
LDA$0214
ADC $0216
STA $0218



조립된 프로그램:





2) 6502 µP에 대해 $0200부터 시작하고 부호 없는 숫자 1569를 빼는 어셈블리 언어 프로그램을 작성하십시오. 시간 (감수) 2ABF에서 시간 (피감수). 입력과 출력을 메모리에 두십시오. 또한 조립된 프로그램 문서를 직접 제작합니다.



해결책:

비서
LDA$0213
SBC $0215
STA $0217
LDA$0214
SBC $0216
STA $0218

조립된 프로그램:

3) 루프를 사용하여 $00부터 $09까지 계산하는 6502 µP용 어셈블리 언어 프로그램을 작성합니다. 프로그램은 $0200부터 시작해야 합니다. 또한, 조립된 프로그램 문서를 직접 제작합니다.

해결책:

LDA #$09
STA $0220 ; X와 $09를 비교하기 위해
LDX #$00
루프 INX
CPX $0220
BNE 루프

조립된 프로그램:

4) 6502 µP에 대해 $0200부터 시작하는 어셈블리 언어 프로그램을 작성하십시오. 이 프로그램에는 두 개의 서브루틴이 있습니다. 첫 번째 서브루틴은 부호 없는 숫자 0203을 추가합니다. 시간 (augend) 및 0102 시간 (가수). 두 번째 서브루틴은 첫 번째 서브루틴의 합계인 0305를 더합니다. 시간 0006까지 시간 (Agend). 최종 결과는 메모리에 저장됩니다. FSTSUB인 첫 번째 서브루틴과 SECSUB인 두 번째 서브루틴을 호출합니다. 입력과 출력이 메모리에 있도록 하세요. 또한 전체 프로그램에 대해 조립된 프로그램 문서를 수작업으로 제작합니다.

해결책:

SECSUB CLC
LDA $021A
ADC $0234
STA $0236
LDA $021B
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의 주소에 있어야 합니다. 그만큼 ̅IRQ 핸들러는 $0300의 주소에서 시작해야 합니다. 그만큼 ̅NMI 핸들러는 $0400의 주소에서 시작해야 합니다. 결과는 ̅IRQ 핸들러는 $0500의 주소에 있어야 하며, 그 결과는 ̅NMI 핸들러는 $0501 주소에 있어야 합니다.

해결책:

NMISR PHA; NMI 루틴은 여기 $0400 주소에서 시작됩니다.
PHX
PHY
;
LDA #$04
ADC #$05
STA $0501
;
주름
PLX
PLA
RTI

ISR PHA; 이 명령은 $0300 주소에 있습니다
PHX
PHY
;
LDA #$01
ADC #$02
; JMP NMISR: 루틴의 일부가 아니기 때문에 주석 처리되었습니다.
STA $0500 ; 스택으로 갈거야
;
주름
PLX
PLA
RTI
;
JMP ISR ; 이 명령은 $0200 주소에 있습니다

6) 65C02 컴퓨터에서 BRK 명령을 사용하여 소프트웨어 인터럽트를 생성하는 방법을 간략하게 설명하십시오.

해결책:

65C02 µP에 대한 소프트웨어 인터럽트를 발생시키는 주요 방법은 BRK 묵시적 주소 명령어를 사용하는 것입니다. 메인 프로그램이 실행 중이고 BRK 명령어를 만났다고 가정합니다. 그 시점부터 현재 명령어가 완료되면 PC의 다음 명령어 주소가 스택으로 전송되어야 합니다. 소프트웨어 명령을 처리하는 서브루틴은 다음에 호출되어야 합니다. 이 인터럽트 서브루틴은 A, X, Y 레지스터 내용을 스택에 푸시해야 합니다. 서브루틴의 핵심이 실행된 후, 완성된 서브루틴에 의해 A, X, Y 레지스터의 내용이 스택에서 해당 레지스터로 풀백되어야 합니다. 루틴의 마지막 문은 RTI입니다. RTI 덕분에 PC 콘텐츠도 스택에서 PC로 자동으로 풀백됩니다.

7) 일반 서브루틴과 인터럽트 서비스 루틴을 비교하고 대조하는 표를 작성하십시오.

해결책:

8) 어셈블리 언어 명령어 예제를 통해 65C02 µP의 주요 주소 지정 모드를 간략하게 설명합니다.

해결책:

6502의 각 명령어는 1바이트이고 그 뒤에 0개 이상의 피연산자가 옵니다.

즉시 주소 지정 모드
즉시 주소 지정 모드에서는 피연산자 뒤에 값이 있고 메모리 주소는 없습니다. 값 앞에는 #이 와야 합니다. 값이 16진수인 경우 '#' 뒤에 '$'가 와야 합니다. 65C02에 대한 즉시 주소 지정 명령은 ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC입니다. 이 장에서 설명되지 않은 여기에 나열된 지침을 사용하는 방법을 알아보려면 독자는 65C02 µP에 대한 설명서를 참조해야 합니다. 예제 지침은 다음과 같습니다.

LDA #$77

절대 주소 지정 모드
절대 주소 지정 모드에는 피연산자가 하나 있습니다. 이 피연산자는 메모리에 있는 값의 주소입니다(보통 16진수 또는 레이블). 6502 µP에는 64K10 = 65,53610개의 메모리 주소가 있습니다. 일반적으로 1바이트 값은 이러한 주소 중 하나에 있습니다. 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, 세금, 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을 추가하고 새 프로그램 카운터 주소에서 실행을 시작합니다. 피연산자는 2의 보수입니다.

절대 인덱스 주소 지정
절대 인덱스 주소 지정을 사용하면 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만).

절대 간접 주소 지정
이는 점프 명령에만 사용됩니다. 이를 통해 주어진 절대 주소에는 포인터 주소가 있습니다. 포인터 주소는 2바이트로 구성됩니다. 2바이트 포인터는 메모리의 대상 바이트 값을 가리킵니다(주소). 따라서 어셈블리 언어 명령어는 다음과 같습니다.

JMP ($3456)

$3456 주소에 괄호와 $13이 있고 $EB가 $3457(= $3456 + 1) 주소에 있으면 대상 주소는 $13EB이고 $13EB가 포인터입니다. 절대 $3456은 지침의 괄호 안에 있습니다.

9) a) '사랑해!'를 입력하는 6502 기계어 프로그램을 작성하세요. $0300 주소부터 문자열 길이로 시작하는 메모리의 ASCII 코드 문자열입니다. 프로그램은 $0200 주소에서 시작해야 합니다. 일부 서브루틴에 의해 하나씩 거기로 전송된다고 가정하고 누산기에서 각 문자를 얻습니다. 또한 프로그램을 손으로 조립하십시오. (“사랑해요!”에 대한 ASCII 코드를 알아야 하는 경우 다음과 같습니다: 'I':4916, space : 2016, 'l': 6C16, 'o':6F16, 'v':7616, ' e':65, 'y':7916, 'u':7516, '!':2116. 참고: 각 코드는 1바이트를 차지합니다.

b) '사랑해!'를 입력하는 6502 기계어 프로그램을 작성하세요. 문자열 길이가 없는 $0300 주소에서 시작하지만 0016으로 끝나는 메모리의 ASCII 코드 문자열입니다. 프로그램은 $0200 주소에서 시작해야 합니다. 일부 서브루틴에 의해 하나씩 거기로 전송된다고 가정하고 누산기에서 각 문자를 얻습니다. 또한 프로그램을 손으로 조립하십시오.

해결책:

a) 전략: 문자열에는 12바이트가 있습니다. 즉, 문자열 길이에 1바이트, 문자열 리터럴에 11바이트가 있습니다. 따라서 0부터 세어 12번의 반복(루핑)이 있어야 합니다. 즉, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11입니다. 이는 12개의 숫자입니다.

0 정수는 X 레지스터에 저장되고 숫자 1110 = 1210 – 110 = B16 = $0B는 메모리의 주소 위치, 즉 주소 $0250에 저장됩니다. 각 반복마다 X 레지스터의 값이 증가하고 결과는 $0250 주소 위치의 $0B와 비교됩니다. X의 값이 $0B의 값과 같아진 직후에 반복이 중지됩니다. 이때 문자열의 길이(바이트 수)와 문자열 리터럴은 $0300 ~ $030B(포함) 주소 위치를 차지합니다. $0300부터 메모리 주소를 증가시키기 위해 Y 레지스터가 사용됩니다. 코드는 다음과 같습니다

LDA #$00억
가격은 $0250입니다
LDX #$00
LDY#$00
STA $0300 ; 11의 길이는 일부 서브루틴에 의해 A에 입력되고 $0300로 이동합니다.
루프 INX
거기
CPY $0250
BEQ 루프

b) 전략: 문자열에는 12바이트가 있습니다. $00 Null 종결자에 1바이트, 문자열 리터럴에 11바이트입니다. 따라서 0부터 세어 12번의 반복(루핑)이 있어야 합니다. 즉, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11입니다. 이는 12개의 숫자입니다.

0 정수는 X 레지스터에 저장되고 숫자 1110 = 1210 – 110 = B16 = $0B는 메모리의 주소 위치, 즉 주소 $0250에 저장됩니다. 각 반복마다 X 레지스터의 값이 증가하고 결과는 $0250 주소 위치의 $0B와 비교됩니다. X의 값이 $0B의 값과 같아진 직후에 반복이 중지됩니다. 이 시점에서 문자열 리터럴의 바이트 수와 Null 문자가 $0300 ~ $030B(포함) 주소 위치를 차지합니다. $0300부터 메모리 주소를 증가시키기 위해 Y 레지스터가 사용됩니다. 코드는 다음과 같습니다

LDA #$00억
가격은 $0250입니다
LDX #$00
LDY#$00
STA $0300 ; 'I'는 일부 서브루틴에 의해 A에 추가되고 $0300로 이동합니다.
루프 INX
거기
CPY $0250
BEQ 루프