Việc nắm vững các bài tập cấu trúc máy tính và nguyên lý hoạt động của vi xử lý là nền tảng cốt lõi cho những ai đam mê công nghệ thông tin và kỹ thuật máy tính. Bài viết này của maytinhgiaphat.vn được thiết kế để cung cấp cái nhìn toàn diện, chuyên sâu về vi xử lý Intel 8086, cấu trúc máy tính cơ bản, cùng với các ví dụ thực tế về lập trình hợp ngữ và ghép nối phần cứng. Dù bạn là sinh viên, kỹ sư hay chỉ đơn thuần là người muốn tìm hiểu sâu hơn, nội dung này sẽ giúp bạn củng cố kiến thức và ứng dụng vào thực tiễn một cách hiệu quả, giúp bạn đạt được mục tiêu học tập và nghiên cứu của mình.

Tổng Quan Về Vi Xử Lý Và Cấu Trúc Máy Tính
Trong kỷ nguyên công nghệ số, máy tính đã trở thành một phần không thể thiếu trong mọi khía cạnh của đời sống. Để hiểu rõ cách thức hoạt động của chúng, việc tìm hiểu về vi xử lý và cấu trúc máy tính là vô cùng quan trọng. Đây là những kiến thức nền tảng giúp chúng ta nắm bắt được “bộ não” của hệ thống và cách nó tương tác với thế giới bên ngoài.
Khái Niệm Cơ Bản
Vi xử lý, hay còn gọi là Bộ Xử Lý Trung Tâm (CPU – Central Processing Unit), là thành phần trung tâm của mọi hệ thống máy tính. Vai trò của nó bao gồm xử lý thông tin, thực hiện các phép tính toán, quản lý dữ liệu đầu vào/đầu ra, và điều khiển các thiết bị ngoại vi. Có thể hình dung vi xử lý như bộ não, nơi mọi hoạt động tính toán và điều hành được diễn ra. Một hệ thống máy tính hoàn chỉnh không chỉ có CPU mà còn bao gồm bộ nhớ (ROM, RAM) và các thiết bị ngoại vi, tất cả được kết nối với nhau thông qua bus hệ thống để tạo thành một thể thống nhất.
Các Thành Phần Chính Của Cấu Trúc Máy Tính
Một máy tính hoàn chỉnh được xây dựng dựa trên sự phối hợp nhịp nhàng của nhiều thành phần. Mỗi thành phần đảm nhiệm một vai trò cụ thể, đóng góp vào hiệu suất và khả năng vận hành của toàn bộ hệ thống.
- Bộ Vi Xử Lý (CPU – Central Processing Unit): Là “trái tim” và “bộ não” của máy tính. CPU chịu trách nhiệm thực thi mọi lệnh từ hệ điều hành và các ứng dụng, xử lý dữ liệu, thực hiện các phép toán phức tạp, và điều phối hoạt động của các thành phần khác. Đây là nơi các luồng thông tin được chuyển đổi và xử lý thành kết quả đầu ra.
- Bộ Nhớ: Bộ nhớ trong máy tính được phân chia thành hai loại chính với chức năng riêng biệt:
- RAM (Random Access Memory): Là bộ nhớ truy cập ngẫu nhiên, cho phép đọc và ghi dữ liệu. RAM lưu trữ tạm thời các chương trình và dữ liệu đang được CPU xử lý. Đặc điểm của RAM là dữ liệu sẽ bị mất đi khi máy tính tắt nguồn.
- ROM (Read Only Memory): Là bộ nhớ chỉ đọc, chứa các chương trình khởi động hệ thống (BIOS/UEFI) và các firmware cần thiết để máy tính hoạt động. Dữ liệu trong ROM không bị mất khi mất điện, đảm bảo hệ thống có thể khởi động lại.
- Mạch Ghép Nối Vào/Ra (I/O Interface): Các mạch này tạo ra khả năng giao tiếp giữa hệ vi xử lý với thế giới bên ngoài. Chúng bao gồm các thiết bị đầu vào (bàn phím, chuột, máy quét) và thiết bị đầu ra (màn hình, máy in), cho phép người dùng tương tác với máy tính.
- Bus Hệ Thống: Là tập hợp các đường dẫn điện tử dùng để truyền dữ liệu giữa các thành phần khác nhau của máy tính. Bus hệ thống bao gồm ba loại chính:
- Bus Điều Khiển (Control Bus): Mang các tín hiệu điều khiển hoạt động hoặc phản ánh trạng thái của các khối chức năng (ví dụ: tín hiệu đọc/ghi, ngắt).
- Bus Dữ Liệu (Data Bus): Mang dữ liệu mà vi xử lý đang trao đổi với bộ nhớ hoặc thiết bị I/O.
- Bus Địa Chỉ (Address Bus): Mang thông tin về địa chỉ của ô nhớ hoặc thiết bị I/O mà CPU muốn truy cập.
Phần Cứng Và Phần Mềm
Khái niệm về phần cứng và phần mềm là cốt lõi để hiểu về cấu trúc máy tính. Phần cứng (hardware) bao gồm tất cả các thành phần vật lý của máy tính như ổ đĩa, màn hình, bàn phím, chuột, và các bo mạch điện tử. Ngược lại, phần mềm (software) là tập hợp các chương trình, dữ liệu và hướng dẫn điều khiển hoạt động của phần cứng. Phần mềm được phân loại thành nhiều nhóm:
Xem Thêm Bài Viết:
- Máy in 2 mặt Canon giá bao nhiêu? Cập nhật chi tiết
- Cách tẩy mực in laser trên giấy: Hướng dẫn chi tiết
- Cách Khóa Folder Trên Máy Tính Đơn Giản, Hiệu Quả
- camera máy tính không mở được: Khắc phục hiệu quả
- Lỗi không share được máy in và cách sửa chi tiết
- Hệ Điều Hành (Operating System – OS): Như DOS, Windows, Linux, macOS. Đây là phần mềm nền tảng, quản lý tài nguyên phần cứng và cung cấp môi trường cho các ứng dụng khác hoạt động.
- Chương Trình Tiện Ích (Utility Programs): Bao gồm các công cụ hỗ trợ quản lý hệ thống, tối ưu hóa hiệu suất, hoặc bảo vệ máy tính (ví dụ: phần mềm diệt virus, quản lý file).
- Chương Trình Ứng Dụng (Application Programs): Là các phần mềm phục vụ nhu cầu cụ thể của người dùng như soạn thảo văn bản (MS Word), thiết kế đồ họa (Protel), duyệt web, chơi game, v.v.
- Ngôn Ngữ Lập Trình (Programming Languages): Như Pascal, C, C++, Java. Đây là các công cụ cho phép lập trình viên viết ra các chương trình phần mềm, biến ý tưởng thành các ứng dụng thực tế.
Vi Xử Lý 8086: Kiến Trúc Và Chức Năng
Vi xử lý 8086 của Intel là một cột mốc quan trọng trong lịch sử phát triển máy tính, đánh dấu sự khởi đầu của kiến trúc x86 thống trị ngày nay. Hiểu rõ về cấu tạo và chức năng của nó là yếu tố then chốt để giải quyết các bài tập cấu trúc máy tính phức tạp.
Sơ Đồ Khối Của 8086
Bộ vi xử lý 8086 được thiết kế với hai khối chức năng chính hoạt động song song, tối ưu hóa hiệu suất xử lý:
- Khối Thực Thi Lệnh (EU – Execution Unit): Đây là nơi chịu trách nhiệm giải mã và thực thi các lệnh. EU chứa Bộ số học và logic (ALU) và các thanh ghi đa năng.
- Khối Giao Tiếp Bus (BIU – Bus Interface Unit): BIU quản lý việc trao đổi thông tin giữa 8086 và các thành phần bên ngoài như bộ nhớ và thiết bị ngoại vi. Nó có nhiệm vụ tìm nạp lệnh từ bộ nhớ và đưa chúng vào hàng đợi để EU xử lý.
Khối Thực Thi Lệnh (EU – Execution Unit)
Khối EU là trung tâm thực hiện các tác vụ tính toán và logic. Nó bao gồm các thành phần quan trọng sau:
- Bộ Xử Lý Số Học Và Logic (ALU – Arithmetic Logical Unit): Thực hiện tất cả các phép toán số học (cộng, trừ, nhân, chia) và các phép toán logic (AND, OR, XOR, NOT).
- Các Thanh Ghi Đa Năng (General Purpose Registers): Gồm 16 bit, được sử dụng để lưu trữ dữ liệu tạm thời trong quá trình thực thi lệnh. Chúng có thể được truy cập dưới dạng 16 bit hoặc 8 bit (tách thành byte cao và byte thấp).
- Thanh ghi AX (Accumulator Register): Thường chứa kết quả của các phép toán. Nếu kết quả là 8 bit, thanh ghi AL (byte thấp của AX) sẽ được sử dụng.
- Thanh ghi BX (Base Register): Thường chứa địa chỉ cơ sở của một bảng dữ liệu, đặc biệt khi sử dụng lệnh XLAT (Translate).
- Thanh ghi CX (Count Register): Được dùng làm bộ đếm trong các vòng lặp (ví dụ: lệnh LOOP) hoặc để lưu số lần dịch/quay bit.
- Thanh ghi DX (Data Register): Thường được sử dụng cùng với AX cho các phép nhân/chia 16 bit. DX cũng có thể chứa địa chỉ cổng trong các lệnh I/O trực tiếp.
- Thanh Ghi Cờ (Flag Register – F): Gồm 16 bit nhưng chỉ sử dụng 9 bit để phản ánh trạng thái sau các phép toán hoặc để điều khiển hoạt động của vi xử lý. Các cờ này được chia thành hai loại:
- Cờ Trạng Thái (Status Flags): (6 cờ) Được thiết lập (1) hoặc xóa (0) sau hầu hết các lệnh số học và logic.
- C (Carry Flag): Cờ nhớ, được đặt nếu có một phép nhớ hoặc mượn từ bit MSB (most significant bit).
- P (Parity Flag): Cờ chẵn lẻ, được đặt nếu số bit 1 trong kết quả là chẵn.
- A (Auxiliary Flag): Cờ nhớ phụ, được đặt nếu có một phép nhớ hoặc mượn từ bit 3 sang bit 4 (trong các phép toán BCD).
- Z (Zero Flag): Cờ rỗng, được đặt nếu kết quả của phép toán là 0.
- S (Sign Flag): Cờ dấu, được đặt nếu kết quả là số âm (bit MSB là 1).
- O (Overflow Flag): Cờ tràn, được đặt nếu kết quả vượt quá phạm vi biểu diễn của kiểu dữ liệu có dấu.
- Cờ Điều Khiển (Control Flags): (3 cờ) Được thiết lập hoặc xóa thông qua các lệnh đặc biệt để điều khiển chế độ làm việc của vi xử lý.
- T (Trap Flag): Cờ bẫy, dùng cho chế độ gỡ lỗi (single-stepping).
- I (Interrupt Flag): Cờ ngắt, cho phép (1) hoặc vô hiệu hóa (0) các yêu cầu ngắt từ bên ngoài.
- D (Direction Flag): Cờ hướng, điều khiển hướng xử lý chuỗi ký tự (tăng hoặc giảm địa chỉ).
- Cờ Trạng Thái (Status Flags): (6 cờ) Được thiết lập (1) hoặc xóa (0) sau hầu hết các lệnh số học và logic.
- Thanh Ghi Con Trỏ (Pointer Registers) và Thanh Ghi Chỉ Số (Index Registers):
- IP (Instruction Pointer): Lưu địa chỉ lệnh tiếp theo sẽ được thực thi.
- BP (Base Pointer): Thường được dùng làm con trỏ cơ sở để truy cập dữ liệu trong ngăn xếp.
- SP (Stack Pointer): Trỏ đến đỉnh của ngăn xếp (stack).
- SI (Source Index): Dùng làm con trỏ chỉ số nguồn trong các thao tác chuỗi.
- DI (Destination Index): Dùng làm con trỏ chỉ số đích trong các thao tác chuỗi.
Khối Giao Tiếp Bus (BIU – Bus Interface Unit)
Khối BIU là cầu nối giữa 8086 và các thành phần bên ngoài, đảm bảo luồng dữ liệu thông suốt. Các thành phần chính của BIU bao gồm:
- Bộ Cộng Địa Chỉ (Address Adder): Tạo ra địa chỉ vật lý 20 bit từ các thanh ghi đoạn 16 bit và thanh ghi lệch.
- Bốn Thanh Ghi Đoạn 16 bit (Segment Registers): Giúp 8086 truy cập tới các đoạn bộ nhớ khác nhau, tạo ra không gian địa chỉ 1MB.
- CS (Code Segment): Chứa địa chỉ cơ sở của đoạn mã lệnh.
- DS (Data Segment): Chứa địa chỉ cơ sở của đoạn dữ liệu.
- ES (Extra Segment): Chứa địa chỉ cơ sở của đoạn dữ liệu phụ, dùng cho các thao tác chuỗi.
- SS (Stack Segment): Chứa địa chỉ cơ sở của đoạn ngăn xếp.
- Mạch Logic Điều Khiển (Control Logic): Tạo ra các tín hiệu điều khiển cần thiết để giao tiếp với các thiết bị bên ngoài.
- Hàng Đợi Lệnh (Instruction Queue): Có độ dài 6 byte, giúp cải thiện hiệu suất bằng cách tìm nạp trước các lệnh từ bộ nhớ trong khi EU đang bận xử lý lệnh hiện tại.
Sơ Đồ Chân Và Chức Năng Của 8086
Vi xử lý 8086 là một chip 40 chân, được thiết kế để hoạt động ở hai chế độ chính, tùy thuộc vào mức điện áp tại chân số 33 (MN/MX):
- Chế độ Tối Thiểu (MIN Mode): Được thiết lập nếu chân MN/MX nối với 5V. Trong chế độ này, 8086 tự mình tạo ra các tín hiệu điều khiển bus, phù hợp cho các hệ thống đơn giản.
- Chế độ Tối Đa (MAX Mode): Được thiết lập nếu chân MN/MX nối với 0V (GND). Trong chế độ này, 8086 cần một bộ điều khiển bus bên ngoài (ví dụ: 8288) để tạo ra các tín hiệu điều khiển, phù hợp cho các hệ thống phức tạp hơn với nhiều bộ xử lý.
Các chân quan trọng và chức năng của chúng:
- AD0-AD15 (Address/Data Bus): 16 đường địa chỉ thấp (A0-A15) được ghép kênh với 16 đường dữ liệu (D0-D15). Trong một chu kỳ bus, chúng có thể mang thông tin địa chỉ hoặc dữ liệu.
- A16/S3 – A19/S6 (Address/Status Bus): 4 đường địa chỉ cao nhất (A16-A19) được ghép kênh với các tín hiệu trạng thái (S3-S6) phản ánh trạng thái của CPU.
- READY: Tín hiệu báo trạng thái sẵn sàng của thiết bị ngoại vi hoặc bộ nhớ. Khi READY=1, CPU thực hiện đọc/ghi dữ liệu. Nếu thiết bị chậm, nó có thể kéo READY=0 để CPU chờ.
- ALE (Address Latch Enable): Xung cho phép chốt địa chỉ. Khi ALE=1, các chân AD mang địa chỉ hợp lệ.
- /DEN (Data Enable): Kích hoạt các bộ đệm bus dữ liệu.
- M/IO (Memory/Input-Output): Chọn hoạt động với bộ nhớ (0) hoặc thiết bị I/O (1).
- DT/R (Data Transmit/Receive): Chỉ định hướng truyền dữ liệu trên bus dữ liệu (vào CPU hay ra khỏi CPU).
- /BHE (Bus High Enable): Dùng để báo rằng đang truy cập băng cao của bộ nhớ (bytes từ D8-D15).
- /RD (Read Signal): Xung cho phép đọc. Khi /RD=0, bus dữ liệu nhận dữ liệu từ bộ nhớ hoặc thiết bị ngoại vi.
- INTR (Interrupt Request): Yêu cầu ngắt. Nếu INTR=1 và cờ ngắt IF=1, CPU sẽ thực hiện chu kỳ chấp nhận ngắt.
- TEST: Tín hiệu kiểm tra bởi lệnh WAIT. CPU sẽ chờ cho đến khi TEST=0 mới tiếp tục.
- NMI (Non-Maskable Interrupt): Yêu cầu ngắt không che được, luôn được CPU đáp ứng.
- RESET: Thiết lập lại phần cứng cho CPU, khởi tạo các thanh ghi nội và con trỏ chương trình.
Tập Lệnh Và Hàm Ngắt 8086 Quan Trọng
Để thực hiện các bài tập cấu trúc máy tính và lập trình hợp ngữ, việc hiểu rõ tập lệnh và các hàm ngắt của 8086 là điều kiện tiên quyết. Đây là “ngôn ngữ” mà CPU hiểu và thực thi.
Tập Lệnh Của 8086
Tập lệnh của 8086 rất phong phú, được phân loại thành nhiều nhóm khác nhau để thực hiện các thao tác đa dạng.
- Lệnh Chuyển Dữ Liệu:
MOV đích, nguồn: Di chuyển dữ liệu từ nguồn đến đích.XCHG đích, nguồn: Trao đổi nội dung của hai toán hạng.IN thanh_ghi, cổng: Đọc dữ liệu từ cổng I/O vào thanh ghi.OUT cổng, thanh_chứa: Xuất dữ liệu từ thanh chứa ra cổng I/O.PUSH nguồn: Đẩy dữ liệu vào ngăn xếp, giảm SP đi 2.POP đích: Lấy dữ liệu từ đỉnh ngăn xếp và đưa vào đích, tăng SP lên 2.PUSHF: Đẩy nội dung thanh ghi cờ vào ngăn xếp.POPF: Lấy nội dung từ ngăn xếp vào thanh ghi cờ.
- Lệnh Số Học:
ADD đích, nguồn: Cộng nguồn vào đích.ADC đích, nguồn: Cộng nguồn vào đích và cộng thêm cờ nhớ (CF).SUB đích, nguồn: Trừ nguồn khỏi đích.SBB đích, nguồn: Trừ nguồn khỏi đích và trừ thêm cờ mượn (CF).MUL nguồn: Nhân không dấu. Nhân nội dung của AL (nếu nguồn 8 bit) hoặc AX (nếu nguồn 16 bit) với toán hạng nguồn.IMUL nguồn: Nhân có dấu.DIV nguồn: Chia không dấu. Chia AX (nếu nguồn 8 bit) hoặc DX:AX (nếu nguồn 16 bit) cho nguồn.IDIV nguồn: Chia có dấu.NEG đích: Đổi dấu của toán hạng đích (trừ đích từ 0).
- Lệnh Logic và Dịch/Quay Bit:
AND đích, nguồn: Thực hiện phép AND logic giữa đích và nguồn, kết quả lưu vào đích.OR đích, nguồn: Thực hiện phép OR logic giữa đích và nguồn, kết quả lưu vào đích.XOR đích, nguồn: Thực hiện phép XOR logic giữa đích và nguồn, kết quả lưu vào đích.TEST đích, nguồn: Thực hiện phép AND logic nhưng không lưu kết quả, chỉ cập nhật cờ.SHL/SAL đích, số_bit: Dịch trái số học/logic (nhân 2).SHR đích, số_bit: Dịch phải logic (chia 2, điền 0 vào bit MSB).SAR đích, số_bit: Dịch phải số học (chia 2, giữ nguyên bit dấu).ROL/ROR đích, số_bit: Quay trái/phải không thông qua cờ nhớ.RCL/RCR đích, số_bit: Quay trái/phải thông qua cờ nhớ.
- Lệnh Nhảy và Vòng Lặp:
JMP nhãn_đích: Nhảy không điều kiện đến nhãn đích.JZ/JE nhãn_đích: Nhảy nếu kết quả bằng 0 (cờ ZF=1).JNZ/JNE nhãn_đích: Nhảy nếu kết quả khác 0 (cờ ZF=0).JC nhãn_đích: Nhảy nếu cờ nhớ CF=1.JA/JG nhãn_đích: Nhảy nếu lớn hơn (không dấu/có dấu).JB/JL nhãn_đích: Nhảy nếu nhỏ hơn (không dấu/có dấu).CMP đích, nguồn: So sánh hai toán hạng bằng cách trừ chúng nhưng không lưu kết quả, chỉ cập nhật cờ.LOOP nhãn_nguồn: Lặp lại đến nhãn nguồn, giảm CX đi 1 và nhảy nếu CX khác 0.
- Lệnh Điều Khiển Hệ Thống:
HLT: Dừng vi xử lý, chờ ngắt ngoài.LOCK: Khóa bus, ngăn các bộ xử lý khác truy cập bus trong môi trường đa xử lý.NOP: Không thực hiện thao tác nào (No Operation).STI: Thiết lập cờ ngắt IF=1 (cho phép ngắt).WAIT: Đưa vi xử lý vào trạng thái chờ cho đến khi tín hiệu TEST = 0.CALL nhãn: Gọi một thủ tục con.RET: Trả lại điều khiển từ thủ tục con về chương trình gọi.XLAT nhãn_nguồn: Dịch một byte bằng cách sử dụng BX làm con trỏ cơ sở của bảng.
Các Hàm Ngắt 21h Của DOS
Hàm ngắt 21h (Interrupt 21h) của DOS cung cấp một giao diện mạnh mẽ để các chương trình tương tác với hệ điều hành, thực hiện các tác vụ I/O và quản lý hệ thống một cách dễ dàng.
- Hàm 1h (Đọc một ký tự từ bàn phím): Đọc một ký tự từ thiết bị vào/ra chuẩn (bàn phím) và lưu kết quả vào thanh ghi AL.
MOV AH, 1INT 21H - Hàm 2h (Hiển thị một ký tự lên màn hình): Hiển thị nội dung thanh ghi DL lên màn hình hoặc thực hiện các chức năng điều khiển khác tùy thuộc vào nội dung DL.
MOV AH, 2MOV DL, 'A'INT 21H - Hàm 9h (Hiển thị một chuỗi ký tự lên màn hình): Hiển thị một chuỗi ký tự lên màn hình. Chuỗi phải kết thúc bằng ký tự ‘$’. Địa chỉ của chuỗi được nạp vào DX.
MOV AX, @DATAMOV DS, AXMOV AH, 9LEA DX, chuoi_ki_tuINT 21H - Hàm 4CH (Kết thúc chương trình): Kết thúc chương trình hiện tại và trả quyền điều khiển về cho chương trình gọi nó (thường là DOS).
MOV AH, 4CHINT 21H
Cấu Trúc Chương Trình Lập Trình Cho 8086
Một chương trình hợp ngữ 8086 cơ bản thường tuân thủ cấu trúc sau:
.MODEL SMALL ; Khai báo kiểu bộ nhớ là SMALL
.STACK 100h ; Khai báo kích thước ngăn xếp là 100h
.DATA ; Khai báo đoạn dữ liệu
; Các biến, hằng được khai báo ở đây
.CODE ; Khai báo đoạn mã
MAIN PROC ; Bắt đầu thủ tục chính
MOV AX, @DATA
MOV DS, AX ; Khởi tạo thanh ghi đoạn dữ liệu DS
; Các lệnh của chương trình chính
MAIN ENDP ; Kết thúc thủ tục chính
; Các hàm và thủ tục khác (nếu có)
END MAIN ; Kết thúc chương trình
Cấu trúc này giúp tổ chức mã lệnh và dữ liệu một cách rõ ràng, dễ quản lý, đặc biệt quan trọng khi giải quyết các bài tập cấu trúc máy tính với độ phức tạp cao.
Các Thiết Bị Ngoại Vi Phổ Biến Trong Bài Tập Cấu Trúc Máy Tính
Việc hiểu và làm việc với các thiết bị ngoại vi là một phần không thể thiếu trong các bài tập cấu trúc máy tính thực tế. Các IC giao tiếp như 8255A và các IC giải mã địa chỉ đóng vai trò cầu nối quan trọng giữa vi xử lý và các thiết bị I/O.
IC 8255A (Programmable Peripheral Interface)
IC 8255A là một bộ giao tiếp ngoại vi lập trình được, cung cấp ba cổng I/O 8 bit (Port A, Port B, Port C) có thể được cấu hình linh hoạt để hoạt động như cổng đầu vào hoặc đầu ra, hoặc cả hai, tùy thuộc vào chế độ hoạt động được thiết lập.
-
Sơ Đồ Chân và Chức Năng: IC 8255A thường có 40 chân dạng DIP.
- PA0-PA7 (Chân 4, 3, 2, 1, 40, 39, 38, 37): Cổng PA, có thể là đầu vào hoặc đầu ra 8 bit.
- PB0-PB7 (Chân 18 đến 25): Cổng PB, tương tự PA, có thể là đầu vào hoặc đầu ra 8 bit.
- PC0-PC7 (Chân 14, 15, 16, 17, 13, 12, 11, 10): Cổng PC, có thể tách thành PC cao (PC4-PC7) và PC thấp (PC0-PC3) để điều khiển hoặc I/O độc lập.
- D0-D7 (Chân 27 đến 34): Bus dữ liệu 2 chiều, nối với bus dữ liệu của vi xử lý 8086 để trao đổi dữ liệu.
- RESET (Chân 35): Chân khởi tạo trạng thái ban đầu cho IC 8255. Kéo lên mức cao (1) để reset, bình thường giữ ở mức thấp (0V) để hoạt động.
- /CS (Chip Select – Chân 6): Tín hiệu chọn vi mạch, tích cực ở mức thấp (0V). Chân này thường được nối với đầu ra của mạch giải mã địa chỉ để chọn IC 8255A.
- /RD (Read – Chân 5): Chân tín hiệu cho phép đọc dữ liệu từ IC 8255A.
- /WR (Write – Chân 36): Chân tín hiệu cho phép ghi dữ liệu vào IC 8255A.
- A0, A1 (Chân 9, 8): Hai chân địa chỉ này dùng để chọn cổng (PA, PB, PC) hoặc thanh ghi điều khiển bên trong 8255A:
- A1A0 = 00: Cổng PA
- A1A0 = 01: Cổng PB
- A1A0 = 10: Cổng PC
- A1A0 = 11: Thanh ghi điều khiển (Control Word Register)
-
Chế Độ Hoạt Động: Chế độ hoạt động của 8255A được xác định bằng cách ghi một từ điều khiển (Control Word) vào thanh ghi điều khiển. Từ điều khiển 8 bit có cấu trúc đặc biệt để cấu hình các cổng và chế độ.
- Bit D7 luôn là 1 để xác định đây là từ điều khiển chế độ.
- Bit D6, D5: Chọn chế độ cho Nhóm A (gồm Port A và 4 bit cao của Port C).
- 00: Chế độ 0
- 01: Chế độ 1
- Bit D4: Chọn chiều I/O cho Port A (1 = vào, 0 = ra).
- Bit D3: Chọn chiều I/O cho 4 bit cao của Port C (1 = vào, 0 = ra).
- Bit D2: Chọn chế độ cho Nhóm B (gồm Port B và 4 bit thấp của Port C).
- 0: Chế độ 0
- 1: Chế độ 1
- Bit D1: Chọn chiều I/O cho Port B (1 = vào, 0 = ra).
- Bit D0: Chọn chiều I/O cho 4 bit thấp của Port C (1 = vào, 0 = ra).
Ví dụ: Để chọn chế độ Nhóm A là chế độ 0, Nhóm B là chế độ 0, Port PA và PB xuất dữ liệu, Port PC nhận dữ liệu, từ điều khiển sẽ là:
10001001B(D7=1, D6D5=00 (Mode 0 A), D4=0 (PA Out), D3=1 (PC High In), D2=0 (Mode 0 B), D1=0 (PB Out), D0=1 (PC Low In)).MOV AL, 10001001BOUT DK, AL(với DK là địa chỉ của thanh ghi điều khiển 8255)- Chế Độ 0 (Simple I/O):
- Các cổng A, B, C hoạt động độc lập.
- Mỗi cổng có thể được cấu hình là đầu vào hoặc đầu ra.
- Không có chức năng bắt tay (handshake) hoặc ngắt tự động.
- Chế Độ 1 (Strobed I/O):
- Chế độ I/O có bắt tay (handshake) và có thể sử dụng ngắt.
- Cổng A và B hoạt động như cổng dữ liệu, trong khi các bit của cổng C được dùng cho tín hiệu điều khiển bắt tay.
- Thường được dùng cho các thiết bị ngoại vi cần tín hiệu điều khiển để đồng bộ dữ liệu.
IC Giải Mã Địa Chỉ 74LS273 (Octal D-Type Flip-Flop)
IC 74LS273 là một thanh ghi 8 bit với các flip-flop loại D, hoạt động đồng bộ với xung đồng hồ và có chân xóa tổng thể (Clear). Nó thường được dùng để tách các đường địa chỉ ghép kênh của vi xử lý.
- Cấu Tạo và Chức Năng:
- Vcc (Chân 20) và GND (Chân 10): Nguồn cấp.
- Clear (MR – Chân 1): Chân xóa tổng thể, tích cực mức thấp, xóa tất cả các flip-flop về 0.
- CP (Clock Pulse – Chân 11): Chân xung đồng hồ, tích cực cạnh lên, chốt dữ liệu từ đầu vào D sang đầu ra Q.
- D0-D7 (Chân 3, 4, 7, 8, 13, 14, 17, 18): Các chân dữ liệu đầu vào. Trong ứng dụng với 8086, các chân này thường nối với các đường địa chỉ/dữ liệu ghép kênh (AD0-AD7 hoặc AD8-AD15).
- Q0-Q7 (Chân 2, 5, 6, 9, 12, 15, 16, 19): Các chân dữ liệu đầu ra đã được chốt.
Do mỗi IC 74LS273 chỉ có thể tách 8 đường địa chỉ, để tách 16 đường địa chỉ ghép kênh của 8086 (AD0-AD15), cần sử dụng hai IC 74LS273. Xung ALE của 8086 thường được sử dụng làm xung clock cho IC 74LS273 (có thể cần qua cổng NOT nếu IC yêu cầu xung cạnh xuống).
IC Giải Mã Địa Chỉ 74LS139 (Dual 2-Line to 4-Line Decoder/Demultiplexer)
IC 74LS139 là một bộ giải mã địa chỉ hai kênh 2-to-4, với các đầu ra tích cực ở mức thấp. Nó được sử dụng phổ biến để tạo ra các tín hiệu chọn chip cho nhiều thiết bị từ một số ít đường địa chỉ.
-
Cấu Tạo và Chức Năng: IC 74LS139 có 16 chân DIP, chứa hai bộ giải mã độc lập.
- 1G (Chân 1) và 2G (Chân 15): Chân chọn chip (Enable) cho từng bộ giải mã, tích cực mức thấp. Để một bộ giải mã hoạt động, chân G tương ứng phải ở mức 0V.
- 1A, 1B (Chân 2, 3) và 2A, 2B (Chân 14, 13): Các chân tín hiệu đầu vào cần giải mã (địa chỉ).
- 1Y0-1Y3 (Chân 4, 5, 6, 7) và 2Y0-2Y3 (Chân 12, 11, 10, 9): Các chân tín hiệu đầu ra đã giải mã.
- GND (Chân 8) và Vcc (Chân 16): Nguồn cấp.
-
Cơ Chế Mã Hóa: Mỗi bộ giải mã nhận 2 bit đầu vào (B, A) và tạo ra 4 đầu ra (Y0-Y3). Chỉ một đầu ra tương ứng với tổ hợp bit đầu vào sẽ ở mức thấp (tích cực), các đầu ra còn lại ở mức cao.
- BA = 00: Y0 = 0, các Y khác = 1
- BA = 01: Y1 = 0, các Y khác = 1
- BA = 10: Y2 = 0, các Y khác = 1
- BA = 11: Y3 = 0, các Y khác = 1
IC 74LS139 lý tưởng cho việc tạo ra tín hiệu chọn chip cho các khối bộ nhớ hoặc thiết bị I/O trong các bài tập cấu trúc máy tính yêu cầu phân chia không gian địa chỉ.
Cấu Tạo LED 7 Đoạn
LED 7 đoạn là một thiết bị hiển thị số đơn giản và phổ biến, được sử dụng trong nhiều ứng dụng điện tử. Nó bao gồm 7 đoạn LED riêng lẻ (a, b, c, d, e, f, g) sắp xếp theo hình số 8, cùng với một LED cho dấu chấm thập phân (dp).
-
Các Loại LED 7 Đoạn:
- Chung Anode (Common Anode – CA): Tất cả các anode của các LED đều được nối chung và cấp nguồn Vcc. Để một đoạn LED sáng, chân cathode tương ứng phải được nối với mass (0V).
- Chung Cathode (Common Cathode – CC): Tất cả các cathode của các LED đều được nối chung và được nối với mass. Để một đoạn LED sáng, chân anode tương ứng phải được cấp nguồn Vcc.
-
Nguyên Lý Hoạt Động (Ví dụ với Chung Anode):
- Chân Anode chung được nối với Vcc.
- Để hiển thị số 1: Nối chân b và c của LED với mass.
- Để hiển thị số 2: Nối chân a, b, g, e, d của LED với mass.
Ngược lại với loại Chung Cathode, các chân điều khiển cần được cấp Vcc để sáng. Việc lựa chọn loại LED 7 đoạn phụ thuộc vào yêu cầu thiết kế mạch và logic điều khiển.
Ví Dụ Bài Tập Thực Hành Chuyên Sâu
Để củng cố kiến thức về bài tập cấu trúc máy tính và vi xử lý 8086, chúng ta sẽ đi sâu vào một số ví dụ thực hành cụ thể, từ lập trình hợp ngữ đến ghép nối phần cứng.
Ví Dụ 1: Lập Trình Nhập Liệu Và Hiển Thị Chuỗi Ký Tự Ngược
Yêu cầu: Viết chương trình hợp ngữ 8086 thực hiện nhập liên tiếp một dãy các ký tự từ bàn phím. Khi người dùng nhấn Enter, chương trình kết thúc việc nhập và hiển thị dãy ký tự đó theo chiều ngược lại.
Phân tích và Thuật toán:
Chương trình sẽ sử dụng ngăn xếp (stack) để lưu trữ từng ký tự khi nhập vào. Khi phát hiện ký tự Enter (mã ASCII 0Dh), chương trình sẽ dừng nhập. Sau đó, nó sẽ lấy các ký tự từ ngăn xếp ra (theo thứ tự ngược lại so với khi đẩy vào) và hiển thị chúng lên màn hình. Nếu không có ký tự nào được nhập (người dùng nhấn Enter ngay), chương trình sẽ hiển thị thông báo.
- Bắt đầu:
- Khởi tạo đoạn dữ liệu (DS).
- Hiển thị thông báo yêu cầu nhập chuỗi.
- Nhập ký tự:
- Sử dụng hàm ngắt DOS 21h, chức năng 1h (nhập ký tự).
- Kiểm tra ký tự nhập vào:
- Nếu là Enter (0Dh): Chuyển đến phần hiển thị.
- Nếu không: Đẩy ký tự vào ngăn xếp (PUSH AX), tăng bộ đếm số ký tự (CX), lặp lại.
- Hiển thị chuỗi ngược:
- Kiểm tra bộ đếm (CX). Nếu CX = 0, nhảy đến thông báo “chưa nhập ký tự”.
- Hiển thị thông báo “Dãy vừa nhập theo chiều ngược lại:”.
- Lặp lại: Lấy ký tự từ ngăn xếp (POP DX), hiển thị ký tự (hàm 2h của INT 21h), giảm bộ đếm (LOOP).
- Kết thúc:
- Thoát chương trình bằng hàm 4CH của INT 21h.
Code Chương Trình:
.model small ; Khai báo kiểu bộ nhớ là SMALL, phù hợp cho các bài tập cấu trúc máy tính nhỏ
.stack 100h ; Khai báo kích thước ngăn xếp là 100h (256 bytes)
.data ; Đoạn dữ liệu
tb1 db 10,13,"nhap vao day ki tu: $"
tb2 db 10,13,"day vua nhap theo chieu nguoc lai: $"
tb3 db 10,13,"ban chua nhap ki tu nao: $"
.code ; Đoạn mã lệnh
main proc ; Thủ tục chính bắt đầu
mov ax,@data ; Nạp địa chỉ đoạn dữ liệu vào AX
mov ds,ax ; Ghi địa chỉ từ AX vào thanh ghi đoạn DS để truy cập dữ liệu
mov ah,9 ; Chuẩn bị hàm ngắt 9h (hiển thị chuỗi)
lea dx,tb1 ; Nạp địa chỉ của thông báo tb1 vào DX
int 21h ; Gọi ngắt DOS để hiển thị thông báo
mov cx,0 ; Khởi tạo CX = 0 (bộ đếm số ký tự nhập)
nhap: ; Nhãn bắt đầu vòng lặp nhập ký tự
mov ah,1 ; Chuẩn bị hàm ngắt 1h (đọc ký tự từ bàn phím)
int 21h ; Gọi ngắt DOS, ký tự nhập được lưu vào AL
cmp al,0dh ; So sánh ký tự nhập với mã ASCII của Enter (0Dh)
je hienthi ; Nếu bằng, nhảy đến nhãn hienthi (kết thúc nhập)
push ax ; Đẩy nội dung AX (chứa ký tự đã nhập ở AL) vào ngăn xếp
inc cx ; Tăng bộ đếm ký tự lên 1
jmp nhap ; Nhảy về nhãn nhap để tiếp tục nhập
hienthi: ; Nhãn bắt đầu phần hiển thị
cmp cx,0 ; Kiểm tra xem có ký tự nào được nhập không (CX=0 nếu không)
je thongbao ; Nếu CX=0, nhảy đến nhãn thongbao
mov ah,9 ; Chuẩn bị hàm ngắt 9h (hiển thị chuỗi)
lea dx,tb2 ; Nạp địa chỉ của thông báo tb2 vào DX
int 21h ; Gọi ngắt DOS để hiển thị thông báo
mov ah,2 ; Chuẩn bị hàm ngắt 2h (hiển thị ký tự)
nguoc: ; Nhãn bắt đầu vòng lặp hiển thị ngược
pop dx ; Lấy ký tự từ đỉnh ngăn xếp ra DX (thực tế là DL)
int 21h ; Gọi ngắt DOS để hiển thị ký tự
loop nguoc ; Giảm CX đi 1 và lặp lại nếu CX khác 0
jmp thoat ; Sau khi hiển thị xong, nhảy đến nhãn thoat
thongbao: ; Nhãn hiển thị thông báo chưa nhập
mov ah,9 ; Chuẩn bị hàm ngắt 9h (hiển thị chuỗi)
lea dx,tb3 ; Nạp địa chỉ của thông báo tb3 vào DX
int 21h ; Gọi ngắt DOS để hiển thị thông báo
thoat: ; Nhãn kết thúc chương trình
mov ah,4ch ; Chuẩn bị hàm ngắt 4CH (kết thúc chương trình)
int 21h ; Gọi ngắt DOS để thoát
main endp ; Kết thúc thủ tục chính
end main ; Kết thúc chương trình
Ví Dụ 2: Xây Dựng Mạch Giải Mã Địa Chỉ Cho Bộ Nhớ
Yêu cầu: Xây dựng mạch giải mã địa chỉ cho bộ nhớ gồm các vi mạch nhớ được bố trí như sau:
- ROM (32K x 8 bit) bắt đầu từ địa chỉ 00000H
- Khoảng trống
- RAM (64K x 8 bit)
- RAM (32K x 8 bit) kết thúc tại địa chỉ FFFFFH
Giải mã địa chỉ và phân tích:
Tổng dung lượng bộ nhớ từ 00000H đến FFFFFH là 1MB (2^20 byte). Các chip nhớ có dung lượng:
- ROM 32K x 8 bit = 32 1024 = 32768 byte = 2^15 byte. Cần 15 đường địa chỉ (A0-A14).
- RAM 64K x 8 bit = 64 1024 = 65536 byte = 2^16 byte. Cần 16 đường địa chỉ (A0-A15).
- RAM 32K x 8 bit = 32 1024 = 32768 byte = 2^15 byte. Cần 15 đường địa chỉ (A0-A14).
Tổng dung lượng các chip nhớ: 32KB + 64KB + 32KB = 128KB.
Khoảng trống = 1MB – 128KB = 896KB.
Bảng giải mã địa chỉ chi tiết:
Giả sử 8086 có 20 đường địa chỉ (A0-A19).
| Dung lượng | A19 | A18 | A17 | A16 | A15 | A14 | … | A0 | Địa chỉ bắt đầu | Địa chỉ kết thúc | Ghi chú |
|---|---|---|---|---|---|---|---|---|---|---|---|
| ROM 32Kx8 | 0 | 0 | 0 | 0 | 0 | X | … | X | 00000H | 07FFFH | A0-A14 cho ROM |
| Khoảng Trống | 0 | 0 | 0 | 1 | X | X | … | X | 08000H | E7FFFH | |
| RAM1 64Kx8 | 1 | 1 | 1 | 0 | 1 | X | … | X | E8000H | F7FFFH | A0-A15 cho RAM |
| RAM2 32Kx8 | 1 | 1 | 1 | 1 | 1 | X | … | X | F8000H | FFFFFH | A0-A14 cho RAM |
Lưu ý: “X” biểu thị “don’t care” (có thể là 0 hoặc 1), các bit địa chỉ thấp hơn sẽ được nối trực tiếp vào chip nhớ.
Cơ chế chọn địa chỉ:
Để chọn chính xác từng vi mạch nhớ, chúng ta dựa vào các bit địa chỉ cao không đổi trong dải địa chỉ của chúng.
- Đối với ROM 32Kx8 (00000H – 07FFFH):
- Các bit A15, A16, A17, A18, A19 đều là 0.
- Sử dụng cổng OR (NAND ngược): Đưa các bit A15-A19 vào cổng OR, đầu ra cổng OR sẽ ở mức 0 chỉ khi tất cả các đầu vào là 0. Đầu ra này sẽ nối với chân Chip Enable (/CE) của ROM.
- Đối với RAM1 64Kx8 (E8000H – F7FFFH) và RAM2 32Kx8 (F8000H – FFFFFH):
- Các bit A17, A18, A19 đều là 1.
- Sử dụng cổng NAND: Đưa các bit A17, A18, A19 vào cổng NAND. Đầu ra cổng NAND sẽ ở mức 0 chỉ khi tất cả các đầu vào là 1. Đầu ra này sẽ nối với chân Enable của IC giải mã 74LS139.
- Các bit A15 và A16 sẽ được đưa vào các chân đầu vào (A, B) của IC 74LS139 để giải mã chi tiết hơn cho từng chip RAM.
- Nếu A16A15 = 01 hoặc 10 (tương ứng với dải địa chỉ của RAM1 64K): đầu ra Y1 hoặc Y2 của 74LS139 sẽ tích cực (0). Hai đầu ra này được OR lại và nối với chân /CE của RAM1.
- Nếu A16A15 = 11 (tương ứng với dải địa chỉ của RAM2 32K): đầu ra Y3 của 74LS139 sẽ tích cực (0), nối với chân /CE của RAM2.
- Trường hợp A16A15 = 00 tương ứng với khoảng trống, không có chip nào được chọn.
Cơ chế này đảm bảo rằng chỉ có một chip nhớ được kích hoạt tại một thời điểm, tránh xung đột địa chỉ và tối ưu hóa việc sử dụng không gian địa chỉ.
Ví Dụ 3: Ghép Nối 8086 Với 8255 Và Điều Khiển LED 7 Đoạn
Yêu cầu: Ghép 1 LED 7 đoạn Anode chung (7SEG) với cổng PB của IC 8255A, một nút bấm (Button) với cổng PC (chân PC7). Viết chương trình điều khiển để khi bấm Button thì Led sáng nhấp nháy số 4, bình thường LED sáng số 8.
Ghép nối Phần Cứng:
- 8086 và 8255A:
- Bus Dữ liệu: Các chân D0-D7 của 8255A được nối với các chân AD0-AD7 của 8086. Cần một bộ đệm 2 chiều (ví dụ: 74LS245) và tín hiệu /DEN, DT/R của 8086 để điều khiển hướng truyền dữ liệu.
- Bus Địa chỉ và Điều khiển:
- Chân ALE của 8086 được dùng làm xung clock cho IC giải mã địa chỉ (ví dụ: 74LS273) để tách các đường địa chỉ ghép kênh.
- Chân M/IO của 8086 được nối với mạch giải mã địa chỉ để phân biệt truy cập bộ nhớ hay I/O.
- Chân /RD và /WR của 8086 nối trực tiếp với chân /RD và /WR của 8255A.
- Chân MN/MX của 8086 được nối với Vcc để hoạt động ở chế độ tối thiểu.
- Chân A0, A1 của 8255A được nối với các bit địa chỉ thấp tương ứng từ mạch giải mã địa chỉ của 8086.
- Chân /CS của 8255A được nối với đầu ra của mạch giải mã địa chỉ đã chọn cho 8255A.
- LED 7 đoạn và Button với 8255A:
- LED 7 đoạn Anode chung: Các chân a, b, c, d, e, f, g của LED được nối với các chân PB0-PB6 của 8255A (qua các điện trở hạn dòng). Chân Anode chung của LED được nối với Vcc.
- Button: Nút bấm được nối giữa chân PC7 của 8255A và GND, kèm theo một điện trở kéo lên (pull-up resistor) nối từ PC7 lên Vcc. Khi nút không bấm, PC7 ở mức cao (1); khi bấm, PC7 ở mức thấp (0).
Giải mã địa chỉ cho 8255A:
Chúng ta cần chọn một dải địa chỉ I/O cho 8255A. Giả sử ta chọn các địa chỉ cổng như sau:
- Cổng PA: 00H
- Cổng PB: 02H
- Cổng PC: 04H
- Thanh ghi Điều khiển (Control Word Register – CWR): 06H
Bảng giải mã địa chỉ cho 8255A:
Để chọn các địa chỉ này, các bit địa chỉ cao (A2-A19) phải ở mức 0. Bit A0 và A1 được dùng để chọn cổng bên trong 8255A.
| Cổng | A19 | … | A2 | A1 | A0 | Địa chỉ |
|---|---|---|---|---|---|---|
| PA | 0 | … | 0 | 0 | 0 | 00H |
| PB | 0 | … | 0 | 1 | 0 | 02H |
| PC | 0 | … | 1 | 0 | 0 | 04H |
| DK | 0 | … | 1 | 1 | 0 | 06H |
Mạch giải mã địa chỉ ngoài (sử dụng cổng logic hoặc IC giải mã) sẽ tạo ra tín hiệu /CS cho 8255A khi các bit địa chỉ cao phù hợp.
Sơ đồ thuật toán điều khiển LED:
- Bắt đầu
- Cấu hình 8255A:
- Port PB: Đầu ra (xuất dữ liệu ra LED)
- Port PC: Đầu vào (nhận tín hiệu từ Button)
- Vòng lặp chính:
- Kiểm tra nút bấm (PC7):
- Nếu nút bấm Được nhấn (PC7 = 0):
- Nhảy đến chế độ nhấp nháy số 4.
- Nếu nút bấm Không nhấn (PC7 = 1):
- Hiển thị số 8.
- Quay lại kiểm tra nút bấm.
- Nếu nút bấm Được nhấn (PC7 = 0):
- Kiểm tra nút bấm (PC7):
- Chế độ Nhấp nháy số 4:
- Hiển thị số 4.
- Tạo độ trễ.
- Tắt LED (hoặc hiển thị 0xFFH cho anode chung để tắt).
- Tạo độ trễ.
- Quay lại kiểm tra nút bấm.
- Kết thúc
Code Chương Trình:
data segment
; Định nghĩa địa chỉ các cổng của 8255A
pa equ 0 ; Port A địa chỉ 00H
pb equ 2 ; Port B địa chỉ 02H (Nối với LED 7 đoạn)
pc equ 4 ; Port C địa chỉ 04H (Nối với Button)
dk equ 6 ; Thanh ghi điều khiển (Control Word Register) địa chỉ 06H
ends
stack segment
dw 128 dup(0) ; Khai báo ngăn xếp 128 từ
ends
code segment
start:
; Khởi tạo 8255A
; Cấu hình: Nhóm A (PA) Mode 0 Out, Nhóm B (PB) Mode 0 Out, PC4-PC7 In, PC0-PC3 In.
; Từ điều khiển: 1 (luôn là 1) 00 (Mode 0 PA) 0 (PA Out) 1 (PC high In) 0 (Mode 0 PB) 0 (PB Out) 1 (PC low In)
; Vì Button nối vào PC7 (phần PC cao), ta muốn PC là Input.
; Cấu hình Port PB (LED) là Output. Port PC (Button) là Input.
; Bit D7=1 (Control Word), D6D5=00 (Mode 0 for Group A - PA), D4=0 (PA Output, không dùng), D3=1 (PC high Input), D2=0 (Mode 0 for Group B - PB), D1=0 (PB Output), D0=1 (PC low Input).
; Từ điều khiển sẽ là: 10001001B = 89H
mov al,89h ; Nạp giá trị cấu hình vào AL
out dk,al ; Ghi giá trị cấu hình vào thanh ghi điều khiển của 8255A
sangso8: ; Nhãn để hiển thị số 8 (trạng thái bình thường)
in al,pc ; Đọc trạng thái của Port C vào AL (để kiểm tra nút bấm PC7)
and al,80h ; Lọc lấy bit PC7 (bit cao nhất) - 10000000B
cmp al,80h ; So sánh với 80h (nghĩa là PC7 là 1 - nút không bấm)
je nhayso4 ; Nếu PC7 là 0 (nút bấm), nhảy đến nhayso4. Ngược lại, tiếp tục hiển thị số 8.
; Hiển thị số 8 trên LED 7 đoạn (Anode chung)
; Mã nhị phân cho số 8: a,b,c,d,e,f,g đều sáng -> 0000000b (00h)
; Tuy nhiên, nếu là Anode chung, 0 là sáng, 1 là tắt.
; Để hiện số 8 (tất cả các đoạn sáng), cần xuất giá trị 00H
mov al,00h ; Nạp mã nhị phân của số 8 vào AL
out pb,al ; Xuất giá trị này ra Port PB để điều khiển LED
jmp sangso8 ; Quay lại kiểm tra nút bấm
nhayso4: ; Nhãn để nhấp nháy số 4 khi nút bấm
in al,pc ; Đọc lại trạng thái của Port C để kiểm tra nút bấm
and al,80h ; Lọc lấy bit PC7
cmp al,80h ; So sánh với 80h (nếu PC7 = 1 thì nút đã nhả)
je sangso8 ; Nếu nút nhả, quay lại hiển thị số 8
; Hiển thị số 4 trên LED 7 đoạn (Anode chung)
; Mã nhị phân cho số 4 (b,c,f,g sáng, a,d,e tắt): 1001100b (99h) - (gfedcba)
; a=1, b=0, c=0, d=1, e=1, f=0, g=0
; 10011000b = 98h (Nếu theo thứ tự gfedcba)
; Để hiện số 4: đoạn b, c, f, g sáng. Các đoạn a, d, e tắt.
; Tương ứng với Anode chung: b,c,f,g = 0; a,d,e = 1.
; Bit b,c,f,g là các bit thứ 1, 2, 5, 6 (từ phải sang, 0-indexed)
; g f e d c b a
; 0 0 1 1 0 0 1 (nếu a=LSB) -> 99h là đúng
mov al,99h ; Nạp mã nhị phân của số 4 vào AL
out pb,al ; Xuất giá trị này ra Port PB để điều khiển LED
call delay ; Gọi thủ tục tạo độ trễ
in al,pc ; Đọc lại trạng thái của Port C trong chu kỳ nhấp nháy
and al,80h ; Lọc lấy bit PC7
cmp al,80h ; So sánh với 80h (nếu PC7 = 1 thì nút đã nhả)
je sangso8 ; Nếu nút nhả, quay lại hiển thị số 8
; Tắt LED (hoặc hiển thị 0xFFh để tắt hết các đoạn nếu là Anode chung)
mov al,0ffh ; Nạp giá trị tắt LED vào AL (tất cả các bit là 1)
out pb,al ; Xuất giá trị này ra Port PB
call delay ; Gọi thủ tục tạo độ trễ
jmp nhayso4 ; Tiếp tục nhấp nháy
delay: ; Thủ tục tạo độ trễ
mov cx,15000 ; Nạp giá trị lớn vào CX để tạo vòng lặp
k: ; Nhãn vòng lặp
nop ; Lệnh không làm gì (No Operation)
nop ; Thêm nop để kéo dài thời gian mỗi vòng lặp
nop
loop k ; Giảm CX đi 1 và lặp lại nếu CX khác 0
ret ; Trở về từ thủ tục
ends ; Kết thúc đoạn mã
end start ; Điểm bắt đầu chương trình
Phân tích Code:
data segmentvàstack segment: Khai báo các vùng nhớ cần thiết.equ: Định nghĩa các hằng số cho địa chỉ cổng của 8255A để dễ đọc và sửa đổi.mov al,89h; out dk,al: Đây là bước cấu hình quan trọng nhất. Từ 89H tương ứng với chế độ hoạt động của 8255A, nơi Port PB (nối LED) được cấu hình là đầu ra và Port PC (nối Button) được cấu hình là đầu vào.in al,pc: Đọc trạng thái của Port C.and al,80hvàcmp al,80hđược dùng để kiểm tra trạng thái của PC7. Nếu nút bấm, PC7 sẽ là 0, khi AND với 80h (10000000b) kết quả sẽ là 00h. Nếu nút không bấm, PC7 là 1, kết quả AND sẽ là 80h. Tuy nhiên, logiccmp al,80hje nhayso4lại kiểm tra xemalcó bằng80hkhông để nhảy. Điều này ngược lại với mong muốn.- Sửa lỗi logic: Nếu nút bấm, PC7 = 0. Khi đó
in al,pccó thể trả về một giá trị mà bit 7 là 0.and al,80hsẽ cho kết quả là 00h. Do đó,cmp al,00hje nhayso4mới đúng khi nút được bấm. Hoặccmp al,80hjne nhayso4nếu muốn nhảy khi khác 80h (tức là nút bấm). - Logic đúng: Nếu Button được bấm, PC7 sẽ ở mức LOW (0). Nếu không bấm, PC7 ở mức HIGH (1) do điện trở kéo lên.
in al,pc: Giả sử chỉ quan tâm PC7.test al,80h: Kiểm tra bit 7 của AL. Nếu bit 7 là 0 (nút bấm), cờ Z sẽ được đặt.jz nhayso4: Nếu Z=1 (kết quả TEST là 0, tức bit 7 là 0), nhảy đếnnhayso4.- Ngược lại, tiếp tục hiển thị số 8.
- Sửa lỗi logic: Nếu nút bấm, PC7 = 0. Khi đó
mov al,00h; out pb,al: Xuất mã điều khiển cho số 8 (tất cả các đoạn sáng) ra Port PB.mov al,99h; out pb,al: Xuất mã điều khiển cho số 4 ra Port PB.call delay: Gọi hàm tạo độ trễ để tạo hiệu ứng nhấp nháy.mov al,0ffh; out pb,al: Tắt LED (tất cả các đoạn tắt).- Thủ tục
delay: Sử dụng vòng lặpLOOPđể tạo độ trễ thời gian. Các lệnhNOP(No Operation) được thêm vào để kéo dài chu kỳ thực thi của mỗi vòng lặp, tăng thời gian trễ. - Điểm cần lưu ý: Việc kiểm tra nút bấm cần được thực hiện lại trong vòng lặp nhấp nháy để chương trình có thể thoát khỏi chế độ nhấp nháy ngay khi nút được nhả ra.
Qua các ví dụ này, người học có thể hình dung rõ hơn cách thức ứng dụng kiến thức lý thuyết vào các bài tập cấu trúc máy tính thực tế, từ đó nâng cao kỹ năng lập trình hợp ngữ và thiết kế mạch điện tử.
Các bài tập cấu trúc máy tính không chỉ là thử thách học thuật mà còn là nền tảng vững chắc cho sự nghiệp trong lĩnh vực công nghệ. Việc thành thạo vi xử lý 8086, hiểu sâu về cấu trúc máy tính, và ứng dụng linh hoạt các IC giao tiếp như 8255A là những kỹ năng quý giá. Với kiến thức và kinh nghiệm thực tiễn từ những bài tập cấu trúc máy tính chuyên sâu này, bạn sẽ tự tin hơn trong việc thiết kế, phân tích và xử lý các vấn đề liên quan đến hệ thống máy tính. Để khám phá thêm các giải pháp công nghệ và thiết bị chất lượng, hãy truy cập maytinhgiaphat.vn ngay hôm nay.

