Giải pháp cho các vấn đề của Chương 4 của Khóa học nghề nghiệp trên Internet và cơ sở dữ liệu khoa học máy tính trực tuyến đầy đủ ngay từ đầu

Giai Phap Cho Cac Van De Cua Chuong 4 Cua Khoa Hoc Nghe Nghiep Tren Internet Va Co So Du Lieu Khoa Hoc May Tinh Truc Tuyen Day Du Ngay Tu Dau



Vấn đề và giải pháp của họ

1) Viết chương trình hợp ngữ có giá khởi điểm là $0200 cho 6502 µP và thêm các số không dấu là 2A94 H (thêm) vào 2ABF H (tăng cường). Hãy để đầu vào và đầu ra ở trong bộ nhớ. Ngoài ra, hãy tạo tài liệu chương trình đã được lắp ráp bằng tay.







Giải pháp:



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



Chương trình lắp ráp:





2) Viết chương trình hợp ngữ có giá khởi điểm là $0200 cho 6502 µP và trừ các số không dấu, 1569 H (trừ) từ 2ABF H (trừ). Hãy để đầu vào và đầu ra ở trong bộ nhớ. Đồng thời tạo tài liệu chương trình đã lắp ráp bằng tay.



Giải pháp:

GIÂY
LDA $0213
SBC $0215
STA $0217
LDA $0214
SBC $0216
STA $0218

Chương trình lắp ráp:

3) Viết chương trình hợp ngữ cho 6502 µP đếm từ $00 đến $09 bằng cách sử dụng vòng lặp. Chương trình sẽ bắt đầu ở mức $0200. Ngoài ra, hãy tạo tài liệu chương trình đã được lắp ráp bằng tay.

Giải pháp:

LDA #$09
STA $0220 ; để so sánh X và $09
LDX #$00
vòng lặp INX
CPX $0220
vòng lặp BNE

Chương trình lắp ráp:

4) Viết chương trình hợp ngữ có giá khởi điểm là $0200 cho 6502 µP. Chương trình có hai chương trình con. Chương trình con thứ nhất cộng các số không dấu 0203 H (tăng cường) và 0102 H (bổ sung). Chương trình con thứ hai cộng tổng từ chương trình con thứ nhất là 0305 H đến 0006 H (tăng cường). Kết quả cuối cùng được lưu trữ trong bộ nhớ. Gọi chương trình con đầu tiên là FSTSUB và chương trình con thứ hai là SECSUB. Hãy để đầu vào và đầu ra ở trong bộ nhớ. Ngoài ra, hãy tạo tài liệu chương trình đã lắp ráp cho toàn bộ chương trình bằng tay.

Giải pháp:

SECSUB CLC
LDA $021A
ADC $0234
STA $0236
LDA $021 tỷ
ADC $0235
STA $0237
RTS

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

JSR FSTSUB

Chương trình lắp ráp:

5) Cho rằng một ¯IRQ trình xử lý thêm $02 vào $01 tại bộ tích lũy dưới dạng xử lý cốt lõi trong khi ¯NMI được ban hành và việc xử lý cốt lõi cho ¯NMI thêm $05 vào $04 tại bộ tích lũy, viết ngôn ngữ lắp ráp cho cả hai trình xử lý bao gồm cả các lệnh gọi của chúng. Cuộc gọi tới ¯IRQ trình xử lý phải ở địa chỉ $0200. Các ¯IRQ trình xử lý nên bắt đầu ở địa chỉ $0300. Các ¯NMI trình xử lý phải bắt đầu ở địa chỉ $0400. Kết quả của ¯IRQ bộ xử lý phải được đặt ở địa chỉ $0500, và kết quả của ¯NMI bộ xử lý phải được đặt ở địa chỉ $0501.

Giải pháp:

NMISR PHA ; Quy trình NMI bắt đầu tại đây tại địa chỉ $0400
PHX
vật lý
;
LDA #$04
ADC #$05
STA $0501
;
LỚP
PLX
PLA
RTI

ISR PHA ; hướng dẫn này ở địa chỉ $0300
PHX
vật lý
;
LDA #$01
ADC #$02
; JMP NMISR : đã nhận xét vì nó không phải là một phần của thói quen
STA $0500 ; sẽ vào ngăn xếp
;
LỚP
PLX
PLA
RTI
;
ISR JMP; hướng dẫn này ở địa chỉ $0200

6) Giải thích ngắn gọn cách sử dụng lệnh BRK để tạo ra ngắt phần mềm trong máy tính 65C02.

Giải pháp:

Cách chính để tạo ra ngắt phần mềm cho 65C02 µP là sử dụng lệnh địa chỉ ngụ ý BRK. Giả sử chương trình chính đang chạy và gặp lệnh BRK. Từ thời điểm đó, địa chỉ của lệnh tiếp theo trong PC sẽ được gửi vào ngăn xếp khi lệnh hiện tại hoàn thành. Một chương trình con để xử lý lệnh phần mềm sẽ được gọi tiếp theo. Chương trình con ngắt này sẽ đẩy nội dung thanh ghi A, X và Y vào ngăn xếp. Sau khi phần lõi của chương trình con được thực thi, nội dung của các thanh ghi A, X và Y sẽ được kéo trở lại từ ngăn xếp về các thanh ghi của chúng bằng chương trình con hoàn thành. Câu lệnh cuối cùng trong quy trình là RTI. Nội dung PC cũng được tự động kéo trở lại từ ngăn xếp về PC do RTI.

7) Lập bảng so sánh và đối chiếu một chương trình con bình thường với một chương trình phục vụ ngắt.

Giải pháp:

8) Giải thích ngắn gọn các chế độ đánh địa chỉ chính của 65C02 µP dựa trên các ví dụ về lệnh hợp ngữ.

Giải pháp:

Mỗi lệnh cho 6502 là một byte, theo sau là 0 hoặc nhiều toán hạng.

Chế độ đánh địa chỉ tức thời
Với chế độ đánh địa chỉ tức thời, sau toán hạng là giá trị chứ không phải địa chỉ bộ nhớ. Giá trị phải được bắt đầu bằng #. Nếu giá trị ở dạng thập lục phân thì “#” phải theo sau là “$”. Các lệnh đánh địa chỉ trực tiếp cho 65C02 là: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Người đọc nên tham khảo tài liệu về 65C02 µP để biết cách sử dụng các hướng dẫn được liệt kê ở đây mà chưa được giải thích trong chương này. Một hướng dẫn ví dụ là:

LDA #$77

Chế độ đánh địa chỉ tuyệt đối
Với chế độ đánh địa chỉ tuyệt đối, chỉ có một toán hạng. Toán hạng này là địa chỉ của giá trị trong bộ nhớ (thường ở dạng thập lục phân hoặc nhãn). Có 64K10 = 65,53610 địa chỉ bộ nhớ cho 6502 µP. Thông thường, giá trị một byte nằm ở một trong những địa chỉ này. Các hướng dẫn đánh địa chỉ tuyệt đối cho 65C02 là: 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. Người đọc nên tham khảo tài liệu về 65C02 µP để biết cách sử dụng các lệnh được liệt kê ở đây cũng như các chế độ địa chỉ còn lại chưa được giải thích trong chương này. Một hướng dẫn ví dụ là:

HỌ LÀ $1234

Chế độ địa chỉ ngụ ý
Với chế độ địa chỉ ngụ ý, không có toán hạng. Bất kỳ thanh ghi µP nào liên quan đều được hàm ý trong lệnh. Các hướng dẫn đánh địa chỉ ngụ ý cho 65C02 là: BRK, CLC, CLD, CLI, CLV, DEX, DEY, INX, INY, NOP, PHA, PHP, PHX, PHY, PLA, PLP, PLX, PLY, RTI, RTS, SEC , SED, SEI, THUẾ, TAY, TSX, TXA, TXS, TYA. Một hướng dẫn ví dụ là:

DEX: Giảm thanh ghi X đi một đơn vị.

Chế độ đánh địa chỉ tương đối
Chế độ đánh địa chỉ tương đối chỉ xử lý các lệnh nhánh. Với chế độ đánh địa chỉ tương đối, chỉ có một toán hạng. Đó là giá trị từ -12810 đến +12710. Giá trị này được gọi là offset. Dựa vào dấu hiệu, giá trị này được cộng hoặc trừ từ lệnh tiếp theo của Bộ đếm chương trình cho đến kết quả trong địa chỉ của lệnh tiếp theo dự định. Các hướng dẫn chế độ địa chỉ tương đối là: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Các ví dụ hướng dẫn là:

BNE $7F : (nhánh nếu Z = 0 trong thanh ghi trạng thái, P)

thêm 127 vào bộ đếm chương trình hiện tại (địa chỉ để thực thi) và bắt đầu thực hiện lệnh tại địa chỉ đó. Tương tự:

BEQ $F9 : (nhánh nếu Z = : trong thanh ghi trạng thái, P)

thêm -7 vào bộ đếm chương trình hiện tại và bắt đầu thực thi tại địa chỉ bộ đếm chương trình mới. Toán hạng là số bù hai.

Địa chỉ chỉ mục tuyệt đối
Với địa chỉ chỉ mục tuyệt đối, nội dung của thanh ghi X hoặc Y được thêm vào địa chỉ tuyệt đối đã cho (bất kỳ nơi nào từ $0000 đến $FFFF, tức là từ 010 đến 6553610) để có địa chỉ thực. Địa chỉ tuyệt đối đã cho này được gọi là địa chỉ cơ sở. Nếu thanh ghi X được sử dụng, hướng dẫn lắp ráp sẽ giống như thế này:

LDA $C453,X

Nếu thanh ghi Y được sử dụng, nó sẽ giống như thế này:

LDA $C453,Y

Giá trị cho thanh ghi X hoặc Y được gọi là giá trị đếm hoặc chỉ số và nó có thể ở bất kỳ đâu từ $00 (010) đến $FF (25010). Nó không được gọi là bù đắp.

Các lệnh đánh địa chỉ chỉ số tuyệt đối là: ADC, AND, ASL (chỉ X), BIT (với bộ tích lũy và bộ nhớ, chỉ với X), CMP, DEC (chỉ bộ nhớ và X), EOR, INC (chỉ bộ nhớ và X), LDA , LDX, LDY, LSR (chỉ X), ORA, ROL (chỉ X), ROR (chỉ X), SBC, STA, STZ (chỉ X).

Địa chỉ gián tiếp tuyệt đối
Điều này chỉ được sử dụng với lệnh nhảy. Với điều này, địa chỉ tuyệt đối đã cho có một địa chỉ con trỏ. Địa chỉ con trỏ bao gồm hai byte. Con trỏ hai byte trỏ tới (là địa chỉ của) giá trị byte đích trong bộ nhớ. Vì vậy, hướng dẫn hợp ngữ như sau:

JMP ($3456)

Với dấu ngoặc đơn và $13 trong địa chỉ $3456 trong khi $EB ở địa chỉ $3457 (= $3456 + 1), địa chỉ đích là $13EB và $13EB là con trỏ. Tuyệt đối $3456 nằm trong ngoặc đơn trong hướng dẫn.

9) a) Viết chương trình ngôn ngữ máy 6502 để đặt câu “Anh yêu em!” chuỗi mã ASCII trong bộ nhớ, bắt đầu từ địa chỉ $0300 với độ dài của chuỗi. Chương trình sẽ bắt đầu tại địa chỉ $0200. Lấy từng ký tự từ bộ tích lũy, giả sử rằng chúng được gửi từng ký tự đến đó bởi một chương trình con nào đó. Ngoài ra, hãy biên dịch chương trình bằng tay. (Nếu bạn cần biết mã ASCII cho “Anh yêu em!” thì đây là: 'I':4916, space : 2016, 'l': 6C16, 'o':6F16, 'v':7616, ' e':65, 'y':7916, 'u':7516, và '!':2116. Lưu ý: mỗi mã chiếm 1 byte).

b) Viết chương trình ngôn ngữ máy 6502 để viết câu “Anh yêu em!” chuỗi mã ASCII trong bộ nhớ, bắt đầu từ địa chỉ $0300 không có độ dài chuỗi nhưng kết thúc bằng 0016. Chương trình sẽ bắt đầu tại địa chỉ $0200. Lấy từng ký tự từ bộ tích lũy, giả sử rằng chúng được gửi từng ký tự đến đó bởi một chương trình con nào đó. Ngoài ra, lắp ráp chương trình bằng tay.

Giải pháp:

a) Chiến lược: Có 12 byte cho chuỗi: 1 byte cho độ dài chuỗi và 11 byte cho chuỗi ký tự. Vì vậy, phải có 12 lần lặp (vòng lặp) đếm từ 0. Tức là: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Đây là 12 số.

Số nguyên 0 được đặt trong thanh ghi X và số 1110 = 1210 – 110 = B16 = $0B được đặt ở một vị trí địa chỉ trong bộ nhớ, giả sử địa chỉ $0250. Đối với mỗi lần lặp, giá trị trong thanh ghi X được tăng lên và kết quả được so sánh với $0B ở vị trí địa chỉ $0250. Ngay sau khi giá trị trong X bằng giá trị $0B, quá trình lặp sẽ dừng lại. Tại thời điểm này, độ dài (số byte) của chuỗi và chuỗi ký tự chiếm các vị trí địa chỉ $0300 đến $030B (đã bao gồm). Để tăng địa chỉ bộ nhớ từ $0300, thanh ghi Y được sử dụng. Mã là:

LDA #$0B
HỌ LÀ $0250
LDX #$00
LDY #$00
STA $0300 ; độ dài của 11 được một chương trình con nào đó đưa vào A và lên tới $0300
vòng lặp INX
Ở ĐÓ
CPY $0250
vòng lặp BEQ

b) Chiến lược: Có 12 byte cho chuỗi: 1 byte cho bộ kết thúc Null $00 và 11 byte cho chuỗi ký tự. Vì vậy, phải có 12 lần lặp (vòng lặp) đếm từ 0. Tức là: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Đây là 12 số.

Số nguyên 0 được đặt trong thanh ghi X và số 1110 = 1210 – 110 = B16 = $0B được đặt ở một vị trí địa chỉ trong bộ nhớ, giả sử địa chỉ $0250. Đối với mỗi lần lặp, giá trị trong thanh ghi X được tăng lên và kết quả được so sánh với $0B ở vị trí địa chỉ $0250. Ngay sau khi giá trị trong X bằng giá trị $0B, quá trình lặp sẽ dừng lại. Tại thời điểm này, số byte của chuỗi ký tự cộng với ký tự Null chiếm các vị trí địa chỉ $0300 đến $030B (đã bao gồm). Để tăng địa chỉ bộ nhớ từ $0300, thanh ghi Y được sử dụng. Mã là:

LDA #$0B
HỌ LÀ $0250
LDX #$00
LDY#$00
STA $0300 ; “I” được một chương trình con nào đó đưa vào A và có giá trị là $0300
vòng lặp INX
Ở ĐÓ
CPY $0250
vòng lặp BEQ