1
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
i
2.1.2.
2.1.3.
2.1.4.
2.1.5.
2.1.6.
Kiến trúc vi xử lý ARM ................................................................................. 37
Các chế độ hoạt động của vi xử lý lõi ARM.................................................. 40
Mơ hình bộ nhớ .............................................................................................. 42
Dải bit............................................................................................................. 49
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
ii
3.8.1.
3.8.2.
3.8.3.
3.9.
Ngắt mềm ..................................................................................................... 109
Lệnh cờ hiệu................................................................................................. 109
Thao tác với bộ đồng xử lý .......................................................................... 110
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
iii
5.1.1.
5.1.2.
5.1.3.
5.1.4.
5.1.5.
5.1.6.
5.2.
Cấu trúc mảng .............................................................................................. 183
Xử lý xâu...................................................................................................... 184
Bản ghi ......................................................................................................... 191
Danh sách ..................................................................................................... 192
Hàng đợi ....................................................................................................... 196
Ngăn xếp ...................................................................................................... 199
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 ngồ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
iv
THUẬT NGỮ VÀ TỪ VIẾT TẮT
Viết tắt
AHB-PPB
ALU
Tiếng Anh
Tiếng Việt
Advanced High – Performance Bus ngoại vi riêng, hiệu năng cao
Bus PPB
cải tiến
Arithmetic and Logic Unit
Bộ lôgic và số học
APB-PPB Advanced Peripheral Bus PPB
ARM
Bus ngoại vi riêng cải tiến
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
Computer
CPU
Center Processing Unit
DRAM
IC
IDE
IR
Dynamic
Memory
Instruction
Random
Set
Bộ xử lý trung tâm
Access
Intergrated Circuit
Intergrated
Environment
Máy tính với tập lệnh phức tạp
RAM động
Mạch tích hợp
Development
Mơi trường phát triển tích hợp
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
Controller
Interrupt 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
v
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
PSP
RISC
Reduced
Instruction
Set
Computer
Máy tính với tập lệnh rút gọn
ROM
Read Only Memory
Bộ nhớ chỉ đọc
ROM
Read Only Memory
Bộ nhớ chỉ đọc
SIMD
SLA
SRAM
VIC
Single Instruction – Multiple
Data
Đơn lệnh và đa luồng dữ liệu
System Level Architecture
Kiến trúc mức hệ thống
Static Random Access Memory
RAM tĩnh
Vectored Interrupt Controller
Bộ điều khiển ngắt vectơ
vi
BẢNG CÁC KÝ HIỆU
Ký hiệu
A
Mô tả
Danh sách
Ad
Địa chỉ của vectơ ngắt
ai
Phần tử thứ i trong danh sách
B
Cơ số
Bs
Địa chỉ cơ sở
BT
Địa chỉ tái định vị
C
Chương trình dịch
i
Chỉ số dịng của phần tử hiện tại trong mảng
IN
Số hiệu ngắt
IS
Tập lệnh máy ảo
j
Chỉ số cột của phần tử hiện tại trong mảng
L
Mức máy ảo
maxM
N
Kích thước tối đa của bộ nhớ vật lý
Số chân vào của bộ giải mã
NbCol
Số cột của mảng
NbRow
Số dòng của mảng
NI
Nmax
Số câu lệnh trong chương trình
Số hiệu ngắt lớn nhất
Ns
Số giai đoạn trong kiến trúc đường ống lệnh
Q
Hàng đợi
qi
Phần tử thứ i trong hàng đợi
S
Độ rộng của bus địa chỉ
ta
Thời gian thực hiện một lệnh
Ts
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
VO
Số thứ tự của chân ra kích hoạt của bộ giải mã
vii
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
Bảng 3.12. Các lệnh truy cập bộ nhớ với giá trị dịch thanh ghi -------------------------------- 84
viii
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
ix
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
x
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
xi
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
xii
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ả q 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 q 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 tố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
xiii
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
xiv
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
xv
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 tồ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 tồ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 tố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ả.
1
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
tồ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ề
2
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 chun 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
khung nhìn tổng thể về các mức kiến trúc, sau đó tập trung chuyên sâu vào kiến trúc
3
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
4
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 ngồ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.
5
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.
6
Hình 1.4: Máy tính theo khung nhìn người dùng
Hình 1.5: Tổ chức máy tính mức cao
7
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
bị ngoại vi
Bus địa chỉ: truyền tải các tín hiệu địa chỉ từ CPU đến bộ nhớ hoặc các
khối điều khiển thiết bị vào/ra
Bus điều khiển: truyền tín hiệu điều khiển từ CPU đến bộ nhớ, thiết bị
ngoại vi và truyền tín hiệu trạng thái từ bộ nhớ, thiết bị ngoại vi đến CPU.
Hạn chế của kiến trúc Von Neumann là tình trạng “thắt cổ chai” do mỗi thời
điểm chỉ có một câu lệnh thực hiện trong CPU và tốc độ thực hiện trong CPU nhanh
hơn nhiều so với tốc độ truy xuất bộ nhớ và thiết bị ngoại vi. Tình trạng này được
cải tiến dựa trên kỹ thuật tổ chức bộ nhớ đệm hoặc thực hiện cải tiến kiến trúc CPU
từ đơn lệnh thành đường ống lệnh hoặc kiến trúc siêu vô hướng.
8
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. tồ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
kiến trúc Harvard và Von Neumann.
9