Đề thi vi xử lý có đáp án 3
Trang 1VXL_KTGHK_AY1213-S2_trang 1/6
ĐHQG TPHCM–ĐH Bách Khoa
Khoa Đ-ĐT–BM Điện Tử
Điểm Đáp án của Đề kiểm tra giửa HK 2 – NH: 2012-2013
Môn: Vi xử lý – Mã MH: 402030
Ngày thi: 20/03/2013 – Thời gian làm bài: 80 phút
Đề có 4 trang và SV làm trực tiếp trên đề
(SV được sử dụng tài liệu của mình, KHÔNG được dùng Laptop)
Chữ ký giám thị
Họ và tên SV: MSSV: Nhóm:
Hồ Trung Mỹ
Chú ý: Xem phụ lục để coi cách giải khác (nếu có) từ trang 5 Câu 1: (3 đ)
Mạch giải mã địa chỉ cho các bộ nhớ (có số bit dữ liệu là 8) dùng 74138 như hình sau:
a) Xác định vùng địa chỉ của các ngõ ra /Yi:
A19 A18 A17 A16 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 Vùng địa chỉ (hex)
0 1 0 1 0 0 0 X X X X X X X X X X X X X /Y0: 50000 – 51FFF
0 1 0 1 0 0 1 X X X X X X X X X X X X X /Y1: 52000 – 53FFF
0 1 0 1 0 1 0 X X X X X X X X X X X X X /Y2: 54000 – 55FFF
0 1 0 1 0 1 1 X X X X X X X X X X X X X /Y3: 56000 – 57FFF
0 1 0 1 1 0 0 X X X X X X X X X X X X X /Y4: 58000 – 59FFF
0 1 0 1 1 0 1 X X X X X X X X X X X X X /Y5: 5A000 – 5BFFF
0 1 0 1 1 1 0 X X X X X X X X X X X X X /Y6: 5C000 – 5DFFF
0 1 0 1 1 1 1 X X X X X X X X X X X X X /Y7: 5E000 – 5FFFF
b) Từ mạch giải mã trên, sử dụng thêm các cổng logic cần thiết để tạo ra các tín hiệu chọn chip /CS0, /CS1, /CS2 (giải mã địa chỉ toàn phần) tích cực thấp và có các vùng địa chỉ liên tục Vẽ hình trực tiếp lên mạch giải mã phía trên
Tín hiệu chọn chip Vùng địa chỉ (Hex)
/CS0 (16 KB) 50000 – 53FFF /CS1 ( 2 KB) 54000 – 547FF /CS2 (20 KB) 54800 – 597FF
Trang 2Câu 2: (1 đ)
Thiết kế bộ nhớ RAM tĩnh 16Kx8 từ 2 RAM 8Kx4, 1 RAM 8Kx8, và 1 số cổng logic:
Câu 3: (1 đ)
Viết các “từ điều khiển” (control word) để thực hiện phép toán sau:
R3 3 x R1/2 – 2 x (bù 1 của R2) Các tác vụ Chú thích Từ điểu khiển
SELA SELB SELD OPR
Phụ lục: Ý nghĩa của các vùng trong “từ điều khiển”
Mã nhị phân SELA SELB SELD
000 Input Input Output
OPR Tác vụ Ký hiệu
00000 Chuyển A (output = A) TSFA
00001 Tăng A thêm 1 INCA
00010 A + B ADD
00101 A – B SUB
00110 Giảm A đi 1 DECA
01000 A AND B AND
01010 A OR B OR
01100 A XOR B XOR
10000 Dịch phải A SHRA
11000 Dịch trái A SHLA
Trang 3VXL_KTGHK_AY1213-S2_trang 3/6
Câu 4: (1.5 đ)
Cho trước đoạn chương trình hợp ngữ Z80 sau:
Địa chỉ
Định địa chỉ của Toán hạng 1 Toán hạng 2 CONST: EQU KKKK
0100 21 47 15 LD HL, CONST ; ** Thanh ghi Tức thời mở rộng
0106 28 05 JR Z, L2
a) (0.5 đ) Hãy ghi các cách địa chỉ cho các dòng lệnh in đậm và nghiêng (đánh dấu **) (0.5 đ)
b) (1 đ) Hãy tìm các giá trị của KKKK và NN (hex): KKKK = 1547H và NN = F8H
Câu 5: (1.5 đ) Phân tích chương trình hợp ngữ Z80 Giả sử kết quả tính được 255
ORG 100H
LD B,3
LD HL,TABLE
XOR A
L1: ADC A,(HL)
INC HL
DJNZ L1
LD (VAR1),A
SRA A
SRA A
LD D,A
SRA A
SRA A
LD E,A
SRA A
ADD A,E
ADD A,D
LD (VAR2),A
JR $
org 200h
TABLE: DEFB 12
DEFB 25
DEFB 67
VAR1: DEFS 1
VAR2: DEFS 1
a) (0.5 đ) Điền dạng số hex cho HL và dạng số thập phân cho (HL) và A:
Trước khi thực thi ADC và INC
Sau khi thực thi ADC và INC
Lần lặp HL A (HL) Cờ C A Cờ C HL
b) (0.5 đ) Sau khi thực thi chương trình thì nội dung (dạng số thập phân) của các biến VAR1 và VAR2 là
(VAR1) = 104D (VAR2) = 35D
c) (0.5 đ) Hãy cho biết chương trình này làm gì? Giải thích
Chương trình tính tổng 3 số 8 bit trong bộ nhớ bắt đầu
từ địa chỉ 0200H rồi cất vào biến VAR1, và tính trung bình cộng của 3 số này rồi cất vào biến VAR2
Giải thích:
Vòng lặp L1 để cộng dồn 3 số 8 bit cho trị số Tổng
Các lần dịch phải và cộng lại tương ứng thực hiện:
A = Tổng x (1/4 + 1/16 + 1/32) = Tổng x 0.34 Ngoài ra: 1/3 = 0.3333
Như vậy tính được gần đúng Tổng/3
Trang 4Câu 6: (1 đ) Lập trình hợp ngữ Z80
a) (0.5 đ) Viết chương trình con COMP_U8 để thực hiện so sánh 2 số 8 bit không dấu trong thanh ghi A
và B Nếu A bằng B thì cờ C = 1, và ngược lại thì cờ C = 0
b) (0.5 đ) Viết đoạn chương trình bắt đầu từ địa chỉ 200H và áp dụng chương trình con COMP_U8 để thực hiện OR 4 bit thấp của thanh ghi D và kết quả phép toán OR 4 bit này cất ở LSB của thanh ghi E (Thí dụ: D = 00100111B thì thanh ghi E = 01H, và D = 111110000B thì thanh ghi E = 00H)
Chương trình con COMP_U8 Đoạn chương trình áp dụng COMP_U8
COMP_U8:
CP B
JR Z,OUT_1
AND A ; C <- 0
RET
OUT_1:
SCF ; C <- 1
RET
ORG 200H
; Chuẩn bị sẵn dữ liệu trong
; thanh ghi D
LD A,D AND 0FH ; Cách 2: OR 0F0H
LD B,0 ; Cách 2: LD B,0F0H
CALL COMP_U8
JR C,OR_OUT_0 SET 0,E ; hoặc LD E,1
JR CONTINUE OR_OUT_0:
RES 0,E ; hoặc LD E,0 CONTINUE:
JR $
Câu 7: (1 đ) Lập trình hợp ngữ Z80
a) (0.5 đ) Viết chương trình con Is_ASCII_Number kiểm tra nội dung của thanh ghi A nếu thuộc tập số
ASCII ( ‘0’ = 30H đến ‘9’ = 39H) thì cờ C = 1, và nếu không thuộc tập số ASCII thì cho cờ C = 0 b) (0.5 đ) Áp dụng chương trình con Is_ASCII_Number để đếm số byte là ASCII chữ trong 1 bảng có địa đầu trong HL và chiều dài bảng trong thanh ghi B, kết quả đếm được cất vào biến SUM
Chương trình con Is_ASCII_Number Áp dụng chương trình con Is_ASCII_Number
Is_ASCII_Number:
CP '0' ; hoac CP 30H
JR C, OUT_0
CP '9'+1 ; hoac CP 3AH
JR NC, OUT_0
; '0' <= A <= '9' SCF
RET
OUT_0: ; A < '0' hoac A > '9'
AND A ; C <- 0 RET
ORG 100h
LD HL,TABLE
LD B,5
LD D,0 LOOP: LD A,(HL) CALL Is_ASCII_Number
JR NC,NEXT INC D
NEXT: INC HL DJNZ LOOP
LD A,D
LD (SUM),A
JR $
ORG 200H TABLE: DEFB 'A' DEFB '0' DEFB '1' DEFB '1' DEFB 'C' SUM: DEFS 1
Kết thúc bài kiểm tra
Trang 5VXL_KTGHK_AY1213-S2_trang 5/6
Phụ lục: Một cách giải khác cho các câu hỏi trên
Câu 1:
b) Phần mạch giải mã địa chỉ cho /CS2
Câu 2:
SV làm thiếu đường /CS của bộ nhớ 16Kx8 cũng được tối đa điểm cho câu này:
Câu 3:
Có nhiều cách để viết các “từ điều khiển” thực hiện phép tính: R3 3 x R1/2 – 2 x (bù 1 của R2)
Cách 2:
Các tác vụ Chú thích Từ điểu khiển
SELA SELB SELD OPR R0 R1/2 Dịch phải = chia 2 001 000 000 10000
R3 bù 1 của R2 010 000 011 01110 R3 R1 – R3 R3 = R1 – bù 1 của R2 001 011 011 00101
R3 R3 + R3 R3 = 2R1 – 2(bù 1 của R2) 011 011 011 00010
R3 R3 – R0 Kết quả cần tính 011 000 011 00101
Trang 6
Câu 6:
Các cách viết khác cho chương trình con COMP_U8:
Chương trình con COMP_U8 – Cách 2 Chương trình con COMP_U8 – Cách 3
COMP_U8:
CP B
SCF ; C <- 1
RET Z
AND A ; C <- 0
; hoặc thay dòng AND A bằng CCF
RET
COMP_U8:
CP B
JR NZ, OUT_0 SCF ; C <- 1 RET
OUT_0: AND A ; C <- 0 RET
Câu 7:
Cách viết khác cho chương trình con Is_ASCII_Number:
Is_ASCII_Number:
CP '0' ; hoac CP 30H
JR C, NOT_C CONTINUE:
; A ‘0’ và Kiểm tra tiếp xem A ‘9’ ?
CP '9' ; hoac CP 39H
JR NZ, NEXT
; khi A = ‘9’ thì Z = 1 và C = 0 NOT_C: CCF ; C <- NOT(C)
RET NEXT: ; tr ường hợp A ‘9’
; khi A > ‘9’ thì Z = 0 và C = 0
; khi A < ‘9’ thì Z = 0 và C = 1
RET