Chúng ta s sử dụng s0, s1 để biểu thị các thanh ghi tương ứng với các biến trong ngôn ngữ lập trình C cũng như Java và các thanh ghi t0, t1 như là các thanh ghi tạm để biên dịch từ chươn
Trang 2BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
Trang 3LỜI CAM ĐOAN
Tôi tên là Đoàn Vũ Thịnh, hiện đang là học viên cao học ngành Công nghệ Thông tin, khóa 2010 của trường Đại học Bách khoa Hà Nội Tôi xin cam đoan và hoàn toàn chịu trách nhiệm về lời cam đoan này:
Toàn bộ nội dung của Luận văn Thạc sỹ này là do chính tôi thực hiện dưới
sự hướng dẫn tận tình của PGS TS Trịnh Văn Loan
Trong quá trình thực hiện Luận văn tôi có kế thừa kiến thức trong những tài liệu tham khảo (phần tài liệu tham khảo)
Các kết quả mô phỏng, thí nghiệm sử dụng để kết luận và đánh giá trong Luận văn là hoàn toàn chân thực
Hà Nội, ngày 30 tháng 8 năm 2012
Đoàn Vũ Thịnh
Trang 4LỜI CẢM ƠN
Trải qua khoảng thời gian học tập theo chương trình cao học của Trường Đại học Bách khoa Hà Nội, tôi đã được các thầy cô giảng dạy trong chương trình cao học truyền đạt cho nhiều kiến thức mới Tôi xin chân thành cảm ơn PGS.TS Trịnh Văn Loan người đã tận tình hướng dẫn và giúp đỡ tôi thực hiện Luận văn Thạc sỹ này Tôi cũng xin cảm ơn đến các thầy cô của Trường Đại học Bách khoa Hà Nội
đã giảng dạy và tạo nhiều điều kiện thuận lợi để tôi hoàn thành khóa học này Cảm
ơn các đồng nghiệp tại Trường Đại học Nha Trang cũng như các bạn học viên lớp Cao học Công nghệ Thông tin khóa 2010 đã trao đổi, góp ý và giúp đỡ tôi trong lúc học tập cũng như lúc thực hiện luận văn này
Đoàn Vũ Thịnh
Trang 5DANH MỤC CÁC KÝ HIỆU, CÁC TỪ VIẾT TẮT
ALU Arthimetic Logic Unit Đơn vị số học và Logic
ASIC Application Specific Intergrated Circuit Mạch tích hợp có ứng dụng
chuyên biệt CPLD Complex Programmable Logic Device Thiết bị Logic khả trình có cấu
trúc phức tạp
MIPS Microprocessor without Interlocked Bộ xử lý không có các đoạn
FPGA Field Programmable Gate Arrays Mảng các cổng khả trình
PLD Programmable Logic Device Thiết bị Logic khả trình
RAM Random Access Memory Bộ nhớ truy cập ngẫu nhiên
Trang 6DANH MỤC BẢNG
Bảng 1.1 Kiến trúc cơ bản của MIPS 4
Bảng 1.2 Các toán hạng trong MIPS 9
Bảng 1.3 Ngôn ngữ MIPS assembly 9
Bảng 1.4 ảng chuyển đổi hệ 16-2 10
Bảng 1.5 Mã hóa lệnh MIPS 12
Bảng 1.6 Ph p toán có liên quan đến logic trên C và MIPS 13
Bảng 1.7 Tổng hợp kiến trúc của tập lệnh MIPS 18
Bảng 1.8 Các thanh ghi qua lời gọi thủ tục 25
Bảng 1.9 Quy ước thanh ghi MIPS 25
Bảng 1.10 Tổng hợp các toán hạng, ngôn ngữ asembly và thanh ghi trong MIPS 26
Bảng 2.1 Các bit điều khiển của ALU 46
Bảng 2.2 ảng trạng thái của đường điều khiển ALU 47
Bảng 2.3 Ảnh hưởng của 7 t n hiệu điều khiển 50
Bảng 2.4 Thiết lập các đường điều khiển b ng cách xác định các giá trị từ trường lệnh 51
Bảng 2.5 Các chức năng điều khiển của lệnh đơn chu k 55
ản Khuôn dạng của lệnh MIPS 32-bit 59
ản Tập lệnh MIPS của bộ vi xử lý 60
Trang 7DANH MỤC HÌNH
6
8
16
22
29
30
nh 1.7 30
34
36
38
38
39
40
- 41
42
44
45
48
49
51
52
53
55
57
Trang 861
Hình 3.2 n nh n l nh c a CPU 63
Hình 3.3 nh gi i mã l nh 64
Hình 3.4 n th c thi l nh 66
Hình 4.1 Ki n trúc c u khi n – CU 67
Hình 4.2 n nh n l nh 68
Hình 4.3 Giai n gi i mã l nh 69
Hình 4.4 n th c hi n l nh 70
Trang 9MỤC LỤC
LỜI CAM ĐOAN i
LỜI CẢM ƠN ii
DANH MỤC CÁC KÝ HIỆU, CÁC TỪ VIẾT TẮT iii
DANH MỤC BẢNG iv
DANH MỤC HÌNH v
MỞ ĐẦU 1
CHƯƠNG I: KIẾN TRÚC TẬP LỆNH MIPS 3
1.1 Giới thiệu 3
1.2 Các toán hạng của MIPS 5
1.3 Mô tả các lệnh trong máy t nh 9
1.4 Các trường của MIPS 10
1.5 Các ph p toán liên quan đến logic 13
1.6 Lệnh h trợ ra quyết định 15
16
18
1.7 Hàm và thủ tục trong phần cứng máy t nh 19
1.8 Liên kết với thế giới 28
1.9 Địa chỉ 32 bit và ph p toán với h ng số có độ dài 32bit 30
30
31
CHƯƠNG II: CÁC THÀNH PHẦN CỦA BỘ XỬ LÝ THEO KIẾN TRÚC MIPS 33
2.1 Tổng quan cơ chế MIPS 33
2.2 Thành phần logic 37
2.3 Các thành phần thực thi tập lệnh MIPS 39
2.4 Chi tiết các thành phần 45
CHƯƠNG III: THIẾT KẾ TẬP LỆNH MIPS VỚI VHDL 59
Trang 103.1 Tổng quan 59
3.2 Mô tả kiến trúc MIPS với VH L 61
- CU) 61
n nh n l nh (Instruction Fetch) 62
3.2.3 Gi i mã l nh (Decode) 64
3.2.4 Th c thi l nh (Execute) 65
CHƯƠNG IV: KẾT QUẢ ĐẠT ĐƯỢC 67
4.1 Những mặt đạt được 67
4.2 Những mặt còn hạn chế 71
4.3 Hướng phát triển tiếp theo của luận văn 71
TÀI LIỆU THAM KHẢO 72
PHỤ LỤC 73
Trang 11MỞ ĐẦU
Kiến trúc MIPS được phát triển vào những năm 80 của thế kỷ XX do John L Hennesy sáng lập Nền tảng kiến trúc MIPS được ứng dụng rộng rãi trong các dòng
vi xử lý của các hãng sản xuất linh kiện bán dẫn như Sony, NEC hay Motorola Từ
đó, kiến trúc MIPS được thay đổi không ngừng để có thể đáp ứng được nhu cầu của người dùng từ đơn mức lệnh đến kiến trúc Pipeline Với công nghệ FPGA cho ph p người dùng có thể tự thiết kế, kiểm chứng hoạt động của kiến trúc MIPS trước khi đưa vào sản xuất hàng loạt chip cho thị trường ên cạnh đó, FPGA còn phát huy hiệu quả trong giảng dạy và nghiên cứu ở các trường Đại học và Viện nghiên cứu trong các ngành như: kiến trúc máy t nh, xử lý t n hiệu số, thiết kế mạch số… Và để
có cái nhìn trực quan hơn về kiến trúc MIPS nên tôi đã chọn đề tài ”Tìm hiểu lý
thuyết và thực nghiệm về công nghệ FPGA trong thiết kế CPU theo kiến trúc MIPS”
Như đã nói ở trên, kiến trúc MIPS được phát triển từ những năm cuối của thế kỷ XX từ đó nó đã được ứng dụng rộng rãi trong các hãng sản xuất linh kiên bán dẫn và còn phát triển tiếp tục với các phiên bản sau này Việc tập trung mô tả kiến trúc này giúp chúng ta có cái nhìn trực quan hơn về MIPS cũng như việc sử dụng FPGA như một lõi của CPU cho phép thực hiện các công việc mà không phải tiến hành thiết kế, chế tạo một bộ vi xử lý thực thụ
Mục đ ch nghiên cứu của luận văn là tìm hiểu kiến trúc tập lệnh MIPS và tiến hành mô tả cách thức hoạt động của nó trên FPGA Trong giới hạn của luận văn này tôi chỉ tiến hành mô tả kiến trúc MIPS đơn mức lệnh và đơn chu k
Đề tài đã hoàn thành được mục tiêu đặt ra ở trên và mang lại lợi ích cho việc học tập cũng như nghiên cứu kiến trúc của các bộ vi xử lý khác, mở ra hướng nghiên cứu rộng hơn của công nghệ FPGA sau này Đề tài cũng hoàn tất việc cài đặt các module và chương trình hoàn thiện trên kit FPGA thực tế
Phương pháp nghiên cứu tôi sử dụng ở đây là b ng thực nghiệm, toàn bộ các quá trình đều được thiết kế trên phần mềm Quartus II, sử dụng ngôn ngữ mô tả phần cứng VHDL và nạp chương trình lên KIT E1 để khảo sát sau khi trải qua giai đoạn
Trang 12mô phỏng trên Quartus II
Luận văn được trình bày trong 4 chương:
Chươn : Giới thiệu tổng quan về kiến trúc tập lệnh MIPS bao gồm: mô
tả các lệnh trong máy tính theo kiến trúc MIPS Các toán hạng, các trường lệnh
trong một lệnh MIPS cụ thể Một số lệnh đặc trưng cho tập lệnh MIPS
Chươn : Các thành phần bộ xử lý theo kiến trúc tập lệnh MIPS Về mặt
logic, nêu ra các thành phần logic đáp ứng cho kiến trúc MIPS Về mặt thiết kế tập lệnh, tiến hành khảo sát các khối logic tương ứng với các lệnh MIPS cơ bản Về phần thiết kế thành phần, chính là khảo sát các bộ ALU, CU, các tín hiệu điều
khiển, các luồng dữ liệu trong một chu trình thực thi lệnh
Chươn : Thiết kế tập lệnh MIPS với VHDL Mô tả kiến trúc MIPS, các
thành phần logic, thành phần liên kết b ng ngôn ngữ mô tả phần cứng Thiết kế đơn
vị điều khiển, thiết kế quy trình nhận lệnh, thực thi và giải mã lệnh Kiểm chứng với
một số lệnh cụ thể như lw, sw, beq
Chươn 4: Nêu ra các kết quả đạt được, những mặt còn hạn chế và hướng phát triển tiếp theo của đề tài
Trang 13CHƯƠNG I KIẾN TRÚC TẬP LỆNH MIPS
1.1 G th u
Để có thể điều khiển được máy t nh b ng phần cứng b t buộc ta phải ra lệnh b ng ngôn ngữ của phần cứng Từ dùng để giao tiếp được gọi là lệnh và ngôn ngữ đó được gọi là tập lệnh Trong chương này ta s tìm hiểu tập lệnh thực sự của máy t nh ở cả hai kh a cạnh được viết bởi người lập trình và ở cả khía cạnh được đọc bởi các phần cứng có liên quan của máy t nh
Việc lựa chọn ngôn ngữ s b t đầu với tập lệnh MIPS – tập lệnh được thiết
kế từ những năm 1980 với hơn 100 triệu các dòng vi xử lý phổ biến được sản xuất năm 2002 của các hãng sản xuất chip như: ATI Technologies, roadcom, Cissco, NEC, Nintedo, Silicon Graphics, Sony, Texas Instruments và Toshiba …
Tất cả các máy t nh đều phải thực hiện được ph p toán số học, do đó ngôn ngữ assembly MIPS được ký hiệu như sau:
add a, b, c
Lệnh trên thực hiện thao tác t nh tổng giá trị của hai biến b và c và đặt tổng có được vào biến a Ký hiệu này là yêu cầu b t buộc của m i lệnh số học MIPS: chỉ thực hiện một thao tác và luôn luôn sử dụng đến 3 biến V dụ, giả sử ta muốn t nh tổng của b, c, d, e và đặt tổng của chúng vào biến a thì các lệnh tuần tự phải như sau:
add a, b, c
add a, a, d
add a, a, e
Vì thế ta cần sử dụng đến 3 lệnh ở trên để t nh tổng của 4 biến Các từ bên
ph a phải của dấu được gọi là các chú giải cho người đọc và được máy t nh bỏ qua Chú ý r ng không giống như các ngôn ngữ lập trình khác, m i dòng lệnh chỉ có duy nhất một lệnh và không có ký hiệu kết thúc ở cuối m i dòng lệnh như ngôn ngữ lập trình C/Pascal
Trang 14Ph p toán cộng các số tự nhiên cũng giống như ph p cộng có ba toán hạng: hai
số được cộng với nhau và đặt vào tổng Việc này đòi hỏi m i lệnh cần có ch nh xác 3 toán hạng, không nhiều hơn cũng không t hơn để có thể đơn giản hóa phần cứng
Ví dụ: Cho đoạn chương trình C sau đây chứa năm biến a, b, c, d, e
a = b+c;
d = a-e;
Một lệnh MIPS thực hiện trên hai toán hạng nguồn và đặt kết quả vào toán hạng đ ch Hai lệnh của ngôn ngữ lập trình bậc cao được chuyển sang ngôn ngữ MIPS assembly như sau:
add a, b, c sub d, a, e
Một v dụ khác, phức tạp hơn có tới 5 biến f, g, h, i và j:
f = (g + h) – (i + j);
Trình biên dịch phải tách đoạn chương trình trên thành một số lệnh assembly
vì m i lệnh MIPS chỉ thực hiện một ph p toán Đầu tiên lệnh MIPS thực hiện thao tác cộng hai số g và h Đặt kết quả có được sang một biến tạm, t0:
add t0, g, h 0
Thao tác kế tiếp là ph p trừ nhưng ta cần t nh tổng của i và j trước thì mới thực hiện ph p trừ được Vì thế lệnh tiếp theo là t nh tổng của i và j và kết quả được đặt ở t1
Ph p toán số học Cộng add a,b,c a=b+c Luôn có 3 toán hạng
Trừ sub a,b,c a=b-c Luôn có 3 toán hạng
Trang 151.2 C to n h n MIP
Không giống như chương trình của các ngôn ngữ lập trình bậc cao, các toán hạng của các lệnh số học bị hạn chế trong lệnh MIPS Đó là sự giới hạn của số vùng lưu trữ đặc biệt được thiết kế bởi phần cứng được gọi là các thanh ghi – các viên gạch để xây dựng nên máy t nh Thanh ghi là thành phần nguyên thủy của thiết kế phần cứng và hầu hết người lập trình nhìn thấy khi chương trình hoàn tất K ch thước của thanh ghi trong kiến trúc MIPS là 32 bit Thứ nữa là sự khác biệt cơ bản giữa biến của ngôn ngữ lập trình và thanh ghi ch nh là giới hạn số thanh ghi, số thanh ghi phổ biến của kiến trúc MIPS hiện nay là 32 thanh ghi 32 bit Nguyên do của sự giới hạn 32 thanh ghi có l do nguyên lý thiết kế càng nhỏ thì càng nhanh
Số lượng rất nhiều các thanh ghi có thể làm tăng số chu k xung nhịp, đơn giản vì s cần một t n hiệu đủ dài để truy cập hết số thanh ghi đó Quan điểm nhỏ hơn thì nhanh hơn không hoàn toàn ch nh xác bởi l 31 thanh ghi không h n đã nhanh hơn 32 thanh ghi Sự thật đ ng sau nguyên nhân này có l do những người thiết kế máy t nh làm thế nào để cân b ng được giữa việc tạo ra nhiều thanh ghi với tốc độ xử
lý trong chu k nhanh nhất Một lý do khác của việc không sử dụng thanh ghi có độ dài hơn 32 bit có l xuất phát từ tập lệnh của chúng Ở chương tới ta s đi thiết kế phần cứng để đáp ứng được tập lệnh MIPS, s thấy được vai trò của thanh ghi
Mặc dù chúng ta có thể viết câu lệnh đơn giản chỉ cần sử dụng số thanh ghi
từ 0-31 nhưng câu lệnh của MIPS lại sử dụng dấu để biểu thị thanh ghi Chúng ta
s sử dụng s0, s1 để biểu thị các thanh ghi tương ứng với các biến trong ngôn ngữ lập trình C cũng như Java và các thanh ghi t0, t1 như là các thanh ghi tạm để biên dịch từ chương trình sang câu lệnh MIPS
Cho lại v dụ sau:
f = ( g + h ) - ( i + j );
Các biến f, g, h, i, j tương ứng với các thanh ghi s0, s1, s2, s3, s4 Chương trình được biên dịch cũng giống như trước đây với việc sử dụng thêm hai thanh ghi tạm t0 và t1 để lưu hai giá trị tạm thời của tổng
add $t0, $s1, $s2
Trang 16add $t1, $s3, $s4 sub $s0, $t0,$t1 # - – (i+j)
Ngôn ngữ lập trình có các biến đơn giản được chứa các thành phần dữ liệu đơn giản như trong v dụ trên nhưng cũng có các kiểu biến phức tạp với các kiểu dữ liệu phức tạp như kiểu mảng và kiểu dữ liệu có cấu trúc Sự phức tạp của kiểu dữ liệu có cấu trúc là có thể chứa đựng nhiều kiểu dữ liệu phức tạp hơn nữa và nhiều hơn số thanh ghi có thể lưu trữ Vậy làm thế nào để máy t nh có thể truy cập đến những kiểu dữ liệu có cấu trúc như thế?
Như đã đề cập bộ xử lý chỉ có thể lưu giữ một số lượng t các dữ liệu n m trong các thanh ghi nhưng vùng nhớ máy t nh lại chứa đựng hàng triệu thành phần
dữ liệu khác Cho nên câu trả lời cho câu hỏi ở trên ch nh là sử dụng vùng nhớ để lưu trữ các kiểu dữ liệu phức tạp o các lệnh liên quan đến số học chỉ được thực hiện trên các thanh ghi o đó tập lệnh MIPS phải h trợ lệnh chuyển dữ liệu từ
vùng nhớ đến các thanh ghi được gọi là lệnh chuyển dữ liệu data transfer instruction Để truy cập một từ trong vùng nhớ, lệnh phải được cung cấp địa chỉ
của vùng nhớ Vùng nhớ vừa lớn lại là mảng một chiều chứa các phần tử, với địa chỉ b t đầu là 0 Hình 1.1 mô tả địa chỉ của phần tử thứ 3 là 2 và giá trị của vùng nhớ thứ 2 là 10 Đây là địa chỉ đơn giản của MIPS, hình 1.2 chỉ ra địa chỉ thực sự của vùng nhớ
Trang 17Giả sử một mảng A có 100 phần tử, các biến g và h như trong v dụ trước tương ứng với các thanh ghi s1 và s2 Giả sử r ng địa chỉ cơ sở của A được lưu bởi thanh ghi s3 Cho câu lệnh trong C như sau:
g = h + A[8];
Mặc dù chỉ có một ph p gán duy nhất nhưng lại là lệnh có liên quan đến thao tác với vùng nhớ o vậy nhiệm vụ đầu tiên là phải chuyển dữ liệu của ô nhớ A 8 đến thanh ghi Địa chỉ của mảng thành phần này ch nh là tổng địa chỉ cơ sở của mảng A được lưu trữ tại s3 với thành phần 8 được chọn Kết quả được đặt tại thanh ghi tạm cho câu lệnh kế tiếp ựa vào hình 1.1 câu lệnh được viết như sau:
biến với thanh ghi, trình biên dịch cần phải định r kiểu cấu trúc dữ liệu như mảng
và kiểu dữ liệu có cấu trúc với vùng nhớ để trình biên dịch sau đó có thể đặt địa chỉ tương ứng đến lệnh chuyển dữ liệu Vì các byte 8 bit rất hữu dụng trong nhiều chương trình nên đa số kiểu kiến trúc địa chỉ đơn giản là byte Hình 1.2 chỉ ra địa chỉ thực cho địa chỉ MIPS ở hình 1.1; byte truy cập thứ 3 là 8 Trong kiến trúc MIPS, các từ có địa chỉ là bội số của 4 Để lấy được byte địa chỉ cho v dụ trên thì địa chỉ đoạn được cộng với địa chỉ cơ sở s3 phải là 4x8 =32 s có được thành phần tương ứng A 8 chứ không phải là A 8 4
Để bổ sung cho lệnh load là lệnh store; copy dữ liệu từ thanh ghi sang vùng
nhớ Khuôn dạng của lệnh store tương tự như lệnh load: tên của ph p toán, kế tiếp
là thanh ghi được lưu trữ, cuối cùng là địa chỉ đoạn thành phần của mảng được lựa
chọn và cuối cùng là thanh ghi cơ sở Lệnh MIPS của store là sw (store word)
V dụ: giả sử biến h được lưu trong thanh ghi s2 và địa chỉ cơ sở của A được lưu trong s3 Cho câu lệnh được viết trong C như sau:
Trang 18Câu lệnh cuối là lưu tổng t nh được ở trên vào phần tử A 12 , địa chỉ đoạn là
48 được cộng vào địa chỉ cơ sở s3
sw $t0, 48($s3)
Nhiều lúc trong một chương trình s sử dụng đến ph p toán đối với h ng số,
v dụ như việc tăng giá trị của con trỏ để chỉ đến phần tử kế tiếp của mảng Trên thực tế có hơn một nửa số ph p toán số học của SPIM sử dụng đến ph p toán này Với việc sử dụng các lệnh đã được biết từ đầu đến giờ chúng ta phải đọc dữ liệu từ vùng nhớ m i khi sử dụng tới chúng V dụ để cộng một giá trị của h ng số 4 vào thanh ghi s3 ta phải thực hiện như sau:
lw $t0, AddConstant4($s1) add $s3, $s3, $t0 # $s3 = $s3+$t0 ($t0 = 4) Trong đó, AddConstant4 ch nh là vùng nhớ của số 4
Để thay thế cho lệnh load dữ liệu từ vùng nhớ vào thanh ghi như trên, MIPS
h trợ lệnh số học thao tác đối với h ng số add immediate hay addi)
Trang 19o vậy để cộng 4 với giá trị thanh ghi s3 ta chỉ cần thực hiện như sau:
Memory[4294967292]
Truy cập dữ liệu chỉ b ng lệnh chuyển dữ liệu MIPS sử dụng byte địa chỉ để truy cập đến vùng nhớ là bội số của 4
Bảng 1.3 Ngôn ngữ MIPS assembly
Số học
add add $s1, $s2, $s3 $s1 = $s2 + $s3 subtract subb $s1, $s2, $s3 $s1 = $s2 - $s3 add immediate addi $s1, $s2, 100 $s1 = $s2 + 100
Chuyển dữ liệu load word lw $s1, 100($s2) $s1 = Memory[$s2 + 100]
store word sw $s1, 100($s2) Memory[$s2 + 100] = $s1
Trang 20phân này: cao hoặc thấp high/low , mở hoặc t t on/off , đúng hoặc sai true/false ,
1 hoặc 0
Vì hầu hết các lệnh đều có liên quan đến thanh ghi do đó chúng ta cần phải biết tên thanh ghi tương ứng với số thanh ghi Trong lệnh MIPS assembly thì các thanh ghi $s0- s7 tương ứng với thanh ghi thứ 16 đến thanh ghi thứ 23 và thanh ghi t0 - t7 tương ứng với thanh ghi thứ 8 đến thanh ghi thứ 15
V dụ: cho lệnh MIPS sau đây, hãy chỉ ra ý nghĩa thực sự của lệnh này
add $t0, $s1, $s2
M i một đoạn của lệnh trên được gọi là một trường field Trường đầu tiên
và cuối cùng 0 và 32 nói cho máy t nh hiểu r ng đây là lệnh cộng hai số Trường thứ hai và thứ ba cho biết đây là toán hạng đầu tiên và thứ hai của ph p cộng 17 = s1; 18 = s2 Trường thứ tư s nhận giá trị của tổng vừa t nh được 8 = t0 Trường thứ năm không dùng trong trường hợp này s được đặt b ng 0 Vì thế đây là lệnh cộng hai thanh ghi s1 và s2, kết quả được lưu ở thanh ghi t0
Bảng 1.4 ảng chuyển đổi hệ 16-2
0hex 0000two 4hex 0100two 8hex 1000two Chex 1100two
1hex 0001 two 5hex 0101 two 9hex 1001 two Dhex 1101 two
2hex 0010 two 6hex 0110 two Ahex 1010 two Ehex 1110 two
3hex 0011 two 7hex 0111 two Bhex 1011 two Fhex 1111 two
Chỉ cần thay thế số hệ 16 b ng 4 bit tương ứng Nếu số bit nhị phân vượt quá
4 thì tiến hành lấy theo thứ tự từ phải sang trái
4 C trƣ n MIP
Trang 21nghĩa các trường của lệnh MIPS của lệnh thuộc khuôn dạng R như sau:
op: Ph p toán cơ bản của lệnh, được gọi là opcode
rs: Thanh ghi toán hạng nguồn thứ nhất
rt: Thanh ghi toán hạng nguồn thứ hai
rd: Thanh ghi toán hạng đ ch, lưu giữ kết quả của ph p toán
shamt: Shift aumount được giải th ch ở lệnh dịch bit sau
funct: Function, trường nà dùng để lựa chọn các ph p toán cụ thể của trường
op và được gọi là function code
Vấn đề nảy sinh khi một lệnh cần một trường dài hơn khuôn dạng ở trên, v
dụ lệnh đọc một từ ở ô nhớ cần phải chỉ ra hai thanh ghi và một h ng số Nếu trường địa chỉ được sử dụng 5 bit như ở trên thì h ng số được sử dụng để đọc địa chỉ từ ô nhớ chỉ giới hạn ở 25 = 32 H ng số này được sử dụng để truy cập đến phần
tử bất k ở trong mảng hay ở dữ liệu có cấu trúc và thường cần đến giá trị lớn hơn
32 Trường lệnh 5 bit trong trường hợp này là không đủ Vì thế xung đột sảy ra giữa
ý muốn các lệnh có cùng độ dài và có cùng khuôn dạng
V dụ, lệnh có khuôn dạng R-type Register hay còn được gọi là R-format Lệnh có khuôn dạng I-type Immediate hay còn được gọi là I-format được sử dụng
cho các lệnh tức thì và lệnh dùng để chuyển dữ liệu Khuôn dạng của lệnh I-format như sau:
Trường địa chỉ 16 bit s cho ph p một lệnh đọc từ nhớ bất k trong miền từ
215 hay 32.768 byte của địa chỉ trong thanh ghi cơ sở rs Tương tự như thế lệnh
addi cũng bị giới hạn h ng số không lớn hơn 215 R ràng chúng ta thấy r ng nếu một lệnh MIPS có độ dài hơn 32 bit s khó quản lý các trường khác hơn nữa Xem
x t lại v dụ sau:
lw $t0, 32($s3)
Ở đây 19 được hiểu cho s3 được đặt vào trường rs; 8 được hiểu cho t0 và đặt vào trường rt; giá trị 32 được đặt vào trường địa chỉ Nhận thấy r ng trường rt
Trang 22bây giờ đã thay đổi vai trò trở thanh toán hạng đ ch nhận lấy kết quả của lệnh đọc ô nhớ Mặc dù nhiều định dạng cho các lệnh s gây khó khăn cho thiết kế phần cứng Tuy nhiên ta chỉ quan tâm đến các phần giống nhau thì có thể giảm thiểu đi sự phức tạp Để ý r ng, ba trường đầu tiên của cả hai khuôn dạng lệnh R-format và I-format đều có tên giống nhau và có cùng k ch cỡ Trường cuối cùng của I-format có độ dài
b ng 3 trường cuối của R-format
M i lệnh được phân biệt bởi giá trị của trường đầu tiên op để phần cứng nhận ra đây là lệnh thuộc R-type hay I-type
Bảng 1.5 Mã hóa lệnh MIPS
add immediate I 810 reg reg n.a n.a n.a constant lw(load word) I 3510 reg reg n.a n.a n.a address sw(store word) I 4310 reg reg n.a n.a n.a address
Trong bảng trên reg được hiểu là thanh ghi 0 đến thanh ghi 31; address
là 16 bit địa chỉ; n.a = not acceptable có nghĩa là không chấp nhận ở dạng lệnh tương ứng; để ý r ng lệnh add và lệnh sub có cùng giá trị ở trường op; thành
phần của phần cứng s căn cứ vào trường funct để quyết định xem đó là lệnh add
sw $t0, 1200($t1) # A[300] = h+A[300]
Lệnh MIPS trên được chuyển sang mã máy như sau:
Trang 23Kế đến, lệnh add được gán giá trị là 0 ở trường op và giá trị ở trường funct là 32; ba thanh ghi toán hạng 18, 8 và 8 được gán cho các trường thứ hai, ba và bốn tương ứng với ba thanh ghi s2, t0 và t0
Cuối cùng, lệnh sw gán giá trị 43 ở trường op, phần còn lại tương tự như lệnh load
Nhóm lệnh đầu tiên có tên là shift; có tác dụng dịch chuyển các bit trong một
từ sang trái hoặc sang phải và điền các bit còn trống sau khi dịch chuyển bởi các bit
0 V dụ, nếu thanh ghi s0 chứa chu i bit:
Trang 24Giả sử, ta có lệnh MIPS như sau:
sll $t2, $s0, 4 # thanh ghi $t2 = thanh ghi $s0 << 4 bit
Ngôn ngữ máy của lệnh MIPS trên được miêu tả như sau:
Lệnh sll được mã hóa giá trị 0 cho cả hai trường op và funct; rt chứa s0; rd chứa t2; shamt chứa giá trị 4 dịch trái 4 bit ; rs không dùng trong trường hợp này nên gán giá trị là 0
Ph p toán dịch trái số học logic có một điểm thuận tiện là, nếu ta dịch trái i bit s cho ta kết quả b ng ph p toán nhân cho 2i
Lấy v dụ kết quả ở trên s2 = 9 và tiến hành dịch trái 4 bit s được: 9x24
= 9x16 = 144
Một ph p toán khác cũng được liệt kê trong lệnh MIPS là ph p toán AN
AN là ph p toán bit-by-bit mà kết quả của nó s là 1 nếu bit ở hai toán hạng cùng
có giá trị là 1 V dụ: t2 có giá trị như sau:
(0000 0000 0000 0000 0000 1101 0000 0000)2
Thanh ghi t1 có giá trị là:
(0000 0000 0000 0000 0011 1100 0000 0000)2
Cho lệnh MIPS như sau:
and $t0, $t1, $t2 # thanh ghi $t0 = $t1 & $t2
Giá trị của thanh ghi t0 là:
Trang 25nhà thiết kế phần cứng tập lệnh MIPS đã sử dụng lệnh NOR NOT OR thay vì sử dụng NOT Nếu một toán hạng là zero thì ph p toán tương đương NOT
V dụ: A NOR 0 = NOT (A OR 0) = NOT (A)
Nếu thanh ghi t1 có giá trị không đổi và thanh ghi t3 có giá trị là 0 thì lệnh MIPS:
nor $t0, $t1, $t3 # thanh ghi $t0 = ~($t1 | $t3)
Kết quả của thanh ghi t0 là:
(1111 1111 1111 1111 1100 0010 1111 1111)2
1 nh h tr r qu t ịnh
Điều làm cho một máy t nh đơn giản trở nên nổi bật đó ch nh là khả năng ra quyết định ựa trên dữ liệu đầu vào và giá trị được tạo ra trong quá trình t nh toán dẫn đến những hành động thực thi câu lệnh khác nhau Câu lệnh ra quyết định phổ
biến trong các ngôn ngữ lập trình là câu lệnh if, thỉnh thoảng kết hợp với lệnh goto
và nhảy đến nhãn Câu lệnh MIPS assembly bao gồm hai kiểu câu lệnh ra quyết
định tương tự như lệnh if và goto Câu lệnh đầu tiên là:
beq register1, register2, L1
Câu lệnh này có ý nghĩa: nhảy đến nhãn L1 nếu giá trị ở thanh ghi 1 register1 b ng
với giá trị ở thanh ghi 2 register2 Lệnh beq được hiểu là: branch if equal
Lệnh thứ hai là:
bne register1, register2, L1
Câu lệnh này có ý nghĩa: nhảy đến nhãn L1 nếu giá trị của register1 khác với
giá trị của register2 Câu lệnh bne được hiểu là: branch if not equal Cả hai câu lệnh trên được gọi là câu lệnh điều kiện r nhánh
V dụ: cho đoạn code sau với f, g, h, i, j là các biến Nếu năm biến từ f đến j tương ứng với các thanh ghi s0 - s4 Câu lệnh MIPS tương ứng cho câu lệnh:
if (i=j) f=g+h; else f=g+h;
Nửa bên trái tương ứng lệnh phần then của lệnh if và nửa bên phải tương ứng với phần else Đầu tiên biểu thức so sánh b ng được thực hiện, tương ứng với lệnh beq sau đó s thực hiện các trường hợp ph a sau Tuy nhiên đoạn code s trở nên
Trang 26hiệu quả hơn nếu như ta thực hiện trường hợp ngược lại thức tức là kiểm tra dẫn đến điều kiện else trước tương ứng với lệnh bne
j Exit
Ph p gán trong trường hợp điều kiện else của lệnh if có thể thực hiện b ng một câu lệnh như bên dưới Tuy nhiên ta cần nối nhãn Else với lệnh này Chúng ta đưa nhãn Exit ra sau lệnh này
Else: sub $s0, $s1, $s2 – Exit:
Trang 27Giả sử i và k tương ứng với hai thanh ghi s3 và s5, địa chỉ cơ sở của mảng save được lưu ở s6 Câu lệnh MIPS tương ứng:
ước đầu tiên, load save i vào thanh ghi tạm Trước khi làm việc này, chúng ta cần biết địa chỉ của mảng save Tuy nhiên, trước khi cộng i vào địa chỉ cơ
sở của save, chúng ta cần nhân địa chỉ index của i cho 4 để tương ứng với byte địa chỉ Thực tế, ta chỉ cân dịch trái logic 2 bit là được Chúng ta cũng cần phải có nhãn Loop để có thể quay về trước lệnh kết thúc:
Để kiểm tra điều kiện b ng và không b ng là câu lệnh phổ biến nhất của loại câu lệnh kiểm tra, tuy nhiên thỉnh thoảng ta s b t gặp sự cần thiết của việc so sánh hai biến với nhau Ở tập lệnh MIPS cung cấp một lệnh so sánh giá trị giữa hai thanh ghi và đặt giá trị của thanh ghi thứ ba là 1 nếu giá trị ở thanh ghi thứ nhất nhỏ hơn
giá trị thanh ghi thứ hai, ngược lại thì đặt b ng 0 Lệnh MIPS được gọi là set on less than hoặc slt
slt $t0, $s3, $s4
Trang 28Nghĩa là, thanh ghi t0 được đặt lên 1 nếu giá trị ở thanh ghi s3 nhở hơn giá trị ở thanh ghi s4, ngược lại t0 được đặt b ng 0
Ph p toán so sánh với h ng số là phổ biến trong câu lệnh so sánh Vì thanh ghi zero luôn luôn b ng 0 nên ta có ph p so sánh với số 0 Còn nếu muốn so sánh
với số khác thì ta có lệnh set on less than immediate (slti) V dụ để kiểm tra giá trị
ở thanh ghi s2 có nhỏ hơn 10 hay không, ta sử dụng lệnh như sau:
nhảy đến địa chỉ tương ứng ảng địa chỉ nhảy ch nh là mảng một chiều mà m i phần tử tương ứng với nhãn nhảy trong chương trình Để h trợ cho thao tác nhảy
đến địa chỉ cần nhảy, MIPS cũng bao gồm lệnh jump register jr , nghĩa là nhảy
không điều kiện đến địa chỉ được ra ở thanh ghi Chương trình s đọc nội dung tương ứng từ bảng nhảy vào thanh ghi và sau đó nhảy đến địa chỉ tướng ứng sử dụng lệnh nhảy thanh ghi
Bảng 1.7 Tổng hợp kiến trúc của tập lệnh MIPS
Memory[4294967292]
Truy cập dữ liệu chỉ b ng lệnh chuyển
dữ liệu MIPS sử dụng byte địa chỉ để truy cập các byte địa chỉ của vùng nhớ
là bội số của 4
Trang 29Ngôn ngữ MIPS assembly
Số học
add add $s1, $s2, $s3 $s1 = $s2 + $s3 subtract subb $s1, $s2, $s3 $s1 = $s2 - $s3 add immediate addi $s1, $s2, 100 $s1 = $s2 + 100 Chuyển
or immediate or $s1, $s2, 100 $s1 = $s2 | 100 shift left logical sll $s1, $s2, 10 $s1 = $s2 << 10 shift right logical srl $s1, $s2, 10 $s1 = $s2 >> 10
Trang 30thủ tục và phần còn lại của chương trình và dữ liệu, cho ph p bỏ qua các giá trị và trả về kết quả
Để thực thi một thủ tục, chương trình phải thực hiện 6 bước sau:
1 Đặt các đối số vào những nơi mà thủ tục có thể truy cập được
2 Chuyển quyền kiểm soát cho thủ tục
3 Đòi hỏi các tài nguyên vùng nhớ cần thiết cho thủ tục
4 Thực hiện tác vụ mong muốn
5 Đặt giá trị của kết quả vào vùng mà chương trình có thể gọi và truy cập được
6 Trả quyền điều khiển về nơi b t đầu, vì một thủ tục có thể được gọi vài lần trong suốt chương trình
Như đã đề cập trước đó, thanh ghi ch nh là nới lưu trữ dữ liệu nhanh nhất trong máy t nh Vì thế, chúng ta muốn sử dụng chúng nhiều nhất đến mức có thể Lệnh MIPS h trợ nhiều thanh ghi 32 bit mà thủ tục có thể được gọi:
a0 - a3: 4 thanh ghi dùng để truyển tham số
v0 - v1: 2 thanh ghi lưu trữ giá trị trở về
ra: 1 thanh ghi địa chỉ trở về để trở về thời điểm trước khi gọi thủ tục
Để cấp phát các thanh ghi này, ngôn ngữ MIPS assembly bao gồm một lệnh cho các thủ tục này: nhảy đến địa chỉ và đồng thời lưu trữ địa chỉ của lệnh kế tiếp
vào thanh ghi ra – lệnh jump – and – link (jal)
jal procedureAddress
Tên của link có nghĩa là một địa chỉ trỏ đến trạm gọi cho ph p thủ tục trả về địa chỉ Link này được lưu trữ ở thanh ghi ra và được gọi là địa chỉ trở về Địa chỉ trở về là cần thiết bởi vì cùng một thủ tục có thể được gọi nhiều lần trong cùng một chương trình Cũng cần hiểu một chương trình lưu trữ phải có một thanh ghi lưu giữ địa chỉ của lệnh hiện tại đang được thực thi Vì lý do lịch sử, thanh ghi này luôn được gọi là thanh đếm chương trình, viết t t là PC mặc dù cũng có nhiều tên gọi
khác nhau như thanh ghi địa chỉ lệnh Lệnh jal s lưu kết quả PC 4 trong thanh ghi
ra liên kết với lệnh kế tiếp để thiết lập địa chỉ trở về
Trang 31Để h trợ cho tình huống này, máy t nh giống lệnh MIPS sử dụng một lệnh nhảy thanh ghi jr , nghĩa là nhảy không điều kiện đến địa chỉ phân biệt trong thanh
ghi jr $ra
Lệnh nhảy thanh ghi s nhảy đến địa chỉ được lưu trữ trong thanh ghi $ra Vì thế khi gọi chương trình các đối số được đặt trong các thanh ghi $a0 - $a3 và sử dụng lệnh jal X để nhảy đến thủ tục X Sau khi thực thi xong đoạn thủ tục, giá trị trở
về được lưu trữ ở thanh ghi $v0 - $v1 và trả quyền kiểm soát cho chương trình gọi
sử dụng lệnh jr $ra
Giả sử một trình biên dịch cần sử dụng nhiều hơn 4 thanh ghi để truyền các đối số trong một thủ tục và nhiều hơn 2 giá trị trở về, do đó chúng ta cần nghĩ ngay đến vùng nhớ tưởng của cấu trúc dữ liệu làm tràn thanh ghi là stack – một hàng
đợi vào sau ra trước last in first out Một stack cần đến một con trỏ để cấp phát
hầu hết các địa chỉ trong stack, chỉ ra đâu là nơi các thanh ghi của thủ tục được đặt, đâu là nơi thanh ghi bị tràn, giá trị của thanh ghi cũ được tìm thấy ở đâu Con trỏ
ngăn xếp stack pointer tham chiếu một từ cho m i thanh ghi có thể được lưu trữ
và phục hồi Để đưa dữ liệu vào stack người ta gọi là push và để lấy dữ liệu ra khỏi stack người ta gọi là pop Ngôn ngữ MIPS cấp phát tiếp các thanh ghi có liên quan đến stack: stack pointer ($sp) dùng để lưu trữ các thanh ghi cần thiết cho các giá trị
của thủ tục đang được thi hành Theo lịch sử, stack tăng dần theo thứ tự địa chỉ từ cao đến thấp Điều này có nghĩa là khi đưa giá trị vào stack b ng cách trừ đi giá trị của stack pointer Ngược lại, khi cộng thêm giá trị vào stack pointer s là thao tác lấy phần tử ra khỏi stack
V dụ, cho đoạn chương trình C như sau:
int leaf_example (int g, int h, int i, int j)
Trang 32Câu lệnh MIPS cho đoạn code trên như sau:
Đầu tiên, biến tham số g, h, i và j tương ứng với các thanh ghi đối số a0 -
a3 f tương ứng với s0 Trình biên dịch b t đầu với nhãn leaf của thủ tục
leaf_example:
ước kế tiếp là lưu lại thanh ghi được dùng bởi thủ tục, ph p gán trong đoạn chương trình trên buộc chúng ta sử dụng đến 2 thanh ghi tạm o đó, ta cần sử dụng đến 3 thanh ghi cho đoạn thân của thủ tục trên: t0 g h , t1 i j và s0 f Chúng
ta phải đưa giá trị cũ vào stack b ng cách tạo ra không gan vùng nhớ cho 3 từ trên stack và lưu trữ các giá trị đó
add $t0, $a0, $a1 # $t0 = g+h
add $t1, $a2, $a3 # $t1 = i + j
subb $s0, $t0, $t1 # f = $t0 - $t1, hay f = (g+h)- (i+j)
Để trả về giá trị của f, chúng ta copy giá trị kết quả vào thanh ghi lưu giá trị trở về
Trang 33add $v0, $s0, $zero
Trước khi quay trở về chúng ta cần khôi phục lại 3 giá trị cũ của thanh ghi
mà chúng ta đã lưu trước đó b ng cách pop ra khỏi stack
t0 - t9: 10 thanh ghi tạm không được bảo tồn bởi thủ tục được gọi
s0 - s7: 8 thanh ghi lưu trữ phải được bảo tồn trong lời gọi thủ tục
Một quy t c tuy đơn giản nhưng giúp hạn chế tối đa việc tràn các thanh ghi Trong v dụ trên vì t0 và t1 không cần phải bảo tồn sau khi kết thúc thủ tục nên chúng ta có thể vứt bỏ 2 đi 2 lệnh lưu và đọc trong đoạn code trên Chúng ta chỉ giữ lại s0 với giả sử chương trình gọi cần sử dụng đến giá trị này
Các thủ tục không gọi đến các thủ tục khác thì được gọi là leaf procedure
như trên, tuy nhiên thực tế không có nhiều thủ tục giống như thế Các thủ tục đệ quy thậm ch còn gọi đến chỉnh bản thân thủ tục đó nhiều lần nữa nên vấn đề sử dụng thanh ghi trong các thủ tục cần hết sức c n thận V dụ, giả sử r ng chương trình
ch nh gọi đến các thủ tục A với đối số là 3 b ng cách đặt giá trị h ng số 3 vào thanh ghi a0 và sau đó sử dụng lệnh jal A Giả sử tiếp theo thủ tục A gọi đến thủ tục thông qua lệnh jal với một đối số có giá trị là 7 được đặt vào thanh ghi a0 Vì thế
A không bao giờ kết thúc tác vụ này, có một sự xung đột sảy ra khi sử dụng thanh ghi a0 Tương tự như vậy cũng sảy ra sự xung đột với thanh ghi địa chỉ trở về ra bởi vì địa chỉ trở về đã được tra cho thủ tục
Trang 34Một giải pháp được đưa ra là đặt tất cả các thanh ghi khác phải được bảo toàn vào trong stack như chúng ta làm với các thanh ghi lưu trữ Chương trình gọi thủ tục đặt các thanh ghi đối số a0 - a3 hoặc các thanh ghi tạm t0 - t9 vào stack sau lời gọi Thanh ghi địa chỉ trở về ra và các thanh ghi lưu trữ s0 - s7 được sử dụng trong thủ tục được gọi cũng được đảy vào trong stack Con trỏ stack stack pointer đêm số thanh ghi được lưu trữ trong stack
V dụ cho đoạn chương trình sau:
int fact (int n)
{ if (n>1) return(1);
else return (n*fact(n-1)); }
Đoạn chương trình trên được biên dịch sang câu lệnh MIPS như sau:
Ta có, biến tham số n tương ứng với thanh ghi tham số a0 Trình biên dịch
b t đầu với nhãn của thủ tục và sau đó lưu hai thanh ghi này vào trong stack: địa chỉ trở về và a0
slti $t0, $a0,1 beq $t0, $zero, L1 Nếu n < 1, fact s trả về giá trị là 1 b ng cách đặt 1 vào thanh ghi giá trị: nó
s cộng giá trị 1 cho 0 và lưu vào thanh ghi tổng v0 Sau đó lấy 2 giá trị đã lưu trữ
ra khỏi stack và nhảy đến địa chỉ trở về:
addi $v0, $zero, 1 # return 1 addi $sp, $sp, 8
Trang 35jr $ra Trước khi lấy 2 giá trị ra khỏi stack, chúng ta phải load các item này ra khỏi
stack, chúng ta chỉ load a0 và ra Vì a0 và ra không đổi khi n <1 nên chúng ta
bỏ qua Nếu n không nhỏ hơn 1, đối số n được giảm xuống và sau đó fact được gọi trở lại với đối số giảm đi đó
L1: addi $a0, $a0, -1 -1
Thanh ghi lưu trữ: s0 - $s7 Thanh ghi tạm: t0 - $t9
Thanh ghi con trỏ stack: sp Thanh ghi đối số: a0 - $a3
Thanh ghi địa chỉ trở về: ra Thanh ghi giá trị trả về: v0 - $v1
Con trỏ đỉnh của stack Con trỏ đáy của stack
Bảng 1.9 Quy ước thanh ghi MIPS
$v0 - $v1 2-3 Giá trị cho kết quả biểu thức Không
Trang 36$a0 - $a3 4-7 Tham số Không
Trang 37or immediate or $s1, $s2, 100 $s1 = $s2 | 100 shift left logical sll $s1, $s2, 10 $s1 = $s2 << 10 shift right logical srl $s1, $s2, 10 $s1 = $s2 >> 10
Điều kiện
r nhánh
branch on equal beq $s1, $s2, L if ($s1 == $s2) goto L branch on not equal bne $s1, $s2, L if ($s1 != $s2) goto L set on less than
Nhảy không
điều kiện
Trang 38j J 2 2500 j 10000
Field size 6bit 5bit 5bit 5bit 5bit 6bit Tất cả lệnh 32bit
R-format R op rs rt rd shamt funct Lệnh số học
I-format I op rs rt address Chuyển dữ liệu và r
nhánh
1.8 Liên k t v i th gi i
Máy t nh ban đầu được sử dụng với mục đ ch xử lý các ph p toán nhưng ngay khi được thương mại hóa chúng được sử dụng rộng rãi cho mục đ ch xử lý văn bản Hầu hết các máy t nh ngày nay đều sử dụng byte 8 bit để mã hóa ký tự ASCII Một tập các lệnh có thể tr ch một byte từ một word để load và store một word là một cách làm hiệu quả để chuyển một byte thành một word như một số chương trình vẫn làm MIPS h trợ lệnh load byte lb để đọc một byte từ vùng nhớ
b ng cách đặt vào 8 bit phải cùng của thanh ghi Lệnh store byte sb để đọc một byte 8 bit phải nhất của thanh ghi và viết chúng vào vùng nhớ Vì thế chúng ta copy một byte theo trình tự sau:
lb $t0, 0($sp)
sb $t0, 0($sp)
Các ký tự liên kết với nhau tạo thành một chu i – số ký tự, ta có 3 cách lựa chọn để biểu di n một chu i: 1 vị tr đầu tiên của chu i được dành để cho biết chiều dài của chu i, 2 một biến đi cùng để biết chiều dài của chu i, 3 vị tr cuối cùng của chu i s có một ký tự đi k m để báo kết thúc chu i Ngôn ngữ lập trình C
sử dụng cách thứ 3 với việc sử dụng giá trị 0 null để báo kết thúc chu i V dụ cho chu i Cal trong C được biểu di n: 67, 97, 108, 0
Trang 39
Để ý r ng các ký tự hoa và thường cách nhau bởi 32 vị tr và cách này giúp
chúng ta cách chuyển từ ký tự hoa – thường và ngược lại Có một số giá trị không được thể hiện trong bảng mã ASCII này như 8- backspace, 9- tab character, 13- return, 0- null sử dụng trong C,…
Ngược lại với C, trong Java các ký tư và chu i sử dụng bảng mã Unicode Universal Encoding để mã hóa hầu hết các ký tự của các quốc gia trên thế giới Mặc định Java sử dụng 16 bit để mã hóa mã Unicode này MIPS h trợ tập lệnh để thực hiện đọc 16 bit từ word, gọi là halfword lh dùng để đọc một nửa từ ở vùng nhớ và lưu vào 16 bit phải nhất của thanh ghi Lệnh store half sh dùng để đọc nửa
từ phải nhất của thanh ghi và lưu vào vùng nhớ Chúng ta copy nửa từ theo các câu lệnh sau:
lh $t0, 0($sp)
sh $t0, 0($sp)
Unicode version 4 có 160 khối thể hiện tên của các bộ ký tự V dụ, mã Greek b t đầu ở 0370hex, Cryllic b t đầu ở 0400hex, 3 cột đầu tiên chỉ ra 48 block thể hiện ngôn ngữ và số học của con người, cột cuối cùng sử dụng cho các ký hiệu Mặc định bộ mã hóa ký tự 16 bit được gọi là UTF-16 UTF-8 thể hiện các ký tự trong bảng mã ASCII, UTF-32 dùng 32 bit cho việc mã hóa một ký tự Tìm hiểu thêm ở www.unicode.org