1. Trang chủ
  2. » Công Nghệ Thông Tin

Giáo trình Lập trình hợp ngữ

280 8 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Giáo Trình Lập Trình Hợp Ngữ
Định dạng
Số trang 280
Dung lượng 8,32 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 2

MỤ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 3

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

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 4

3.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 5

5.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 6

THUẬ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 7

PSP 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 8

max 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 9

DANH 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 10

Bả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 11

Bả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 12

DANH 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 13

Hì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 14

Hì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 15

Hì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 16

Hì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 17

MỞ ĐẦ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 18

Từ 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 19

Chươ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 20

mứ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 21

Hì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 22

Hì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 23

Hình 1.4: Máy tính theo khung nhìn người dùng

Trang 24

1.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 25

Hì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 26

Vớ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 27

c) 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 28

1.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 29

1.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 30

trườ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 31

d) 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 32

Hì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 36

Bả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 37

1.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 38

b) Đị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 39

chí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 40

Hì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

Ngày đăng: 29/09/2022, 12:31

HÌNH ẢNH LIÊN QUAN

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 - Giáo trình Lập trình hợp ngữ
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 (Trang 20)
Hình 1.3: Các thao tác trong máy tính - Giáo trình Lập trình hợp ngữ
Hình 1.3 Các thao tác trong máy tính (Trang 22)
Hình 1.4: Máy tính theo khung nhìn người dùng - Giáo trình Lập trình hợp ngữ
Hình 1.4 Máy tính theo khung nhìn người dùng (Trang 23)
Hình 1.5: Tổ chức máy tính mức cao - Giáo trình Lập trình hợp ngữ
Hình 1.5 Tổ chức máy tính mức cao (Trang 23)
Hình 1.7: Kiến trúc Harvard - Giáo trình Lập trình hợp ngữ
Hình 1.7 Kiến trúc Harvard (Trang 25)
Hình 1.8: So sánh kiến trúc Harvard và Von Neumann - Giáo trình Lập trình hợp ngữ
Hình 1.8 So sánh kiến trúc Harvard và Von Neumann (Trang 27)
Hình 1.15: Minh họa các giai đoạn thực hiện lệnh trong 80x86 - Giáo trình Lập trình hợp ngữ
Hình 1.15 Minh họa các giai đoạn thực hiện lệnh trong 80x86 (Trang 32)
Hình 1.22: Các mức máy ảo - Giáo trình Lập trình hợp ngữ
Hình 1.22 Các mức máy ảo (Trang 40)
Hình 1.24: Quy trình xây dựng chương trình hợp ngữ - Giáo trình Lập trình hợp ngữ
Hình 1.24 Quy trình xây dựng chương trình hợp ngữ (Trang 44)
Hình 1.25: Hợp dịch chéo và thực thi trong Ubuntu - Giáo trình Lập trình hợp ngữ
Hình 1.25 Hợp dịch chéo và thực thi trong Ubuntu (Trang 47)
Hình 1.26: Quá trình phát triển chéo với Keil uVision trong Windows - Giáo trình Lập trình hợp ngữ
Hình 1.26 Quá trình phát triển chéo với Keil uVision trong Windows (Trang 48)
Hình 2.2: Quá trình phát triển của vi xử lý ARM - Giáo trình Lập trình hợp ngữ
Hình 2.2 Quá trình phát triển của vi xử lý ARM (Trang 53)
Hình 2.3: Mô hình kiến trúc vi xử lý ARM - Giáo trình Lập trình hợp ngữ
Hình 2.3 Mô hình kiến trúc vi xử lý ARM (Trang 55)
Hình 2.5: Liên hệ giữa các chế độ và mức ưu tiên - Giáo trình Lập trình hợp ngữ
Hình 2.5 Liên hệ giữa các chế độ và mức ưu tiên (Trang 58)
Hình 2.6: Phân cấp bộ nhớ - Giáo trình Lập trình hợp ngữ
Hình 2.6 Phân cấp bộ nhớ (Trang 59)

🧩 Sản phẩm bạn có thể quan tâm