Chương VI: Kiến trúc bộ lệnh
6.3. Mã hóa tập lệnh
Một chương trình bao gồm một dãy các lệnh (hay còn gọi là chỉ thị), mỗi lệnh chỉ rõ một việc làm cụ thể nào ựó của máy tắnh như thực hiện phép cộng, thực hiện nhập dữ liệu, thực hiện ựọc dữ liệu từ bộ nhớ,Ầ
Như chúng ta ựã thấy ở trên, trong một câu lệnh gồm có nhiều phần. Trong ựó tác vụ thực hiện mỗi lệnh ựược chỉ rõ trong một trường gọi là mã phép toán (operation code) hay mã tác vụ và ựược gọi tắt là opcode, cho biết hành ựộng nào sẽ ựược thi hành (từ ựây trở ựi ta dùng cụm từ mã tác vụ). Trong một lệnh còn chỉ ra ựược thực hiện trên các thanh ghi hay ựịa chỉ (address) ô nhớ, nơi chứa ựựng dữ liệu cần xử lý.
Trong hình 6.3 cho ta 3 trường hợp mã hóa lệnh ựơn giản là một số khuôn dạng ựiển hình của các bộ lệnh. Trường hợp thứ nhất chỉ có mã tác tụ mà không có phần ựịa chỉ. Trường hợp thứ hai mã một lệnh có 2 phần, phần tác vụ lệnh và ựịa chỉ và trường hợp thú 3 (c) thì phần ựịa chỉ chiếm 2 vùng của mã lệnh.
Opcode (a)
Opcode địa chỉ
(b)
Opcode địa chỉ 1 địa chỉ 2
Hình 6.3. Một vài dạng mã lệnh
Tùy thuộc vào kiến trúc của máy tắnh, trong một loại máy tắnh mã lệnh có thể có cùng chiều dài hoặc khác nhau. Trên một số máy tắnh tất cả các lệnh ựều có cùng ựộ dài (Power PC, SPARC, MIPS), một số máy khác lại có thể có hai hoặc ba ựộ dài khác nhau (IBM 360/70, Intel 80x86), thậm chắ ựộ dài mã lệnh có thể thay ựổi tùy ý (VAX). Ngoài ra một lệnh có thể ngắn hơn, dài hơn hoặc bằng với ựộ dài một từ.
6.3.1. Các tiêu chuẩn thiết kế dạng thức lệnh
Vì có thể có nhiều dạng khác nhau của các lệnh, cho nên khi thiết kế máy tắnh cần có các tiêu chắ rõ ràng ựể lựa chọn dạng thức lệnh cho máy cần thiết kế. Một số các tiêu chắ chắnh ựược các nhà thiết kế ựưa ra như sau:
Tiêu chuẩn thiết kế 1: Mã lệnh ngắn ưu việt hơn mã lệnh dài
đây là tiêu chuẩn ựầu tiên và cũng là quan trọng nhất. Một chương trình gồm n lệnh 16 bit chỉ chiếm chừng một nửa không gian bộ nhớ so với n lệnh 32 bit. Suy cho cùng, bộ nhớ không miễn phắ, bởi vậy nhà thiết kế không thắch lãng phắ nó.
Ngoài ra thì mỗi bộ nhớ có một tốc ựộ truyền cụ thế, ựược quyết ựịnh qua công nghệ và thiết kế kỹ thuật. Nếu tốc ựộ truyền của bộ nhớ là T bit/giây (bps - bit per second) và chiều dài lệnh trung bình là L thì nó có thể truyền ựi nhiều nhất là T/L lệnh trên một giây. Vì vậy, tốc thi hành lệnh (tức tốc ựộ bộ xử lý) tùy thuộc vào ựộ dài lệnh. Lệnh ngắn hơn ựồng nghĩa với bộ xử lý nhanh hơn.
Nếu thời gian thi hành lệnh quá lâu so với thời gian tìm nạp nó từ bộ nhớ, thời gian tìm nạp lệnh sẽ không quan trọng. Nhưng với CPU nhanh, bộ nhớ thường là nút cổ chai. Bởi vậy, tăng số lệnh tìm nạp trên mỗi giây là tiêu chuẩn thiết kế quan trọng.
Tiêu chuẩn thiết kế thứ 2: Dộ dài mã lệnh ựủ ựế biểu diễn tất cả phép toán mong muốn
Nếu chúng ta cần thiết kế một máy tắnh với 2n các thao tác hay các vi tác vụ, thì ta không thể dùng mã hóa lệnh với ựộ dài nhỏ hơn n. đơn giản không ựủ chỗ trong opcode ựế cho biết là lệnh nào hay mã hóa tất cả các lệnh ựó.
Tiêu chuẩn thiết kê thứ 3: ựộ dài word của máy bằng bội số nguyên của ựộ dài ký tự.
Trong trường hợp mà ký tự có k bit, ựộ dài từ phải là k, 2k, 3k, 4k,Ầ còn không sẽ lãng phắ không gian khi lưu trữ các từ.
Tất nhiên có thế lưu trữ 3.5 ký tự trong một word, song việc ựó sẽ làm việc sẽ gây ra tình trạng kém hiệu quả nghiêm trọng trong khi truy cập các ký tự. Hạn chế do mã ký tự áp ựặt lên chiều dài từ cũng ảnh hưởng ựến chiều dài mã lệnh, bởi vì một lệnh tốt nhất là chiếm một số nguyên các byte hoặc số lệnh nguyên phải nằm gọn trong một từ.
Tiêu chuẩn thiết kế thứ 4: số BIT trong trường ựịa chỉ càng ngắn càng tốt
Tiêu chuẩn này liên quan tới việc chọn kắch thước ô nhớ. Cứ xem thiết kế máy với ký tự 8 bit (có thế 7 bịt cộng tắnh chẵn lẻ) và bộ nhớ chắnh chứa 216 ký tự sẽ thấy. Nhà thiết kế có thể chọn gán ựịa chỉ liên tiếp cho ựơn vị 8, 16, 24, hoặc 32 bit, cùng những khả năng khác.
Hãy hình dung chuyện gì sẽ xảy ra nếu ựội ngũ thiết kế phân hóa thành hai phe gây chiến, một phe dốc sức tạo byte 8 bit, ựơn vị cơ bản của bộ nhớ, còn phe kia ra sức tạo từ 32 bit như là ựơn vị cơ bản của bộ nhớ. Phe ựầu ựề nghị bộ nhớ 216 byte, ựược ựánh số 0, 1, 2, 3,..., 65535. Phe sau ựề xuất bộ nhớ 214 từ, ựược ựánh số 0, 1, 2, 3..., 16383.
Nhóm thứ nhất chỉ ra rằng ựế so sánh hai ký tự trong tổ chức từ 32 bit, chương trình chẳng những tìm nạp từ chứa ký tự mà còn phải trắch từng ký tự trong từ mới so sánh ựược. Làm vậy sẽ tốn thêm lệnh và lãng phắ không gian. Trái lại, tổ chức 8 bit cung cấp ựịa chi cho từng lệnh, giúp so sánh dễ dàng hơn nhiều.
Phe ựề xuất 32 bit sẽ phản bác bằng lập luận rằng ựề xuất của họ chỉ cần 214 ựịa chỉ riêng biệt, cho ựộ dài ựịa chỉ 14 bit mà thôi, còn ựề nghị byte 8 bit ựòi hỏi 16 bit ựể lập ựịa chỉ cùng một bộ nhớ. địa chi ngắn hơn ựồng nghĩa với lệnh ngắn hơn, không những chiếm ắt không gian mà còn ựòi hỏi ắt thời gian tìm nạp hơn. Hoặc có thể giữ nguyên ựịa chỉ 16 bit ựế tham chiếu bộ nhớ lớn gấp 4 lần mức cho phép của tổ chức 8 bit.
Vắ dụ này cho thấy rằng ựể ựạt sự phân giải bộ nhớ tốt hơn, người ta phảỉ trả cái giá bằng ựịa chỉ dài hơn, nói chung, có nghĩa
là lệnh dài hơn. Mục tiêu tối thượng trong sự phân giải là tổ chức bộ nhớ có thế lập ựịa chỉ trực tiếp từng bit.
Thực tế có những máy tắnh mà chiều dài word chỉ có 1 bit (vắ dụ máy Burroughs B1700), lại có những máy mà word rất dài, tới 60 bit (như máy CDC Cyber)
6.3.2. Opcode mở rộng
Trong phần này chúng ta xem xét những cân nhắc và thỏa hiệp liên quan ựến mã tác vụ - opcode và ựịa chỉ.
Giả sử ta có lệnh (n+k) bit với opcode chiếm k bit và ựịa chỉ chiếm n bit. Lệnh này cung cấp 2k phép toán khác nhau và 2n ô nhớ lập ựịa chỉ ựược. Hoặc, cùng n + k bit ựó có thế chia thành opcode (k Ờ 1) bit và ựịa chỉ (n+1) bit, tức chỉ một nửa số lệnh nhưng gấp ựôi bộ nhớ lập ựịa chỉ ựược, hoặc cũng dung lượng bộ nhớ ựó nhưng Opcode (k+1) bit và ựịa chỉ (n-1) bit cho nhiều phép toán hơn, song phải trả giá bằng số ô lập ựịa chỉ ựược ắt hơn. Giữa bit opcode và bit ựịa chỉ có những quân bình rất tinh tế cũng như ựơn giản hơn như vừa trình bày.
để hiểu rõ vấn ựề chúng ta xem vắ dụ một máy tắnh có lệnh dài 16 bit, trong ựó mã vi tác vụ opcode dài 4 bit và 3 trường ựịa chỉ, mỗi trường dài 4 bit như hình 6.4.
Như vậy, ứng với mã vi tác vụ 4 bit sẽ cung cấp cho ta 24=16 lệnh khác nhau với 3 ựịa chỉ. Nhưng nếu nhà thiết kế cần 15
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Opcode địa chỉ 1 địa chỉ 2 địa chỉ 3
lệnh ba ựịa chỉ, hoặc 14 lệnh hai ựịa chỉ, hoặc 31 lệnh một ựịa chỉ thì họ sẽ phải lảm thế nào?
đối với trường hợp thứ nhất 15 lệnh ba ựịa chỉ thì nhà thiết kế có thể lấy nguyên cấu trúc trên hình 6.4, nhưng bỏ ựi một trường hợp của opcode như trong hình 6.5(a).
Hình 6.5. Một số dạng thức lệnh cho 16 bit 1111 0000 yyyy zzzz 1111 0001 yyyy zzzz 1111 0010 yyyy zzzz . . . 1111 1011 yyyy zzzz 1111 1100 yyyy zzzz 1111 1101 yyyy zzzz 16 bit opcode 8 bit 14 lệnh 2 ựịa chỉ b) 0000 xxxx yyyy zzzz 0001 xxxx yyyy zzzz 0010 xxxx yyyy zzzz . . . 1100 xxxx yyyy zzzz 1101 xxxx yyyy zzzz 1110 xxxx yyyy zzzz 16 bit opcode 4 bit 15 lệnh 3 ựịa chỉ a)
Hình 6.5 (tiếp theo). Một số dạng thức lệnh cho 16 bit
Tương tự ựể có 4 lệnh hai ựịa chỉ ta làm như hình 6.5(b) và 31 lệnh một ựịa chỉ như hình 6.7(c).
Các bit cao nhất (bit 12 ựến 15) trong trường hợp b) ựược gán mặc ựịnh trị nhị phân Ộ1Ợ, bốn bit kế ựó (bit 8 ựến 11) sẽ mã hóa các tác vụ cần thiết. Vì 4 bit thì mã hóa ựược 16 tác vụ, nhưng trong trường hợp này ta chỉ cần 14 tác vụ, do ựó còn 2 vị trắ không dùng ựến. Trong các trường hợp có tổ hợp code còn lại không dùng, như trong hình 6.5 (b) thì tổ hợp opcode 1111 1110 và 1111 1111 sẽ ựược xử lý ựặc biệt.
Như vậy ựộ dài các lệnh là như nhau, ựều 16 bit, nhưng trong trường hợp a) thì ựộ dài opcode là 4, trường hợp b) là 8 trong khi trường hợp c) là 12 bit.
1111 1110 0000 zzzz 1111 1110 0001 zzzz . . 1111 1110 1110 zzzz 1111 1110 1111 zzzz 1111 1111 0000 zzzz 1111 1111 0001 zzzz . . 1111 1111 1101 zzzz 1111 1111 1110 zzzz 16 bit opcode 12 bit 31 lệnh 1 ựịa chỉ c)
6.3.3. Vắ dụ về dạng thức lệnh
để hiểu rõ hơn cac vấn ựề trong mã hóa lệnh, trong phần này chúng ta sẽ khảo sát dạng thức lệnh trong các máy PDP-11 và Intel. Ở ựây chúng ta ựưa ra máy PDP-11 vì tập lệnh của nó ựược xem là một ựiển hình về tắnh ựơn giản và hợp lý.
PDP-11
đa số lệnh hai toán hạng của PDP-11 ựược mã hóa như trong hình 6.6. Mỗi lệnh chứa opcode 4 bit và hai trường ựịa chỉ 6 bit. Một bit opcode ở cự trái cho biết lệnh vận hành trên byte hay word. Trường ựịa chỉ ựược chia nhỏ thành hai phần, phần chế ựộ (mode) 3 bit và thanh ghi (Register ) 3 bit (Máy PDP-11 có 8 thanh ghi cho nên chỉ cần 3 bit là có thể mã hóa ựược toàn bộ các thanh ghi). Trường chế ựộ cho biết toán hạng nằm trong thanh ghi, trong bộ nhớ hay là một hằng số, v.v. Có tám mode giống nhau cho toán hạng nguồn cũng như cho toán hạng ựắch. Mọi opcode ựều có thể dùng bất kỳ toán hạng nguồn và toán hạng ựắch nào.
Tập lệnh trong PDP-11 sử dụng là trực giao (orthogonal), là tập lệnh trong ựó phương thức qui ựịnh ựịa chỉ các toán hạng ựộc lập với opcode ựược các nhà viết trình biên dịch rất thắch vì tập lệnh trực giao làm cho công việc của họ ựơn giản ựi rất nhiều.
đối với một số lệnh khác, kể cả lệnh một toán hạng, PDP- 11 áp dụng lược ựồ opcode mở rộng, theo cách này thì các opcode có dạng x111 ựược dùng ựế tránh khỏi phải dùng các mã lệnh dài
byte/word
15 14 12 11 9 8 6 5 3 2 0
LỆNH MODE REGISTER MODE REGISTER
opcode Toán hạng nguồn
Source operand
Toán hạng ựắch Destination operand
hơn. Với hầu hết các lệnh một toán hạng lấy opcode 10 bit và trường mode/register 6 bit, như vậy ựộ dài lệnh vẫn là 16 bit giống như các lệnh 2 toán hạng. Khi ựó trường mã tác vụ sẽ có 10 bit bao gồm 4 bit của trường opcode và 6 bit của trường toán hạng nguồn (xem hình vẽ 6.6).
Các lệnh có lập ựịa chỉ bộ nhớ trong PDP-11 sẽ có thêm một hay hai word 16 bit ựi theo sau lệnh ựịa chỉ ựể chỉ ra các ựịa chỉ này.
Họ lntel 8088/80286/80386/Pentium
Với CPU Intel, tình hình phức tạp hơn nhiều và kém ựều ựặn hơn nhiều. đặc biệt ựối với Pentium, mô hình chung như hình 6. Cấu tạo phức tạp của Pentium là do nó ựược kế thừa từ nhiều thế hệ trong một khoảng thời gian dài và do ngay từ ựầu việc lựa chọn các tắnh chất ựã không ựược thành công lắm. điều này chắnh là do ựòi hỏi phải kế thừa các ựặc tắnh ra trước mà nó không thể thay ựổi cấu trúc của mình. Nói chung, ựối với lệnh hai toán hạng, nếu toán hạng này nằm trong bộ nhớ thì toán hạng kia có thể không nằm trong bộ nhớ. Do ựó tồn tại các lệnh cộng hai thanh ghi, lệnh cộng thêm giá trị thanh ghi vào bộ nhớ và cộng thêm bộ nhớ vào thanh ghi, nhưng không tồn tại lệnh cộng thêm một từ vào một từ nhớ khác, một ựiều mà PDP-I 1 cho phép như là kết quả trực giao.
Trên 8088, mỗi opcode là 1 byte, nhưng ựến khi 80386 ra ựời thì opcode 1 byte dùng không ựủ ựể mã hóa hết tập lệnh, do ựó bit 15 của opcode ựược dùng ựế tránh phải dùng opcode 2 byte. Cấu trúc duy nhất trong trường opcode là sử dụng bit thứ tự thấp trong một số lệnh ựể cho biết byte/word, và bit bên cạnh ựế chỉ ựịa chỉ bộ nhớ (nếu có) là nguồn hay là ựắch
Tiếp sau byte opcode trong nhiều lệnh là byte thứ hai cho biết vị trắ toán hạng, tương tự như hai trường mode/register trong hình 6.6. Do chỉ có sẵn 8 bit, nên tách ra thành trường chế ựộ 2 bit và hai trường thanh ghi 3 bit. Vậy chỉ có bốn cách lập ựịa chỉ toán hạng (so với tám cách trên PDP-11), và một trong số toán hạng luôn phải là thanh ghi. Về logic, AX, BX, CX, DX, SI, DI, BP, và
SP phải cụ thể như thanh ghi, song nguyên tắc mã hóa ngăn cấm một số kết hợp và dùng chúng vào trường hợp ựặc biệt.
Bên cạnh ựó, một số lệnh có 1, 2, hoặc 4 byte trở lên qui ựịnh ựịa chỉ bộ nhớ và có thể 1 , 2, hoặc 4 byte nữa dùng làm toán hạng hằng (chẳng hạn như di chuyến con số 100 vào thanh ghi).
Bảng 6.2 cung cấp tập dạng thức lệnh 8088, 80286, 80386 và Pentium. Mỗi lệnh tiềm chứa tối ựa sáu trường, mỗi trường từ 0 ựến 4 byte. Trên 8088 và 80286, lệnh ngắn nhất là 1 byte và dài nhất là 9 byte. Trên 80386 cũng như Pentium, lệnh ngắn nhất vẫn là 1 byte, nhưng thêm tiền tố kắch thước toán hạng và tiền tố kắch thước ựịa chỉ, lệnh có thể tối ựa 16 byte.
CPU PREFIX OPCODE MODE SIB DISPLACEMENT IMMEDIATE
8088 0-3 1 0-1 0 0-2 0-2
80286 0-3 1 0-1 0 0-2 0-2
80386 0-4 1-2 0-1 0-1 0-4 0-4
Pentium 0-4 1-2 0-1 0-1 0-4 0-4
Bảng 6.2. Dạng thức lệnh của các máy tắnh Intel Hình 6.7 cho ta thấy dạng thức lệnh của máy Pentium với các trường ựược ựịnh nghĩa như sau :
Ớ PREFIX byte : ựó là phần mã thêm của mã lệnh ựược ựặt trước opcode. Nếu nó tồn tại thì nó bao gồm LOCK tiếp ựầu tố (prefix) và tiếp ựầu tố lập lại (repeat prefix). LOCK prefix ựược dùng ựể ựảm bảo việc dành riêng vùng nhớ chia sẻ trong môi trường ựa bộ xử lý. Trong khi repeat prefix ựặc trưng cho một chuỗi phép toán ựược lập ựi lập lại, ựiều này cho phép CPU Pentium thực hiện nhanh hơn là một vòng lập ựược lập trình.
Ớ Opcode : chiếm 1 hoặc 2 byte. Opcode có thể bao gồm những bit chỉ ra dữ liệu là không ựầy ựủ hay là ựầy ựủ (16 hoặc 32 bit phụ thuộc vào từng trường hợp cụ thể), bit chỉ ra hướng của dữ liệu ựến bộ nhớ hoặc từ bộ nhớ ựi
Ớ ModR/M : byte này chỉ ra các thông tin về toán hạng. Byte ModR/M chỉ ra toán hạng là một thanh ghi hay là trong bộ nhớ. Nếu nó là trong bộ nhớ thì bên trong trừơng này sẽ chỉ
ra mode ựịa chỉ nào ựược dùng. Trường ModR/M bao gồm 3 phần : phần mode 2 bit và hai phần Reg/Opcode và R/M mỗi phần 3 bit nữa. đôi khi 3 bit của trường Reg/Opcode ựược sử dụng với tắnh cách là phần mở rộng của Opcode tạo nên trường Opcode với 11 bit. Trường Mod chỉ có 2 bit, ựiều ựó