Tài liệu Vi xử lý - Chương 2: Tổ chức hệ thống vi xử lý
Tất cảcác máy vi tính IBM họPC hoặc các máy vi tính tương thích IBM đều sử
dụng µP Intel họiAPX. Bảng 2.1 liệt kê các đặc tính cơbản của một số µP của Intel
trong đó 80486 chứa một bộ điều khiển cache tích hợp và 8 KB RAM tĩnh, Pentium
chứa cache 16 KB RAM tĩnh.
cho các chương trình dịch. Toán tử DATA SEGMENT báo cho chương trình dịch biết các lệnh theo sau sẽ nằm trong đoạn dữ liệu. Toán tử DB (Define Byte) gán cho nhãn SAMPLEB 1 byte trong đoạn dữ liệu. Ký hiệu ? xác định rằng không cần định nghĩa nội dung của byte đó. Do SAMPLEB là dòng đầu tiên nên nó sẽ có địa chỉ logic là 0. Phát biểu DATA ENDS kết thúc đoạn dữ liệu (ở đây chỉ dịnh nghĩa 1 byte). Trong trường hợp muốn định nghĩa 1 word, ta dùng toán tử DW (Define Word). VD: SAMPLEW DW 1000h Phát biểu này định nghĩa nhãn SAMPLEW ứng với vị trí word và nội dung của vị trí này là 1000h. Ngoài ra, ta có thể dùng các toán tử DD định nghĩa từ kép (double word), DQ định nghĩa từ bộ bốn (8 byte) và DT định nghĩa 10 byte. 3. Cách mã hoá lệnh Lệnh của bộ vi xử lý sẽ biểu diễn bằng các ký tự dưới dạng gợi nhớ (mnemonic) để có thể dễ dàng sử dụng. Đối với vi xử lý thì các lệnh được biểu diễn bằng các mã lệnh (opcode) nên sau khi nhận lệnh vi xử lý phải thực hiện giải mã lệnh rồi mới thực thi nó. Một lệnh vi xử lý có thể dài 1 byte hay nhiều byte. Nếu ta dùng 1 byte để mã hoá thì sẽ mã hoá được 256 lệnh khác nhau. Tuy nhiên do một lệnh không phải chỉ có một cách thực hiện nên ta không thể thực hiện đơn giản như trên. Để tìm hiểu cách mã hoá lệnh, ta xét lệnh MOV des,src dùng để chuyển dữ liệu giữa hai thanh ghi hay một ô nhớ và một thanh ghi. Lệnh MOV mã hoá như sau: 1 0 0 0 1 0 Opcode D W Mod reg M/R Để mã hóa lệnh MOV, ta cần dùng ít nhất là 2 byte trong đó 6 bit dùng cho mã lệnh. Bit D xác định hướng truyền của dữ liệu, D = 0 xác định dữ liệu sẽ đi từ thanh ghi cho bởi 3 bit Reg, D = 1 xác định dữ liệu sẽ đi đến thanh ghi cho bởi 3 bit Reg. Bit W xác định sẽ truyền 1 byte (W = 0) hay 1 word (W = 1). 3 bit Reg dùng để chọn thanh ghi sử dụng: Byte 1 Byte 2 Byte 3 Byte 4 Tài liệu vi xử lý Tổ chức hệ thống vi xử lý Phạm Hùng Kim Khánh Trang 40 Bảng 2.10: Thanh ghi Mã W = 1 W = 0 000 001 010 011 100 101 110 111 AX CX DX BX SP DI BP SI AL CL DL BL AH CH DH BH 2 bit mod và 3 bit R/M (Register / Memory) dùng để xác định chế độ địa chỉ cho các toán hạng của lệnh. Bảng 2.11: 11 MOD R/M 00 01 10 W = 1 W = 0 000 [BX]+[SI] [BX]+[SI]+addr8 [BX]+[SI]+addr16 AX AL 001 [BX]+[DI] [BX]+[DI]+addr8 [BX]+[DI]+addr16 CX CL 010 [BP]+[SI] [BP]+[SI] +addr8 [BP]+[SI] +addr16 DX DL 011 [BP]+[DI] [BP]+[DI] +addr8 [BP]+[DI] +addr16 BX BL 100 [SI] [SI] +addr8 [SI] +addr16 SP AH 101 [DI] [DI] +addr8 [DI] +addr16 BP CH 110 addr16 [BP] +addr8 [BP] +addr16 SI DH 111 [BX] [BX] +addr8 [BX] +addr16 DI BH Tổng quát, 8086/8088 có khoảng 300 tác vụ có thể có trong tập lệnh của nó. Mỗi lệnh kéo dài từ 1 đến 6 byte. Từ ví dụ trên, ta thấy mã lệnh có các vùng: - Vùng mã lệnh (opcode): chứa mã lệnh của lệnh sẽ thực thi - Vùng thanh ghi (reg): chứa các thanh ghi sẽ thực hiện (bảng 2.10) - Vùng chế độ (mod): (bảng 2.11) 00: toán hạng bộ nhớ trực tiếp nếu R/M = 110, ngược lại là toán hạng gián tiếp 01: toán hạng gián tiếp, độ dời 8 bit 10: toán hạng gián tiếp, độ dời 16 bit 11: sử dụng 2 thanh ghi, vùng R/M sẽ là vùng Reg - Vùng thanh ghi / bộ nhớ R/M (Reg/Mem): (bảng 2.11) Tài liệu vi xử lý Tổ chức hệ thống vi xử lý Phạm Hùng Kim Khánh Trang 41 4. Các cách định địa chỉ Bảng 2.12: Ví dụ Cách định địa chỉ Mã đối tượng Từ gợi nhớ Đoạn truy xuất Hoạt động Mô tả Tức thời B80010 MOV AX,1000h Mã AH ← 10h AL ← 00h (1) Thanh ghi 8BD1 MOV DX,CX Trong µP DX ← CX (2) Trực tiếp 8A260010 MOV AH,[1000h] Döõ lieäu AH ← [1000h] (3) Gián tiếp thanh ghi 8B04 FF25 FE4600 FF0F MOV AX,[SI] JMP [DI] INC BYTE PTR [BP] DEC WORD PTR [BX] Dữ liệu Dữ liệu Stack Dữ liệu AL ← [SI]; AH ←[SI+1] IP←[DI+1:DI] [BP]←[BP]+1 [BX+1:BX]← [BX+1:BX]-1 (4) Có chỉ số 8B4406 FF6506 MOV AX,[SI+6] JMP [DI+6] Dữ liệu Dữ liệu AL ← [SI+6]; AH ←[SI+7] IP←[DI+7:DI+6] (5) Có nền 8B4602 FF6702 MOV AX,[BP+2] JMP [BP+2] Stack Dữ liệu AL←[BP+2]; AH ←[BP+3] IP←[BX+3:BX+6] (6) Có nền và có chỉ số 8B00 FF21 FE02 FF0B MOV AX,[BX+SI] JMP [BX+DI] INC BYTE PTR [BP+SI] DEC WORD PTR [BP+DI] Dữ liệu Dữ liệu Stack Stack AL←[BX+SI];AH←[BX+SI+1] IP←[BX+DI+1:BX+DI] [BP+SI]←[BP+SI]+1 [BP+DI+1:BP+DI]← [BP+DI+1:BP+DI]-1 (7) Có nền và có chỉ số với độ dời 8B4005 FF6105 FE4205 FF4B05 MOV AX,[BX+SI+5] JMP [BX+DI+5] INC BYTE PTR [BP+SI+5] DEC WORD PTR [BP+DI+5] Dữ liệu Dữ liệu Stack Stack AL←[BX+SI+5] AH←[BX+SI+1] IP←[BX+DI+6:BX+DI+5] [BP+SI+5]←[BP+SI+5]+1 [BP+DI+6:BP+DI+5]← [BP+DI+6:BP+DI+5]-1 (8) String A4 MOVSB Thêm, dữ liệu [ES:DI] ← [DS:DI] Nếu DF = 0 thì SI ← SI + 1; DI ← DI + 1 Nếu DF = 1 thì SI ← SI - 1; DI ← DI - 1 (9) - BYTE PTR và WORD PTR tránh lầm giữa truy xuất byte và word. - Độ dời được cộng vào thanh ghi con trỏ hay nền là số nhị phân dạng bù 2. - (1): nguồn dữ liệu trong lệnh - (2): đích và nguồn là các thanh ghi của µP - (3): địa chỉ bộ nhớ cung cấp trong lệnh - (4): địa chỉ bộ nhớ cung cấp trong thanh ghi con trỏ hay chỉ số - (5): địa chỉ bộ nhớ là tổng của thanh ghi chỉ số cộng với độ dời trong lệnh - (6): địa chỉ bộ nhớ là tổng của thanh ghi BX hay BP cộng với độ dời trong lệnh - (7): địa chỉ bộ nhớ là tổng của thanh ghi chỉ số và thanh ghi nền Tài liệu vi xử lý Tổ chức hệ thống vi xử lý Phạm Hùng Kim Khánh Trang 42 - (8): địa chỉ bộ nhớ là tổng của thanh ghi chỉ số, thanh ghi nền và độ dời trong lệnh - (9): địa chỉ nguồn bộ nhớ là thanh ghi SI trong đoạn dữ liệu và địa chỉ đích bộ nhớ là thanh ghi DI trong đoạn thêm 4.1. Định địa chỉ tức thời Các lệnh dùng cách định địa chỉ tức thời lấy dữ liệu trong lệnh làm một phần của lệnh. Trong cách này, dữ liệu sẽ được chứa trong đoạn mã thay vì trong đoạn dữ liệu. Dữ liệu cho lệnh MOV AX,1000h được cung cấp tức thời sau mã lệnh B8. Chú ý rằng trong mã đối tượng byte dữ liệu cao đi sau byte dữ liệu thấp. Cách định địa chỉ tức thời thường dùng để nạp một thanh ghi hay vị trí bộ nhớ với các dữ liệu ban đầu. Sau đó, các lệnh kế tiếp sẽ làm việc với các dữ liệu này. Tuy nhiên, cách định địa chỉ này không sử dụng được cho các thanh ghi đoạn. 4.2. Định địa chỉ thanh ghi Một số lệnh chỉ làm công việc chuyển dữ liệu giữa các thanh ghi của µP. Ví dụ như MOV DX,CX sẽ chuyển dữ liệu từ thanh ghi CX vào thanh ghi DX. Ở đây ta không cần thực hiện tham chiếu bộ nhớ. Ta có thể kết hợp cách định địa chỉ tức thời và định địa chỉ thanh ghi để nạp dữ liệu cho các thanh ghi đoạn. VD: MOV AX, 1000h MOV CS,AX Sau khi thực hiện 2 lệnh này, giá trị của thanh ghi CS sẽ là 1000h. 4.3. Định địa chỉ trực tiếp Ngoài 2 cách định địa chỉ trên, tất cả các cách định địa chỉ còn lại cho trong bảng 2.6 đều cần phải truy xuất đến bộ nhớ với ít nhất một toán hạng. Trong cách định địa chỉ trực tiếp, địa chỉ bộ nhớ được cung cấp trực tiếp như là một phần của lệnh. Ví dụ như lệnh MOV AH,[1000h] sẽ đưa nội dung chứa trong ô nhớ DS:1000h vào thanh ghi AH hay lệnh MOV [2000h],AX sẽ đưa nội dung chứa trong AX vào 2 ô nhớ liên tiếp DS:2000h và DS:2001h 4.4. Định địa chỉ truy xuất bộ nhớ gián tiếp Các cách định địa chỉ trực tiếp sẽ thuận lợi cho các truy xuất bộ nhớ không thường xuyên. Tuy nhiên, nếu một ô nhớ cần phải truy xuất nhiều lần trong một chương trình thì quá trình nhận địa chỉ (2 byte) sẽ phải thực hiện nhiều lần. Điều này sẽ không hiệu quả. Để giải quyết vấn đề này, ta thực hiện lưu trữ địa chỉ của ô nhớ cần truy xuất trong một thanh ghi con trỏ, chỉ số hay thanh ghi cơ sở (BX, BP, SI hay DI). Ngoài ra, ta có thể sử dụng độ dời bù 2 bằng cách cộng vào các thanh ghi để dời đi so với vị trí được các thanh ghi chỉ đến. Tài liệu vi xử lý Tổ chức hệ thống vi xử lý Phạm Hùng Kim Khánh Trang 43 Bảng 2.13: Địa chỉ hiệu dụng (EA – Effective Address) Cách định địa chỉ Độ dời Thanh ghi nền Thanh ghi chỉ số Gián tiếp thanh ghi Có chỉ số Có nền Có nền và chỉ số Có nền và chỉ số với độ dời Không Không -128 ÷ 127 -128 ÷ 127 Không -128 ÷ 127 BX hay BP Không Không BX hay BP BX hay BP BX hay BP Không SI hay DI SI hay DI Không SI hay DI SI hay DI Như vậy, một độ dời có thể được cộng vào thanh ghi nền và kết quả này được cộng tiếp vào thanh ghi chỉ số. Địa chỉ thu được gọi là địa chỉ hiệu dụng EA. Ngoài ra ta cũng có thể viết cách định địa chỉ gián tiếp như sau: MOV AX,table[SI] Trong đó table là nhãn gán cho một vị trí ô nhớ nào đó. Lệnh này sẽ truy xuất phần tử thứ SI trong dãy table (giả sử SI = 2 thì sẽ truy xuất phần tử thứ 2). Ta cũng có thể viết lệnh trên như sau: MOV AX,[table + SI] Chú ý rằng các đoạn mặc định cho các cách định địa chỉ gián tiếp là đoạn stack khi dùng BP, là đoạn dữ liệu khi dùng BX, SI hay DI. VD: Lệnh: MOV AH,10h thực hiện định địa chỉ tức thời MOV AX,[BP + 10] thực hiện định địa chỉ có nền MOV AH,[BP + SI] thực hiện định địa chỉ có nền và có chỉ số 4.5. Định địa chỉ chuỗi Chuỗi là một dãy liên tục các byte hay word lưu trữ trong bộ nhớ dưới dạng các ký tự ASCII. 8086/8088 có các lệnh dùng để xử lý chuỗi, các lệnh này sử dụng cặp thanh ghi DS:SI để chỉ nguồn chuỗi ký tự và ES:DI để chỉ đích chuỗi. Lệnh MOVSB sẽ chuyển byte dữ liệu nguồn đến vị trí đích trong đó SI và DI sẽ tăng hay giảm tuỳ theo giá trị của DF (xem 2.3.4 và bảng 2.13) 4.6. Thay đổi thanh ghi đoạn mặc định Như đã nói ở phần trên, khi sử dụng các lệnh định địa chỉ thanh ghi, ta chỉ cần dùng các thanh ghi để xác định độ lệch còn các thanh ghi đoạn thì được hiểu mặc định. Ví dụ như ta dùng lệnh MOV AH,[BP] thì sẽ đưa dữ liệu tại ô nhớ SS:BP vào thanh ghi AH. Trong trường hợp không muốn dùng thanh ghi đoạn mặc định, ta có thể thay đổi bằng cách thêm tên thanh ghi đoạn vào để loại bỏ thanh ghi đoạn mặc định. Ví dụ lệnh MOV AH,CS:[BP] sẽ đưa dữ liệu tại CS:[BP] vào AH.
File đính kèm:
- Vi_Xu_Ly_2.pdf