Giáo trình Lập trình hợp ngữ Chương 1. KIẾN THỨC CƠ SỞ CHO LẬP TRÌNH HỢP NGỮ...................................3 1.1. Tổ chức và thực thi trong máy tính .........................................................................3 1.1.1. Chức năng và các mức kiến trúc của hệ thống máy tính .................................4 1.1.2. Kiến trúc mức hệ thống....................................................................................8 1.1.3. Quá trình thực thi chương trình .....................................................................12 1.1.4. Kiến trúc mức vi xử lý ...................................................................................13 1.1.5. Quá trình thực hiện lệnh trong vi xử lý..........................................................15 1.1.6. Kiến trúc tập lệnh và tập lệnh máy ................................................................18 1.1.7. Tổ chức và truy xuất bộ nhớ ..........................................................................21 1.2. Ngôn ngữ máy, hợp ngữ và ngôn ngữ bậc cao .....................................................22 1.3. Phương pháp và quy trình xây dựng chương trình hợp ngữ.................................26 1.4. Chương trình dịch và trình hợp dịch.....................................................................28 1.5. Môi trường và công cụ phát triển .........................................................................29 1.5.1. Môi trường Linux...........................................................................................30 1.5.2. Môi trường Windows.....................................................................................31 1.6. Tổng kết chương....................................................................................................33 Câu hỏi và bài tập ............................................................................................................34 Chương 2. KIẾN TRÚC VI XỬ LÝ ARM ......................................................................35 2.1. Kiến trúc và các chế độ xử lý ................................................................................35 2.1.1. Kiến trúc vi điều khiển lõi ARM ...................................................................35 ii 2.1.2. Kiến trúc vi xử lý ARM.................................................................................37 2.1.3. Các chế độ hoạt động của vi xử lý lõi ARM..................................................40 2.1.4. Mô hình bộ nhớ..............................................................................................42 2.1.5. Dải bit.............................................................................................................49 2.1.6. Cơ chế giao tiếp ngoại vi ...............................................................................52
Trang 2MỤC LỤC
MỤC LỤC i
THUẬT NGỮ VÀ TỪ VIẾT TẮT v
BẢNG CÁC KÝ HIỆU vii
DANH MỤC BẢNG viii
DANH MỤC HÌNH xi
MỞ ĐẦU 1
Chương 1 KIẾN THỨC CƠ SỞ CHO LẬP TRÌNH HỢP NGỮ 3
1.1 Tổ chức và thực thi trong máy tính 3
1.1.1 Chức năng và các mức kiến trúc của hệ thống máy tính 4
1.1.2 Kiến trúc mức hệ thống 8
1.1.3 Quá trình thực thi chương trình 12
1.1.4 Kiến trúc mức vi xử lý 13
1.1.5 Quá trình thực hiện lệnh trong vi xử lý 15
1.1.6 Kiến trúc tập lệnh và tập lệnh máy 18
1.1.7 Tổ chức và truy xuất bộ nhớ 21
1.2 Ngôn ngữ máy, hợp ngữ và ngôn ngữ bậc cao 22
1.3 Phương pháp và quy trình xây dựng chương trình hợp ngữ 26
1.4 Chương trình dịch và trình hợp dịch 28
1.5 Môi trường và công cụ phát triển 29
1.5.1 Môi trường Linux 30
1.5.2 Môi trường Windows 31
1.6 Tổng kết chương 33
Câu hỏi và bài tập 34
Chương 2 KIẾN TRÚC VI XỬ LÝ ARM 35
2.1 Kiến trúc và các chế độ xử lý 35
2.1.1 Kiến trúc vi điều khiển lõi ARM 35
Trang 32.1.2 Kiến trúc vi xử lý ARM 37
2.1.3 Các chế độ hoạt động của vi xử lý lõi ARM 40
2.1.4 Mô hình bộ nhớ 42
2.1.5 Dải bit 49
2.1.6 Cơ chế giao tiếp ngoại vi 52
2.2 Tập thanh ghi 53
2.2.1 Con trỏ ngăn xếp 54
2.2.2 Thanh ghi liên kết 55
2.2.3 Con trỏ chương trình 56
2.2.4 Các thanh ghi đặc biệt 56
2.3 Các cờ 58
2.4 Các ngoại lệ 59
2.5 Khối điều khiển 61
2.6 Tổng kết chương 62
Câu hỏi và bài tập 62
Chương 3 TẬP LỆNH ARM 63
3.1 Kiến trúc tập lệnh ARM 63
3.2 Mã hóa tập lệnh và các tập lệnh 65
3.2.1 Mã hóa tập lệnh 65
3.2.2 Các tập lệnh 72
3.3 Hợp ngữ thống nhất 74
3.4 Nhóm lệnh truyền dữ liệu giữa các thành phần bên trong vi xử lý 76
3.5 Nhóm lệnh truy cập bộ nhớ 81
3.5.1 Các lệnh cơ bản 81
3.5.2 Các chế độ địa chỉ 81
3.5.3 Di chuyển dữ liệu đa thanh ghi 86
3.5.4 Di chuyển dữ liệu với ngăn xếp 89
3.6 Nhóm lệnh xử lý dữ liệu 92
3.6.1 Các lệnh số học 92
3.6.2 Các lệnh lôgic 94
3.6.3 Các lệnh dịch và quay 95
3.6.4 Các lệnh chuyển kiểu dữ liệu 96
3.6.5 Các lệnh xử lý trường bit 97
3.7 Nhóm lệnh điều khiển 98
3.7.1 Các lệnh so sánh 98
3.7.2 Lệnh rẽ nhánh 99
3.8 Nhóm lệnh hệ thống 109
Trang 43.8.1 Ngắt mềm 109
3.8.2 Lệnh cờ hiệu 109
3.8.3 Thao tác với bộ đồng xử lý 110
3.9 Tổng kết chương 111
Câu hỏi và bài tập 111
Chương 4 LẬP TRÌNH HỢP NGỮ ARM CƠ BẢN 112
4.1 Cấu trúc chương trình 112
4.1.1 Đoạn mã lệnh 114
4.1.2 Đoạn dữ liệu 119
4.2 Thao tác chuyển dữ liệu 120
4.2.1 Chuyển dữ liệu 16 bit hoặc nhỏ hơn 122
4.2.2 Chuyển dữ liệu 32 bit 125
4.2.3 Chuyển dữ liệu trong đoạn 16 – 32 bit 127
4.2.4 Chuyển dữ liệu 64 bit 129
4.2.5 Chuyển dữ liệu trong đoạn 16 – 64 bit 130
4.3 Cấu trúc rẽ nhánh và lặp 132
4.3.1 Cấu trúc if 134
4.3.2 Cấu trúc switch 137
4.3.3 Cấu trúc for 140
4.3.4 Cấu trúc while 144
4.3.5 Cấu trúc do-while 148
4.3.6 Điều khiển vòng lặp với break và continue 152
4.3.7 Thực thi có điều kiện 155
4.3.8 Phá vỡ vòng lặp để tối ưu hiệu năng 157
4.4 Chuyển đổi mã 158
4.4.1 Hệ thống số và bảng mã 158
4.4.2 Số hệ 16 sang ASCII 168
4.4.3 ASCII sang thập phân 170
4.4.4 BCD và nhị phân 170
4.4.5 Xâu ASCII sang nhị phân 172
4.5 Thao tác số học 173
4.5.1 Phép cộng, trừ 173
4.5.2 Phép nhân 176
4.5.3 Phép chia 178
4.6 Tổng kết chương 179
Câu hỏi và bài tập 180
Chương 5 LẬP TRÌNH HỢP NGỮ ARM NÂNG CAO 182
5.1 Tổ chức các cấu trúc dữ liệu 182
Trang 55.1.1 Cấu trúc mảng 183
5.1.2 Xử lý xâu 184
5.1.3 Bản ghi 191
5.1.4 Danh sách 192
5.1.5 Hàng đợi 196
5.1.6 Ngăn xếp 199
5.2 Macro 206
5.3 Chương trình con 207
5.3.1 Khái niệm, phân loại 207
5.3.2 Truyền tham số 208
5.3.4 Dữ liệu cục bộ 217
5.3.5 Một số ví dụ minh họa 226
5.4 Xử lý ngoại lệ 239
5.4.1 Quá trình khởi động lại 240
5.4.2 Các loại ngoại lệ 243
5.4.3 Quản lý ưu tiên 249
5.5 Liên kết mô-đun ngoài 251
5.6 Tổng kết chương 252
Câu hỏi và bài tập 253
TÀI LIỆU THAM KHẢO 255
PHỤ LỤC 256
P.1 Tạo và sử dụng công cụ phát triển chéo cho ARM trong Ubuntu 256
P.2 Cấu trúc đĩa CD mã nguồn 261
CHỈ MỤC 262
Trang 6THUẬT NGỮ VÀ TỪ VIẾT TẮT
AHB-PPB Advanced High – Performance
Bus PPB
Bus ngoại vi riêng, hiệu năng cao cải tiến
ALU Arithmetic and Logic Unit Bộ lôgic và số học
APB-PPB Advanced Peripheral Bus PPB Bus ngoại vi riêng cải tiến
ARM Advanced RISC Machine Máy RISC tiên tiến
AVR Alf and Vegard's RISC
Tên một loại vi điều khiển của tập đoàn Atmel, dựa theo tên của hai nhà thiết kế chip đầu tiên
CISC Complex Instruction Set
CPU Center Processing Unit Bộ xử lý trung tâm
DRAM Dynamic Random Access
IC Intergrated Circuit Mạch tích hợp
IDE Intergrated Development
Environment Môi trường phát triển tích hợp
IR Instruction Register Thanh ghi lệnh
ISA Instruction Set Architecture Kiến trúc tập lệnh
LSB Least Significant Bit Bit có trọng số thấp nhất
MSB Most Significant Bit Bit có trọng số cao nhất
MSP Main Stack Pointer Con trỏ ngăn xếp chính
NMI Non Maskable Interrupt Ngắt không che được
NVIC Nested Vectored Interrupt
Controller
Bộ điều khiển ngắt vectơ lồng nhau
PC Program Counter Thanh ghi con trỏ lệnh
PPB Private Peripheral Bus Bus ngoại vi riêng
Trang 7PSP Process Stack Pointer Con trỏ ngăn xếp xử lý RAM Random Access Memory Bộ nhớ truy xuất ngẫu nhiên RAM Random Access Memory Bộ nhớ truy cập ngẫu nhiên
RISC Reduced Instruction Set
SIMD Single Instruction – Multiple
SLA System Level Architecture Kiến trúc mức hệ thống SRAM Static Random Access Memory RAM tĩnh
VIC Vectored Interrupt Controller Bộ điều khiển ngắt vectơ
Trang 8max M Kích thước tối đa của bộ nhớ vật lý
N Số chân vào của bộ giải mã
S Độ rộng của bus địa chỉ
t a Thời gian thực hiện một lệnh
T s Khoảng thời gian của một giai đoạn trong đường ống
v Vị trí một phần tử trong mảng
V O Số thứ tự của chân ra kích hoạt của bộ giải mã
Trang 9DANH MỤC BẢNG
Bảng 1.1 So sánh kiến trúc Von Neumann và Harvard - 11
Bảng 1.2 So sánh kiến trúc RISC và CISC - 20
Bảng 2.1 Các chế độ hoạt động của vi xử lý lõi ARM - 40
Bảng 2.2 Trình biên dịch xử lý để ghi một bit khi không/có sử dụng bit- band - 50
Bảng 2.3 Trình biên dịch xử lý để đọc một bit khi không/có sử dụng bit- band - 51
Bảng 2.4 Ánh xạ địa chỉ bit – band trong vùng SRAM - 51
Bảng 2.5 Ánh xạ địa chỉ bit – band trong vùng nhớ ngoại vi - 51
Bảng 2.6 Tổng hợp bảng vector ngắt - 60
Bảng 3.1 Các chỉ dẫn khai báo biến của trình biên dịch hợp ngữ - 69
Bảng 3.2 Một số chỉ dẫn của trình biên dịch ARM - 70
Bảng 3.3 So sánh tập lệnh Thumb và ARM 32 bit - 74
Bảng 3.4 Các câu lệnh truyền dữ liệu bên trong vi xử lý - 77
Bảng 3.5 Các lệnh dịch bit - 79
Bảng 3.6 Tổng hợp cú pháp các lệnh dịch - 80
Bảng 3.7 Các lệnh truy xuất bộ nhớ với các kiểu dữ liệu khác nhau - 81
Bảng 3.8 Các chế độ địa chỉ - 82
Bảng 3.9 Các lệnh truy cập bộ nhớ với giá trị tức thời - 82
Bảng 3.10 Các lệnh truy cập bộ nhớ với giá trị trực tiếp và ghi ngược - 83
Bảng 3.11 Các lệnh truy cập bộ nhớ với địa chỉ liên quan thanh ghi PC - 84
Trang 10Bảng 3.13 Các lệnh truy cập bộ nhớ chế độ chỉ số sau - 85
Bảng 3.14 Cú pháp các câu lệnh truyền đa dữ liệu - 86
Bảng 3.15 Các chế độ địa chỉ với các câu lệnh nạp – lưu trữ đa dữ liệu - 87
Bảng 3.16 Các lệnh nạp/lưu trữ đa giá trị - 87
Bảng 3.17 Các lệnh nạp/ lưu giá trị vào bộ nhớ với ghi ngược - 88
Bảng 3.18 Các lệnh PUSH và POP cho ngăn xếp - 90
Bảng 3.19 Các chế độ địa chỉ cho thao tác ngăn xếp - 91
Bảng 3.20 Các lệnh thao tác số học - 93
Bảng 3.21 Các lệnh nhân và nhân cộng dồn - 93
Bảng 3.22 Các lệnh lôgic - 94
Bảng 3.23 Tổng hợp các lệnh dịch và quay - 95
Bảng 3.24 Các lệnh mở rộng kiểu dữ liệu - 96
Bảng 3.25 Các lệnh mở rộng kiểu dữ liệu với thao tác quay - 96
Bảng 3.26 Các câu lệnh đảo dữ liệu - 97
Bảng 3.27 Các lệnh thao tác với bit trong thanh ghi - 98
Bảng 3.28 Các câu lệnh so sánh và kiểm tra - 99
Bảng 3.29 Các câu lệnh rẽ nhánh -100
Bảng 3.30 Các cờ trong thanh ghi PSR, dùng để kiểm tra điều kiện rẽ nhánh -101
Bảng 3.31 Các hậu tố điều kiện -102
Bảng 3.32 Khối lệnh IT với số lượng điều kiện khác nhau -106
Bảng 3.33 Ví dụ với câu lệnh SSAT -108
Bảng 3.34 Ví dụ với câu lệnh USAT -108
Bảng 3.35 Câu lệnh ngắt -109
Bảng 3.36 Các lệnh cờ hiệu -110
Bảng 3.37 Ví dụ các câu lệnh thao tác với bộ đồng xử lý -111
Trang 11Bảng 4.1 So sánh một số chỉ dẫn phổ biến của Keil và CSS -113
Bảng 4.2 Các toán tử so sánh trên số không dấu hoặc có dấu -128
Bảng 4.3 Tổng hợp mã điều kiện -133
Bảng 4.4 Cài đặt cấu trúc if đơn -135
Bảng 4.5 Cài đặt cấu trúc if-else trong C và hợp ngữ ARM -136
Bảng 4.6 Cài đặt cấu trúc switch trong C và hợp ngữ ARM -139
Bảng 4.7 Cài đặt cấu trúc for trong C và hợp ngữ ARM -141
Bảng 4.8 Cài đặt cấu trúc while trong C và hợp ngữ ARM -145
Bảng 4.9 Cài đặt cấu trúc do-while trong C và hợp ngữ ARM -149
Bảng 4.10 Quan hệ giữa các chữ số trong các hệ đếm -159
Bảng 4.11 Mã BCD của các chữ số thập phân -167
Bảng 5.1 Lệnh với hậu tố hướng kiểu ngăn xếp -205
Bảng 5.2 So sánh Macro và chương trình con -206
Trang 12DANH MỤC HÌNH
Hình 1.1: Quy trình thiết kế và xây dựng phần cứng - 4
Hình 1.2: Khung nhìn chức năng của máy tính - 5
Hình 1.3: Các thao tác trong máy tính - 6
Hình 1.4: Máy tính theo khung nhìn người dùng - 7
Hình 1.5: Tổ chức máy tính mức cao - 7
Hình 1.6: Kiến trúc Von Neumann - 9
Hình 1.7: Kiến trúc Harvard - 9
Hình 1.8: So sánh kiến trúc Harvard và Von Neumann - 11
Hình 1.9: Quá trình thực thi chương trình trong máy tính - 12
Hình 1.10: Kiến trúc đơn lệnh SISD - 13
Hình 1.11: Thực thi trong kiến trúc đường ống lệnh - 13
Hình 1.12: Hoạt động bên trong CPU có kiến trúc siêu vô hướng - 14
Hình 1.13: Minh họa thực hiện lệnh trong kiến trúc siêu vô hướng - 14
Hình 1.14: Các bộ vi xử lý đa nhân - 15
Hình 1.15: Minh họa các giai đoạn thực hiện lệnh trong 80x86 - 16
Hình 1.16: Quá trình thực thi một lệnh trong vi xử lý ARM - 16
Hình 1.17: Quá trình lấy lệnh - 17
Hình 1.18: Sơ đồ giải mã lệnh - 18
Hình 1.19: Minh họa mã theo tác và các lệnh máy - 20
Hình 1.20: Bộ nhớ và địa chỉ vật lý - 21
Trang 13Hình 1.21: Định dạng nhóm byte - 22
Hình 1.22: Các mức máy ảo - 24
Hình 1.23: Chuyển đổi từ ngôn ngữ bậc cao sang mã máy - 26
Hình 1.24: Quy trình xây dựng chương trình hợp ngữ - 28
Hình 1.25: Hợp dịch chéo và thực thi trong Ubuntu - 31
Hình 1.26: Quá trình phát triển chéo với Keil uVision trong Windows - 32
Hình 1.27: Minh họa giao diện keil uVision 4 - 33
Hình 2.1: Mô hình đơn giản của lõi vi xử lý Cortex – M3 - 36
Hình 2.2: Quá trình phát triển của vi xử lý ARM - 37
Hình 2.3: Mô hình kiến trúc vi xử lý ARM - 39
Hình 2.4: Các chế độ hoạt động và các trạng thái của lõi ARM Cortex-M3 - 41
Hình 2.5: Liên hệ giữa các chế độ và mức ưu tiên - 42
Hình 2.6: Phân cấp bộ nhớ - 43
Hình 2.7: Bản đồ bộ nhớ trong - 45
Hình 2.8: Không gian điều khiển hệ thống - 47
Hình 2.9: Truy cập vào bit trong vùng bit –band thông qua bit – band alias - 49
Hình 2.10: Ghi giá trị vào bit – band alias - 50
Hình 2.11: Đọc bit không/có bit-band - 50
Hình 2.12: Tập thanh ghi của lõi vi xử lý Cortex – M3 - 54
Hình 2.13: Quá trình thay đổi luồng thực thi chương trình với sự tham gia của LR - 56
Hình 2.14: Các thanh ghi đặc biệt - 56
Hình 2.15: Giá trị bit của các thanh ghi xPSR - 57
Hình 2.16: Các thanh ghi điều khiển ngắt - 58
Hình 2.17: Thanh ghi APSR - 59
Hình 2.18: Điều khiển các ngoại lệ - 59
Trang 14Hình 3.1: Mô hình các lớp trong kiến trúc máy tính - 63
Hình 3.2: Tổng hợp về mã hóa tập lệnh - 66
Hình 3.3: Tổng hợp các tập lệnh ARM - 73
Hình 3.4: Bộ dịch bit trong lõi vi xử lý - 79
Hình 3.5: Mô tả quá trình dịch trái - 80
Hình 3.6: Mô tả câu lệnh LDMIA - 89
Hình 3.7: Mô tả câu lệnh STMFD - 91
Hình 3.8: Cấu trúc chung của nhóm lệnh xử lý dữ liệu - 92
Hình 3.9: Mô tả các quá trình dịch và quay bit trong thanh ghi - 95
Hình 3.10: Mô tả các thao tác đảo dữ liệu - 97
Hình 3.11: Mô tả bài toán -105
Hình 3.12: Mô tả trường hợp xảy ra vượt ngưỡng giá trị -107
Hình 4.1: Cấu trúc chung của chương trình trên vi xử lý ARM -113
Hình 4.2: So sánh các tập lệnh của họ vi xử lý ARM -116
Hình 4.3: Các bước nạp dữ liệu từ bộ nhớ vào thanh ghi -118
Hình 4.4: Minh họa cấp phát bộ nhớ -120
Hình 4.5: Các kiểu di chuyển dữ liệu trong máy tính -121
Hình 4.6: Cấu trúc lệnh B và BL -133
Hình 4.7: Sơ đồ khối của cấu trúc if -134
Hình 4.8: Sơ đồ khối của cấu trúc switch-case -138
Hình 4.9: Sơ đồ khối cấu trúc for -141
Hình 4.10: Sơ đồ khối cấu trúc while -145
Hình 4.11: Sơ đồ khối cấu trúc do – while -149
Hình 4.12: Mã lệnh thực thi có điều kiện -156
Hình 4.13: Minh họa chuyển từ số hệ 10 sang hệ 2 -160
Trang 15Hình 4.14: Minh họa chuyển đổi số giữa hệ 2 và 2K -161
Hình 4.15: Minh họa ánh xạ 1-1 giữa bộ ký tự và bảng mã -161
Hình 4.16: Bảng mã ASCII 7 bit -163
Hình 4.17: Bảng mã ASCII 8 bit -163
Hình 4.18: Bảng mã Unicode -165
Hình 5.1: Minh họa mảng 2 chiều -184
Hình 5.2: Tổ chức mảng 2 chiều trong bộ nhớ theo dòng – dòng -184
Hình 5.3: Tổ chức mảng 2 chiều trong bộ nhớ theo cột – cột -184
Hình 5.4: Minh họa hàng đợi -196
Hình 5.5: Hàng đợi 32 bit mở rộng theo địa chỉ tăng dần -198
Hình 5.6: Minh họa ngăn xếp 32 bit kiểu đầy-giảm dần -200
Hình 5.7: Hoạt động lệnh LDM và STM -203
Hình 5.8: Minh họa thao tác PUSH và POP -204
Hình 5.9: Minh họa các kiểu cài đặt ngăn xếp -205
Hình 5.10: Truyền giá trị qua ngăn xếp người dùng -213
Hình 5.11: Truyền tham chiếu sử dụng ngăn xếp người dùng -215
Hình 5.12: Sự tăng trưởng của ngăn xếp hệ thống -216
Hình 5.13: Vị trí của biến cục bộ trên đỉnh ngăn xếp -220
Hình 5.14: Sự tăng trưởng của ngăn xếp trong chương trình ví dụ -223
Hình 5.15: Vị trí tương đối của các biến cục bộ trên đỉnh ngăn xếp trong ví dụ -225
Hình 5.16: Các biến cục bộ: trạng thái ngăn xếp người dùng -225
Hình 5.17: Minh họa bảng vec-tơ ngắt -241
Hình 5.18: Thanh ghi độ dời của IVT -242
Hình 5.19: Quá trình xử lý ngoại lệ -243
Hình 5.20: Cấu trúc IVT -244
Trang 16Hình 5.21: Thanh ghi trạng thái và điều khiển ISR hệ thống (NVIC_SHCSR) -246
Hình 5.22: Thanh ghi trạng thái lỗi đa mức (NVIC_MMFSR/NVIC_BFSR/NVIC_UFSR) -247
Hình 5.23: Thanh ghi trạng thái điều khiển ngắt (NVIC_ICSR) -247
Hình 5.24: Thanh ghi thiết lập hiệu lực cho ngắt (NVIC_ISER) -249
Hình 5.25: Tổng hợp mức ưu tiên của ngoại lệ -250
Hình 5.26: Thanh ghi ưu tiên cho các chương trình con hệ thống (NVIC_SHPR) -250
Hình 5.27: Thanh ghi ưu tiên cho ngắt -251
Hình 5.28: Tổ chức dự án thành nhiều mô-đun -252
Hình P.1: Cấu trúc đĩa CD mã nguồn -261
Trang 17MỞ ĐẦU
Trong xu hướng phát triển của công nghệ thông tin và truyền thông hiện nay,
hệ thống nhúng, hệ thống tích hợp thông minh, các thiết bị thông minh đã và đang được nghiên cứu và ứng dụng rộng rãi Theo thống kê trong [12] năm 1999, có đến 99% số vi xử lý thuộc về các hệ thống nhúng Thống kê trong [10] năm 2011 cũng chỉ ra: có tới trên 95% số chip sản xuất được dùng cho các ứng dụng nhúng Các sản phẩm nhúng có mặt trong mọi lĩnh vực đời sống như ti-vi, tủ lạnh, máy giặt, lò
vi sóng, máy ảnh số, ô-tô, v.v Hầu hết các máy công nghiệp hiện nay đều có chứa các hệ nhúng, nhất là các thiết bị y tế, giao thông, quân sự, thông tin liên lạc, v.v
Trên cơ sở hạ tầng bao gồm các hệ thống nhúng, tích hợp, thông minh và các thiết bị di động, thông minh cùng với sự phát triển mạnh mẽ của công nghệ tri thức,
xu hướng Internet kết nối vạn vật (IoT) và cách mạng công nghiệp 4.0 đang bùng
nổ và trở thành một định hướng công nghệ chiến lược hiện nay Điển hình của định hướng chiến lược này là sự ra đời, phát triển và hoàn thiện của các hệ thống nhà thông minh, đô thị thông minh, các hệ thống y tế, giáo dục, nông nghiệp thông minh, v.v Bộ não điều khiển trong các hệ thống này thường dựa trên các bộ vi điều khiển Kiến trúc chung của các bộ vi điều khiển thường bao gồm một bộ xử lý, bộ nhớ trong với cả ROM và RAM, và một số mạch điều khiển vào/ra; trong đó, vi xử
lý ARM được sử dụng rộng rãi nhất với nhiều mức độ từ đơn giản đến phức tạp
Song hành với sự phát triển mạnh mẽ của các hệ thống IoT, cách mạng công nghiệp 4.0, vấn đề đảm bảo an toàn và bảo mật thông tin trong các hệ thống này cũng đang là một thách thức lớn cần giải quyết Hầu hết các hệ thống này đều tích hợp cả phần cứng và phần mềm nhúng Do đó, để đảm bảo an toàn và bảo mật thông tin, trước hết cần trích xuất được phần mềm nhúng sau đó dịch ngược sang
mã hợp ngữ để phân tích Bên cạnh đó, do sự cạnh tranh khắc nghiệt của các sản phẩm IoT, vấn đề tối ưu hiệu năng, điện năng tiêu thụ, chi phí cũng đang là bài toán lớn đối với nhiều công ty, doanh nghiệp Để có thể triển khai các kỹ thuật tối ưu trong các hệ thống này, việc nghiên cứu, tối ưu trên mã hợp ngữ là quan trọng và hiệu quả
Trang 18Từ nhu cầu khách quan của việc phát triển phần mềm nhúng, đảm bảo an toàn và bảo mật thông tin, vấn đề tối ưu trong các hệ thống IoT cũng như sự phổ biến của các vi điều khiển lõi ARM, vấn đề lập trình hợp ngữ trên vi xử lý ARM là cấp thiết và có ý nghĩa khoa học, thực tiễn Tuy nhiên, ở Việt Nam trong hầu hết các trường đại học, các trung tâm đào tạo chỉ dạy lập trình hợp ngữ cho vi xử lý 80x86 và hiện tại vẫn chưa có giáo trình hay sách tham khảo chính thức về lập trình
hợp ngữ ARM được xuất bản chính thức Do đó, giáo trình “Lập trình hợp ngữ
ARM” có tính thời sự, là tài liệu học tập hữu ích cho sinh viên ngành Công nghệ
thông tin, Cơ điện tử theo lĩnh vực Kỹ thuật phần mềm nhúng, Hệ thống nhúng, điều khiển tự động Đồng thời, giáo trình này cũng được sử dụng làm tài liệu tham khảo, cung cấp các kiến thức nền tảng để nghiên cứu, phát triển các kỹ thuật tối ưu,
kỹ thuật đảm bảo an toàn, bảo mật thông tin trong các hệ thống, thiết bị nhúng nói chung Nội dung giáo trình được cấu trúc như sau:
Chương 1 Kiến thức cơ sở cho lập trình hợp ngữ tổng hợp và cung cấp
các kiến thức cơ sở nền tảng về hệ thống, phần cứng cần thiết cho kỹ sư lập trình hợp ngữ Nội dung của chương cũng cung cấp một khung nhìn tổng thể các vấn đề liên quan nhằm tiếp cận và tìm hiểu lập trình hợp ngữ đầy đủ và hiệu quả
Chương 2 Cấu trúc vi xử lý ARM trình bày chi tiết về kiến trúc của vi điều
khiển lõi ARM, kiến trúc và các chế độ hoạt động của vi xử lý ARM Chương này cũng tập trung trình bày chuyên sâu về tập các thanh ghi, các thanh ghi đặc biệt, các
cờ và quá trình giải mã, thực thi câu lệnh của khối điều khiển trong vi xử lý
Chương 3 Tập lệnh ARM tập trung trình bày về kiến trúc tập lệnh và các
nhóm lệnh trong tập lệnh ARM Tập lệnh ARM sử dụng kiến trúc RISC với các nhóm lệnh truy cập bộ nhớ, ngoại vi, truyền dữ liệu trong vi xử lý, rẽ nhánh và lặp Các nhóm lệnh này được sử dụng để xây dựng chương trình hợp ngữ trong các chương tiếp theo
Chương 4 Lập trình hợp ngữ ARM cơ bản trình bày các kỹ thuật cốt lõi
để lập trình hợp ngữ bao gồm cấu trúc chương trình, cấu trúc câu lệnh, các thao tác chuyển dữ liệu và các cấu trúc điều khiển Các kiến thức cơ bản trong chương được trình bày theo ba bước từ giải thuật đến ví dụ minh họa rồi áp dụng thực tiễn
Chương 5 Lập trình hợp ngữ ARM nâng cao cung cấp một số kỹ thuật
lập trình hợp ngữ ARM nâng cao theo cách tiếp cận cấu trúc trong ngôn ngữ lập trình bậc cao
Mặc dù đã cố gắng nhưng do thời gian và kinh nghiệm biên soạn, giáo trình không tránh khỏi những khiếm khuyết, rất mong nhận được các ý kiến đóng góp của quý độc giả và các đồng nghiệp Mọi góp ý xin gửi về huongpv@gmail.com
Trang 19Chương 1 KIẾN THỨC CƠ SỞ CHO LẬP TRÌNH HỢP NGỮ
Để có thể lập trình tốt một ngôn ngữ bậc thấp như hợp ngữ, chúng ta cần phải nắm vững kiến thức cả về phần cứng và phần mềm, cách tổ chức, thực thi chương trình, môi trường và công cụ lập trình Do đó, mục tiêu chương này nhằm cung cấp khung nhìn tổng thể và các kiến thức cơ sở, nền tảng cho lập trình hợp ngữ nói chung Để đạt được mục tiêu này, các nội dung kiến thức trong chương được hệ
thống và cấu trúc như sau: Mục 1.1 trình bày về tổ chức, hoạt động của hệ thống
máy tính, chương trình, và các vấn đề liên quan đến vi xử lý, tập lệnh máy, ngôn
ngữ máy, hợp ngữ; Mục 1.2 trình bày về vấn đề tổ chức và truy xuất bộ nhớ trong máy tính; Mục 1.3 trình bày về biểu diễn, lưu trữ dữ liệu và xử lý thông tin trong máy tính; Mục 1.4 trình bày về chương trình dịch hợp ngữ; Mục 1.5 trình bày về môi trường và công cụ lập trình hợp ngữ; Mục 1.6 tóm lược các khối kiến thức
trong chương
1.1 Tổ chức và thực thi trong máy tính
Để có thể làm chủ hợp ngữ và ứng dụng trong một số lĩnh vực khác nhau như tối ưu hóa, phân tích, phát hiện mã độc, tái kỹ nghệ phần mềm, v.v lập trình viên phải có kiến thức tổng hợp và sâu sắc đặc biệt là kiến thức về tổ chức và hoạt động của hệ thống máy tính Hệ thống máy tính được tổ chức theo bốn mức kiến trúc khác nhau gồm kiến trúc mức hệ thống, kiến trúc mức vi xử lý, kiến trúc mức lô-gic và kiến trúc mức mạch Các kỹ sư lập trình phần mềm cần quan tâm sâu vào mức hệ thống và mức vi xử lý còn lập trình phần cứng cần chuyên sâu về mức lô-gic và mức mạch Mỗi mức kiến trúc có ba khía cạnh chính: cấu trúc – chỉ ra các thành phần và liên kết giữa các thành phần; chức năng – mô tả chức năng của mỗi thành phần cụ thể; bố cục – là cách tổ chức vật lý của các thành phần trong hệ thống Dưới khung nhìn lập trình, lập trình viên chỉ cần tập trung vào khía cạnh cấu trúc và chức năng Ở mức hệ thống, lập trình viên cần hiểu kỹ về việc tổ chức và thực thi của một chương trình trong hệ thống máy tính; ở mức vi xử lý cần nắm rõ quá trình thực thi một câu lệnh trong CPU Do đó, nội dung phần này sẽ trình bày
Trang 20mức hệ thống và quá trình thực thi chương trình, rồi trình bày cụ thể vào kiến trúc
vi xử lý và quá trình thực thi câu lệnh bên trong vi xử lý
1.1.1 Chức năng và các mức kiến trúc của hệ thống máy tính
Phát triển phần cứng hệ thống thường được thực hiện theo mô hình chữ Y như trong Hình 1.1 Phát triển phần cứng hệ thống nhúng được chia thành bốn mức
từ mức mạch đến mức hệ thống và được thiết kế theo ba khía cạnh là chức năng, cấu trúc và bố cục vật lý Trong mức hệ thống, dựa vào các thành phần cơ bản như CPU, RAM, ROM, cache, v.v để thiết kế, xây dựng lên hệ thống nhúng Trong mức CPU, các phần tử cơ bản là các đơn vị chức năng như ALU, CU, bộ cộng, bộ nhân, các thanh ghi, v.v được kết hợp để thiết kế, xây dựng CPU và các thành phần mức trên khác Các phần tử cơ bản trong mức CPU lại được thiết kế và xây dựng từ các cổng lôgic như AND, OR, NOT, XOR, v.v trong mức lôgic Các cổng lôgic lại được thiết kế và xây dựng từ các thiết bị bán dẫn trong mức mạch
Hình 1.1: Quy trình thiết kế và xây dựng phần cứng a) Khung nhìn chức năng
Dưới khung nhìn người dùng, cả cấu trúc và chức năng của hệ thống máy tính là đơn giản Nhìn chung, như mô tả trong Hình 1.2, mỗi hệ thống máy tính có bốn chức năng chính [3, 4, 11]:
Xử lý dữ liệu
Lưu trữ dữ liệu
Di chuyển dữ liệu
Điều khiển
Trang 21Hình 1.2: Khung nhìn chức năng của máy tính
Các chức năng của máy tính được mô tả cụ thể trong Hình 1.3, cụ thể: trong Hình 1.3a, máy tính có thể được xem như một thiết bị di chuyển dữ liệu giữa các thiết bị ngoại vi hoặc giữa nó với một máy tính khác; trong Hình 1.3b, máy tính như một thiết bị lưu trữ dữ liệu, dữ liệu được chuyển từ môi trường ngoài vào lưu trữ trong máy tính; trong Hình 1.3c, máy tính thực hiện các thao tác xử lý thông tin; trong Hình 1.3d, máy tính đóng vai trò chuyển hướng dữ liệu giữa thiết bị ngoài với thành phần lưu trữ trong máy tính
Trang 22Hình 1.3: Các thao tác trong máy tính
b) Khung nhìn cấu trúc
Theo khung nhìn người dùng, máy tính là một thiết bị lưu trữ và xử lý thông tin, có cấu trúc như trong Hình 1.4 còn dưới khung nhìn lập trình, kiến trúc mức hệ thống và mức vi xử lý được minh họa như trong Hình 1.5 Trong Hình 1.4, máy tính được xem như một hộp đen có chức năng lưu trữ, xử lý dữ liệu và giao tiếp với thiết
bị ngoại vi Trong Hình 1.5, ở mức hệ thống, máy tính gồm ba khối chính là CPU,
bộ nhớ chính và khối vào/ra; các khối làm việc với nhau thông qua đường truyền hệ thống Ở mức vi xử lý, CPU lại bao gồm tập thanh ghi, khối lôgic và số học, khối điều khiển; các khối này làm việc với nhau thông qua các đường truyền nội còn gọi
là đường dữ liệu
Trang 23Hình 1.4: Máy tính theo khung nhìn người dùng
Trang 241.1.2 Kiến trúc mức hệ thống
Kiến trúc mức hệ thống (SLA – System Level Architecture) là mô hình tổ chức máy tính dựa trên các thành phần có sẵn như CPU, RAM, ROM, thiết bị vào, thiết bị ra, v.v Có hai loại kiến trúc mức hệ thống chính trong thế giới máy tính số
là Von Neuman và Harvard Kiến trúc Von Neuman được dùng cho họ máy tính cá nhân, máy chủ, v.v còn kiến trúc Harvard được dùng cho các hệ thống nhúng, thiết
bị thông minh, thiết bị IoT, v.v
a) Kiến trúc Von Neumann
Kiến trúc Von Neumann là kiến trúc mức hệ thống phổ biến nhất hiện nay Kiến trúc này dựa trên hai ý tưởng chính: về mặt thực thi, máy tính số hoạt động theo các chương trình lưu trữ sẵn trong bộ nhớ, các lệnh được thực hiện tuần tự, mỗi thời điểm chỉ thực hiện được một lệnh; về mặt tổ chức, máy tính Von Neumann được chia thành ba khối như mô tả trong Hình 1.6 [11] Các khối trong máy tính Von Neumann làm việc với nhau thông qua hệ thống đường truyền gọi là bus hệ thống Các bus hệ thống gồm ba loại:
Bus dữ liệu: sử dụng để truyền tải dữ liệu giữa CPU, bộ nhớ và các thiết
từ đơn lệnh thành đường ống lệnh hoặc kiến trúc siêu vô hướng
Trang 25Hình 1.6: Kiến trúc Von Neumann b) Kiến trúc Harvard
Hình 1.7: Kiến trúc Harvard
Kiến trúc Harvard được dùng để chỉ những kiến trúc máy tính mà trong đó phân biệt rõ ràng bộ nhớ dữ liệu và bộ nhớ chương trình, chúng có những đường truyền riêng để truy cập vào bộ nhớ dữ liệu và bộ nhớ chương trình Kiến trúc Harvard bắt đầu với máy tính Harvard Mark I, cho phép các lệnh được đặt trong các băng đục lỗ (24 bit) và dữ liệu thì được chứa trong các thẻ Những máy tính đầu tiên này bị giới hạn dung lượng dữ liệu; không cho phép truy cập vào khu vực chứa lệnh (chương trình) như với dữ liệu dẫn đến việc tạo, nạp, sửa chữa, v.v toàn bộ chương trình phải được thực hiện ngoại tuyến
Trong một máy tính sử dụng kiến trúc Von Neumann, CPU có thể đọc một lệnh, hoặc đọc/ghi dữ liệu từ bộ nhớ Tuy nhiên, cả hai quá trình tương tác với lệnh hoặc dữ liệu không thể thực hiện cùng lúc vì nó sử dụng chung một đường truyền
và bộ nhớ Trong một máy tính kiến trúc Harvard, CPU có thể vừa đọc một lệnh, vừa truy cập dữ liệu từ bộ nhớ cùng lúc Hình 1.8 chỉ ra sự khác biệt chính giữa hai
Trang 26Với cùng một chương trình, một máy tính kiến trúc Harvard có thể chạy nhanh hơn máy tính kiến trúc Von Neumann vì nó có thể thực hiện ngay lệnh tiếp theo khi vừa kết thúc lệnh trước đó Tốc độ được tăng lên nhưng phải trả giá bằng
sự thiết kế phần cứng phức tạp hơn Ví dụ, trong kiến trúc Harvard cần phải thiết kế hai bus khác nhau cho dữ liệu và chương trình [11]
Trong những năm gần đây, tốc độ CPU tăng lên rất nhiều lần so với tốc độ truy cập vào bộ nhớ chính Do đó, các nhà thiết kế quan tâm đến việc giảm số lần truy cập vào bộ nhớ để đảm bảo tốc độ hoạt động của CPU Nếu, trong cùng một lúc, mỗi lệnh của CPU cần phải truy cập vào bộ nhớ một lần, vậy thì việc tăng tốc
độ CPU không còn ý nghĩa vì nó luôn luôn bị giới hạn bởi việc truy cập vào bộ nhớ
Để tăng hiệu quả của hệ thống, bộ nhớ có thể được thiết kế để có tốc độ truy cập cao, nhưng điều này cũng dẫn đến giá sản xuất sẽ cao Giải pháp phổ biến để giải quyết tình huống này là sử dụng bộ nhớ đệm có dung lượng nhỏ và tốc độ truy cập cao Khi dữ liệu CPU cần truy cập đang nằm trong bộ nhớ đệm, việc tương tác tốn ít thời gian hơn rất nhiều lần so với khi bộ đệm phải thay đổi và lấy dữ liệu từ
bộ nhớ chính đưa vào Việc điều chỉnh bộ nhớ đệm là một vấn đề quan trọng trong việc thiết kế máy tính
Kiến trúc Harvard cũng thường được dùng trong một số bộ xử lý tín hiệu số chuyên dụng chuyên dụng, thường dùng trong các sản phẩm xử lý âm thanh, hình ảnh như vi xử lý Blackfin của Analog Devices Inc
Hầu hết các vi điều khiển thông dụng được dùng trong các ứng dụng nhúng như PIC, AVR, 8051, v.v được phát triển dựa trên kiến trúc Harvard Những vi xử
lý này có đặc tính là có lượng bộ nhớ dữ liệu và bộ nhớ chương trình nhỏ, phù hợp với kiến trúc Harvard và tập lệnh RISC để đảm bảo hầu hết các lệnh được thực hiện trong 1 chu kỳ máy Việc phân chia bộ nhớ ra thành bộ nhớ chương trình và bộ nhớ
dữ liệu có thể làm cho bus dữ liệu và bus chương trình có kích thước băng truyền khác nhau Ví dụ, các vi điều khiển PIC có bus dữ liệu 8-bit (phụ thuộc vào dòng PIC), nhưng bus chương trình có thể là 12-bit, 14-bit hoặc 16-bit
Ngoài ra, còn một cải tiến của kiến trúc Harvard là kiến trúc SHARC Ý tưởng của kiến trúc này là xây dựng dựa trên kiến trúc Harvard bằng cách thêm vào những điểm đặc trưng để cải thiện thông lượng dữ liệu như mô tả và so sánh trong Hình 1.8
Trang 27c) So sánh kiến trúc Von Neuman và Harvard
Tương quan giữa kiến trúc Von Neuman và Harvart được chỉ ra trong Hình 1.8, và được tổng hợp trong Bảng 1.1 [4, 11]
Hình 1.8: So sánh kiến trúc Harvard và Von Neumann Bảng 1.1 So sánh kiến trúc Von Neumann và Harvard
Mục so sánh Kiến trúc Von Neuman Kiến trúc Harvard
- 4 thành phần chính: CPU, bộ nhớ chương trình, dữ liệu và ngoại vi
- 4 loại bus hệ thống: bus địa chỉ, bus điều khiển, bus lệnh và bus dữ liệu
Trang 281.1.3 Quá trình thực thi chương trình
Chức năng cơ bản của máy tính là thực thi chương trình – bao gồm một tập các câu lệnh được lưu trữ trong bộ nhớ Bản chất quá trình hoạt động của máy tính
là quá trình thực hiện các câu lệnh được lấy từ bộ nhớ, nạp vào vi xử lý Khi máy tính được bật, vi xử lý sẽ thực hiện câu lệnh đầu tiên có địa chỉ chứa trong thanh ghi con trỏ lệnh (PC) Do đó, với các hệ thống máy tính có hệ điều hành lưu trữ trong thiết bị nhớ ngoài như ổ cứng, ổ CD, USB, v.v bao giờ cũng có các chương trình được ghi sẵn trong bộ nhớ trong chỉ đọc (ví dụ ROM BIOS) Các chương trình trong ROM BIOS sẽ được thực hiện đầu tiên, và sẽ làm nhiệm vụ nạp nhân hệ điều hành, rồi chuyển điều khiển cho nhân hệ điều hành Quá trình chuyển điều khiển chính là quá trình chuyển vi xử lý giữa các chương trình Việc chuyển đổi này thực chất là thay đổi địa chỉ câu lệnh trong thanh ghi PC Nhìn chung, quá trình thực thi chương trình của một hệ thống máy tính được mô tả như trong Hình 1.9: đầu tiên, chương trình được lưu trữ lâu dài trong bộ nhớ ngoài; khi được thực hiện chương trình và dữ liệu sẽ được nạp vào trong bộ nhớ trong; trong quá trình thực hiện lần lượt từng câu lệnh của chương trình sẽ được nạp từ bộ nhớ vào vi xử lý để thực hiện Câu lệnh đang thực hiện được chứa trong thanh ghi lệnh (IR) của vi xử lý [13-16]
Hình 1.9: Quá trình thực thi chương trình trong máy tính
Trang 291.1.4 Kiến trúc mức vi xử lý
a) Kiến trúc đơn lệnh
Hình 1.10: Kiến trúc đơn lệnh SISD
b) Kiến trúc đường ống lệnh
Hình 1.11: Thực thi trong kiến trúc đường ống lệnh
Hình 1.11 chỉ rõ quá trình thực thi các câu lệnh trong vi xử lý có kiến trúc đường ống lệnh Ví dụ, ở chu kỳ đồng hồ thứ 3, PC = 208, và các câu lệnh thực thi trong các giai đoạn:
ADD (addr=200=PC-8) trong giai đoạn thực thi
SUB (addr=204=PC-4) trong giai đoạn giải mã lệnh
MOV (aadr=208=PC) trong giai đoạn lấy lệnh
Trong kiến trúc đường ống, giả sử CPU có kiến trúc N s-đoạn, mỗi đoạn được
thực hiện trong một chu kỳ đồng hồ và thời gian mỗi đoạn là T s Trong trường hợp
kiến trúc CPU là tuần tự, thời gian hoàn thành một câu lệnh là N × T Trong
Trang 30trường hợp CPU có kiến trúc đường ống lệnh và các lệnh độc lập dữ liệu, thời gian
để thực hiện xong N I câu lệnh là ( N s + N I – 1) × 𝑇𝑠 Do đó, thời gian hoàn thành trung bình của một câu lệnh được tính theo công thức (1.1)
𝑡𝑎 = (𝑁𝑠+ 𝑁𝐼 − 1) × 𝑇𝑠
c) Kiến trúc siêu vô hướng
Ý tưởng của kiến trúc siêu vô hướng là nhiều câu lệnh có thể được thực hiện song song trong cùng một giai đoạn Điều này đòi hỏi phải có thêm các đơn vị chức năng trong CPU Ví dụ, CPU có hai bộ cộng thì có thể thực hiện song song hai phép cộng tại một thời điểm Hình 1.12 minh họa hoạt động bên trong CPU có kiến trúc siêu vô hướng và Hình 1.13 minh họa việc thực thi song song bên trong CPU theo kiến trúc siêu vô hướng
Hình 1.12: Hoạt động bên trong CPU có kiến trúc siêu vô hướng
Hình 1.13: Minh họa thực hiện lệnh trong kiến trúc siêu vô hướng
order /out-of- order)
4 Ghi thanh ghi / bộ nhớ
lệnh - Issue
width)
Trang 31d) Kiến trúc đa nhân
Kiến trúc đa nhân (multi-core) là mô hình kiến trúc song song trong một bộ
xử lý bao gồm nhiều đơn vị xử lý trung tâm, mỗi đơn vị gọi là một nhân, mỗi đơn vị
có bộ nhớ đệm lệnh (L1) riêng Các bộ vi xử lý đa nhân có kiến trúc chia sẻ hoặc không chia sẻ bộ nhớ đệm L2 như mô tả trong Hình 1.14
(a) Vi xử lý đa nhân với L2 riêng (b) Vi xử lý đa nhân dùng chung L2
Hình 1.14: Các bộ vi xử lý đa nhân
1.1.5 Quá trình thực hiện lệnh trong vi xử lý
Câu lệnh và dữ liệu đều là các chuỗi bit nhị phân được lưu trữ trong bộ nhớ nên vi xử lý chỉ có thể phân biệt được mã lệnh và dữ liệu thông qua địa chỉ của vùng nhớ chứa nó Do đó, với các hệ thống máy tính nói chung, chương trình được
tổ chức thành các đoạn mã lệnh và đoạn dữ liệu Trong quá trình thực hiện chương trình, lấn lượt từng câu lệnh sẽ được nạp từ bộ nhớ vào chứa trong thanh ghi lệnh của CPU và thực hiện Theo đó, câu lệnh đang thực hiện được chứa trong IR và địa chỉ của câu lệnh tiếp theo sẽ thực hiện được chứa trong PC
Quá trình thực hiện một câu lệnh thường được chia thành một số giai đoạn Với họ vi xử lý 80x86, quá trình thực hiện lệnh gồm sáu giai đoạn là lấy lệnh, giải
mã lệnh, tính địa chỉ toán hạng, lấy toán hạng, thực thi và lưu trữ Hình 1.15 mô tả sáu giai đoạn thực hiện phép toán 2 + 3 với các toán hạng chứa trong bộ nhớ của vi
xử lý 80x86 [11] Với vi xử lý ARM, theo kiến trúc tập lệnh rút gọn RISC nên được phân chia đơn giản hơn, thành ba giai đoạn: lấy lệnh, thực thi và lưu kết quả như minh họa trong Hình 1.16
Trang 32Hình 1.15: Minh họa các giai đoạn thực hiện lệnh trong 80x86
Hình 1.16: Quá trình thực thi một lệnh trong vi xử lý ARM
a) Quá trình lấy lệnh
Trong quá trình lấy lệnh, vi xử lý phát địa chỉ câu lệnh ra bus địa chỉ và đọc câu lệnh từ bộ nhớ vào chứa trong thanh ghi lệnh Quá trình này được mô tả trong Hình 1.17, gồm các bước chính sau:
Trang 33 CU đưa địa chỉ của lệnh từ bộ đếm chương trình PC ra bus địa chỉ
CU phát tín hiệu điều khiển đọc bộ nhớ
Lệnh đọc từ bộ nhớ được đặt lên bus dữ liệu và được nạp vào thanh ghi lệnh
CU tăng nội dung PC để trỏ sang lệnh kế tiếp
Hình 1.17: Quá trình lấy lệnh b) Giải mã lệnh
Sơ đồ giải mã lệnh được mô tả trong Hình 1.18a Đầu tiên, câu lệnh chứa trong thanh ghi lệnh sẽ được tách lấy phần mã thao tác (Opcode) Mã thao tác sẽ
được đưa vào các chân vào của bộ giải mã lệnh Bộ giải mã lệnh có N chân vào sẽ
có 2 N chân ra, mỗi chân được nối với chân lựa chọn chip của mạch chức năng trong
ALU, trong đó chỉ duy nhất một chân ra có tín hiệu còn 2 N – 1 không có tín hiệu
Giả sử mã thao tác có giá trị là V O thì chân ra có số thứ tự là V O sẽ được kích hoạt, các chân còn lại không kích hoạt, do đó sẽ chọn được mạch chức năng tương ứng để thực thi Như vậy, có thể thấy mã thao tác chính là chỉ số của mạch chức năng tương ứng trong ALU Từ mã phép toán đưa qua các chân vào của bộ giải mã sẽ lựa chọn được mạch chức năng thực thi Hình 1.18b minh họa bộ giải mã lệnh với 3 đầu vào và 2 3 = 8 đầu ra
Trang 34(a) Quá trình giải mã lệnh trong CPU (b) Bộ giải mã lệnh 3 đầu vào 8 đầu ra
Hình 1.18: Sơ đồ giải mã lệnh
c) Thực hiện lệnh
Sau khi giải mã phép toán, khối điều khiển đã chọn được đơn vị chức năng (mạch chức năng) có số thứ tự bằng mã thao tác và phát tiến hiệu điều khiển yêu cầu thực hiện chức năng Sau đó, các toán hạng cũng được chuyển cho mạch chức năng này để thực thi
1.1.6 Kiến trúc tập lệnh và tập lệnh máy
a) Kiến trúc tập lệnh
Định nghĩa 1.1 – Kiến trúc tập lệnh
Kiến trúc tập lệnh (ISA – Instruction set architecture) [2] là một mô hình trừu
tượng của bộ vi xử lý dưới khung nhìn lập trình, bao gồm cấu trúc câu lệnh, các chế
độ địa chỉ, các loại dữ liệu, chỉ dẫn, thanh ghi, kiến trúc bộ nhớ, ngắt, xử
lý ngoại lệ và thao tác vào/ra Đặc tả quan trọng trong mỗi kiến trúc tập lệnh là quy định khuôn dạng chung của các câu lệnh và định dạng mã phép toán
Có hai loại kiến trúc tập lệnh phổ biến là RISC (Reduced Instruction Set Computer) và CISC (Complex Instruction Set Computer), trong đó RISC được dùng cho hầu hết trong các hệ thống nhúng còn CISC dùng cho các máy tính đa dụng như máy tính để bàn, máy tính xách tay, máy chủ, v.v [18]
Trang 35 Kiến trúc CISC
Các kiến trúc với tập lệnh phức tạp CISC ra đời từ những năm 1960 Vào thời kỳ này, các chương trình dịch khó dùng các thanh ghi, các vi lệnh được thực hiện nhanh hơn các lệnh và cần thiết phải làm giảm độ dài các chương trình Các đặc tính này khiến người thiết kế ưu tiên chọn các kiểu toán hạng ô nhớ - ô nhớ và ô nhớ - thanh ghi, với những lệnh phức tạp và dùng nhiều kiểu định vị Điều này dẫn tới việc các lệnh có chiều dài thay đổi dẫn đến việc dùng bộ điều khiển vi chương trình là hiệu quả nhất
Kiến trúc RISC
Máy tính với tập lệnh rút gọn RISC ra đời vào đầu những năm 1980 Các máy RISC dựa chủ yếu trên một tập lệnh cho phép thực hiện kỹ thuật ống một cách thích hợp nhất bằng cách thiết kế các lệnh có chiều dài cố định, có dạng đơn giản,
dễ giải mã Máy RISC dùng kiểu thực hiện lệnh thanh ghi - thanh ghi Chỉ có các lệnh đọc/ghi ô nhớ mới được phép truy cập vào ô nhớ Nhìn chung, kiến trúc tập lệnh RISC có các tính chất sau:
Có một số ít lệnh (thông thường dưới 100 lệnh)
Có một số ít các kiểu định vị (thông thường hai kiểu: định vị tức thì
và định vị gián tiếp thông qua một thanh ghi)
Các lệnh đều có cùng chiều dài
Chỉ có các lệnh đọc/ghi ô nhớ mới được truy cập bộ nhớ
Dùng bộ tạo tín hiệu điều khiển bằng mạch điện để tránh chu kỳ giải
mã các vi lệnh làm cho thời gian thực hiện lệnh kéo dài
Bộ xử lý RISC có nhiều thanh ghi để giảm bớt việc truy cập vào bộ
nhớ trong
So sánh kiến trúc RISC và CISC
Sự khác biệt chính của hai kiến trúc này được tổng hợp trong Bảng 1.2 [18]
Trang 36Bảng 1.2 So sánh kiến trúc RISC và CISC
Có thể xử lý trực tiếp trên toán hạng bộ nhớ
Hình 1.19: Minh họa mã theo tác và các lệnh máy
Trang 371.1.7 Tổ chức và truy xuất bộ nhớ
a) Bộ nhớ và địa chỉ vật lý
Dưới khung nhìn lập trình, bộ nhớ vật lý là một chuỗi các phần tử nhớ liên tiếp có thứ tự tăng dần Mỗi phần tử có kích thước là một byte hoặc một từ 2 byte hoặc 4 byte tùy theo mỗi hệ thống máy tính Bộ nhớ có thể được địa chỉ hóa theo các từ nhớ, tuy nhiên trong hầu hết các hệ thống bộ nhớ được đánh địa chỉ theo byte Như vậy, có thể định nghĩa bộ nhớ là một chuỗi các byte nhớ, số thứ tự của byte chính là địa chỉ vật lý như mô tả trong Hình 1.20
Trang 38b) Định dạng nhóm byte trong bộ nhớ
Thuật ngữ endian được sử dụng để chỉ cách tổ chức thứ tự của các byte trong
một nhóm byte Như mô tả trong Hình 1.21, có hai kiểu định dạng là big endian và
litle endian:
Big endian: Trong định dạng big endian, byte có trọng số cao là byte có
số thứ tự thấp (byte đứng trước) Nghĩa là, khi lưu trữ trong bộ nhớ, byte
có địa chỉ thấp sẽ có trọng số cao vì byte có địa chỉ thấp đứng trước
Litle endian: Trong định dạng litle endian, byte có trọng số thấp đứng
trước Nghĩa là byte có trọng số thấp sẽ có địa chỉ thấp
Hình 1.21: Định dạng nhóm byte
1.2 Ngôn ngữ máy, hợp ngữ và ngôn ngữ bậc cao
a) Các mức máy
Theo khung nhìn kiến trúc, cách thức thực thi các chức năng, máy tính là một
hệ thống kết hợp phần cứng và phần mềm được chia thành các mức trừu tượng khác
nhau như mô tả trong Hình 1.22 Mức 0 là mức phần cứng – chính là máy tính vật lý
[11, 13] Ở mức này, máy tính là một tập hợp các mạch số; mỗi mạch số thực hiện
một chức năng cụ thể, có thể nằm trong hoặc ngoài vi xử lý Tuy nhiên, hầu hết mọi
mạch số thực hiện các thao tác dữ liệu, các tính toán đều được tích hợp trong vi xử
lý Có thể xem, vi xử lý như một bản mạch lớn – một kho chứa, tập trung các mạch
chức năng của máy tính như: mạch cộng, mạch nhân, mạch chia, mạch nạp dữ liệu
từ bộ nhớ vào vi xử lý, mạch ghi dữ liệu từ vi xử lý ra bộ nhớ, v.v Các mạch này
được tổ chức, sắp xếp trong vi xử lý theo một thứ tự xác định tùy thuộc vào nhà sản
xuất; số thứ tự của các mạch chức năng trong vi xử lý chính là mã thao tác Như mô
tả trong Mục 1.1.5, để lựa chọn và thực thi chính xác các mạch chức năng này,
trong khối điều khiển của vi xử lý có bộ giải mã lệnh – là một mạch số với N tín
hiệu đầu vào và 2 N tín hiệu đầu ra, trong đó chỉ có 1 tín hiệu đầu ra ở mức tích cực
còn 2 N – 1 tín hiệu còn lại ở mức không tích cực Số thứ tự của các đầu ra cũng
Trang 39chính là số thứ tự của các mạch chức năng và tín hiệu đầu ra của mạch giải mã chính là tín hiệu chọn chip của các mạch chức năng Việc thực thi trong máy tính mức cuối cùng chính là việc thực hiện các mạch chức năng này Do đó, có thể xem máy tính mức 0 chính là tập hợp các mạch số phần cứng nằm trong vi xử lý
Máy tính mức 1 là máy tính thực thi chương trình theo ngôn ngữ máy – hay
được xem như máy tính mức vi xử lý vì các câu lệnh máy được thực thi bên trong vi
xử lý Một câu lệnh máy là một chuỗi bit nhị phân (hoặc ở dạng hexa) bao gồm mã thao tác và các toán hạng Khi một lệnh máy chứa trong thanh ghi của vi xử lý và thực hiện, khối điều khiển của vi xử lý sẽ tách các bit mã phép toán để đưa vào mạch giải mã lệnh nhằm kích hoạt thực hiện mạch chức năng tương ứng Theo đó, nhiệm vụ của vi xử lý là ánh xạ lệnh máy đến mạch chức năng tương ứng dựa trên giải mã mã thao tác đã tách ra từ câu lệnh Để hiểu bản chất, lập trình viên cần phân biệt rõ: câu lệnh máy bao gồm mã thao tác và các toán hạng liên quan còn mã thao tác là một thành phần trong lệnh máy – chính là số thứ tự của các mạch chức năng trong vi xử lý
Máy tính mức 2 là máy tính hợp ngữ - nghĩa là máy tính thực thi các chương
trình hợp ngữ Hầu hết các câu lệnh hợp ngữ được ánh xạ 1 – 1 khi chuyển sang mã máy nên máy tính mức hợp ngữ cũng gắn với từng họ vi xử lý cụ thể Máy tính hợp ngữ là máy ảo ngay trên máy tính mức 1 Có thể xem, chương trình hợp ngữ được thực thi bởi máy ảo mức hợp ngữ nhưng thực chất chương trình hợp ngữ phải được biên dịch thành mã máy trước khi thực hiện
Máy tính mức 3 là máy ảo, trừu tượng chung cho máy tính thực thi chương
trình trong các ngôn ngữ bậc cao Tuy nhiên, trong quá trình dịch và thực hiện, bao giờ chương trình trong ngôn ngữ bậc cao cũng được chuyển thành chương trình hợp ngữ và chuyển thành chương trình mã máy để thực hiện
Căn cứ vào các mức máy, có thể mô hình máy ảo mức L như một bộ hai thành phần <I S , C> với I S là tập lệnh máy ảo – cho phép viết các chương trình trong
máy ảo và C là chương trình dịch – dịch chương trình máy ảo mức L thành chương trình mã máy ảo mức L – 1
Trang 40Hình 1.22: Các mức máy ảo
b) Ngôn ngữ máy
Định nghĩa 1.3 – Ngôn ngữ máy
Ngôn ngữ máy là một tập các lệnh máy ở dạng nhị phân được thực hiện trực tiếp bởi vi xử lý của máy tính; mỗi lệnh máy là một chuỗi bit nhị phân bao gồm mã thao tác và các toán hạng được cấu trúc theo kiến trúc của tập lệnh máy; mỗi mã máy chính là số thứ tự của các mạch chức năng trong vi xử lý
Do mỗi hãng sản xuất vi xử lý có cách tổ chức các mạch chức năng trong vi
xử lý khác nhau nên mỗi họ vi xử lý có tập lệnh máy riêng Tập lệnh máy được xây dựng theo một kiểu kiến trúc tập lệnh cụ thể Kiến trúc tập lệnh quy định chung về cấu trúc câu lệnh, độ dài các lệnh, mã hóa thanh ghi, các chế độ địa chỉ, v.v Có hai
kiểu kiến trúc tập lệnh điển hình là RISC và CISC [18] như đã mô tả trong Mục