Commonly used assembly intructions in embedded

BIC R0, R0, #0xFF000000Lệnh BIC (Bit Clear) trong ngôn ngữ lập trình máy tính có tác dụng là thực hiện phép AND NOT giữa giá trị trong thanh ghi R0 và giá trị 0xFF000000. Kết quả của phép toán sẽ được lưu trữ trở lại trong thanh ghi R0.
Cụ thể, lệnh BIC trong trường hợp này sẽ tạo ra 1 giá trị mới bằng cách làm trừ đi các bit từ 24 đến 31 của giá trị trong thanh ghi R0.
Ví dụ: Nếu giá trị trong thanh ghi R0 là 0x12345678, thì sau khi thực hiện lệnh BIC, giá trị trong thanh ghi R0 sẽ trở thành 0x00340078.
B 0x300039CC ; <Gtm_Cmu_Init>+0x2CLệnh B trong ARM Assembly là lệnh chuyển hướng (branch). Nó sẽ chuyển đến địa chỉ mà được chỉ định trong địa chỉ đích (0x300039CC trong trường hợp này). Trong hầu hết các trường hợp, lệnh này sẽ được sử dụng để chuyển đến một địa chỉ khác trong chương trình, hoặc để chuyển đến một hàm khác.
Cần lưu ý rằng địa chỉ đích phải là một địa chỉ hợp lệ trong bộ nhớ của hệ thống và phải là một địa chỉ lẻ (địa chỉ chia hết cho 4 sẽ không hợp lệ).
Địa chỉ đích cũng có thể được biểu diễn dưới dạng một label trong chương trình, ví dụ như B Gtm_Cmu_Init+0x2C
LDRB R0, [R4, #16]LDRB là một lệnh đọc byte (8 bit) từ bộ nhớ và gán giá trị đó cho đối số R0. Trong câu lệnh này, R4 được sử dụng như một con trỏ tới vùng bộ nhớ và #16 là địa chỉ offset từ đầu vùng bộ nhớ mà byte cần đọc nằm. Ví dụ, nếu R4 trỏ tới đầu vùng bộ nhớ 0x20000000, thì byte cần đọc sẽ nằm tại địa chỉ 0x2000000F.
CMP R5, R0Lệnh CMP trong ngôn ngữ lập trình máy tính (assembly) được sử dụng để so sánh hai giá trị. Nó sẽ lấy hai giá trị được chỉ định là R5 và R0 và so sánh chúng. Kết quả của so sánh sẽ được lưu trữ trong các biến trạng thái của CPU (ví dụ như Z (zero) flag). So sánh này có thể được sử dụng để xác định xem hai giá trị có bằng nhau hay không, hoặc xem giá trị nào lớn hơn giá trị khác.
BCC 0x300039BA ; <Gtm_Cmu_Init>+0x1ALệnh “BCC” trong ngôn ngữ lập trình Assembly để thực hiện điều khiển rẽ nhánh (branch) khi trạng thái băm của đồng hồ “C” trong thanh ghi flag bằng 0. Trong câu lệnh này, nó sẽ kiểm tra trạng thái băm của đồng hồ “C” và nếu bằng 0, nó sẽ chuyển đến địa chỉ “0x300039BA” để thực hiện các lệnh tiếp theo. Nếu trạng thái băm của đồng hồ “C” không bằng 0, nó sẽ tiếp tục thực hiện các lệnh tiếp theo trong chương trình.
ADD.W R1, R0, R5, LSL #3Lệnh ADD.W trong ngôn ngữ lập trình Assembly trên ARM Cortex-M có nghĩa là cộng hai biến hoặc hằng số và lưu kết quả vào biến đầu tiên (R1 trong trường hợp này). Các toán tử LSL #3 có nghĩa là dịch trái bit của R5 3 bit và rồi cộng vào R0. Do đó, lệnh này có ý nghĩa là tính tổng của R0 và R5 dịch trái 3 bit và lưu kết quả vào R1.
STR.W R1, [R2, R0, LSL #2]Lệnh STR.W (Store Word) là lệnh lưu kết quả của toán tử R1 vào bộ nhớ tại địa chỉ mà R2 và R0 trỏ tới. Trong đó, R0 là số nguyên và R2 là địa chỉ bộ nhớ. Ngoài ra, lệnh còn có thêm tùy chọn LSL #3, tức là dịch trái bit của R0 3 lần rồi mới tính toán với R1 và lưu vào bộ nhớ.
STR R1, [R0, #4]Lệnh STR (Store Register) trong Assembly sẽ lưu giá trị của thanh ghi R1 vào vùng bộ nhớ mà địa chỉ của nó được xác định bởi thanh ghi R0 và hằng số #4.
Cụ thể, lệnh STR R1, [R0, #4] sẽ lưu giá trị trong thanh ghi R1 vào vùng bộ nhớ tại địa chỉ bộ nhớ (R0 + #4). Nếu R0 chứa giá trị 0x1000, thì giá trị trong thanh ghi R1 sẽ được lưu tại địa chỉ bộ nhớ 0x1004.
Lệnh này thường được sử dụng để lưu giá trị của một thanh ghi vào vùng bộ nhớ để lưu trữ hoặc truyền dữ liệu giữa các hàm hay vùng bộ nhớ khác nhau.
AND R0, R0, #1Lệnh AND trong assembly sẽ thực hiện phép AND bitwise giữa hai biến (hoặc biến và hằng số). Trong ví dụ của bạn, nó sẽ lấy giá trị của biến R0 và chỉ lấy bit đầu tiên của nó (bit thứ 0) và gán kết quả vào biến R0.
Ví dụ:
Nếu R0 = 5 (binary 101), thì kết quả của lệnh AND sẽ là R0 = 1 (binary 001).
Nếu R0 = 6 (binary 110), thì kết quả của lệnh AND sẽ là R0 = 0 (binary 000).
MOV.W R3, #0x41000000
LSLS R2, R2, #8
ADD.W R0, R3, R0, LSL #17
AND R2, R2, #0x0F00
PUSH {R4, LR}
B 0x3000049A
Dòng code trên là một tập hợp các lệnh assembly cho một máy tính với bộ xử lý ARM. Dưới đây là một giải thích ngắn gọn về những gì mỗi lệnh làm:
MOV.W R3, #0x41000000: Lệnh này chuyển giá trị tạm thời 0x41000000 (tương đương với 4.294.967.296 trong hệ thập phân) vào đăng ký R3.
LSLS R2, R2, #8 : lệnh này sẽ dịch trái nội dung của đăng ký R2 8 bit, và lưu kết quả vào R2.
ADD.W R0, R3, R0, LSL #17: Lệnh này cộng nội dung của R3 và R0 sau khi R0 được dịch trái 17 bit. Kết quả được lưu trong R0.
AND R2, R2, #0x0F00: Lệnh này thực hiện một hoạt động AND bitwise giữa nội dung của R2 và giá trị tạm thời 0x0F00 (tương đương với 3840 trong hệ thập phân). Kết quả được lưu trong R2.
PUSH {R4, LR}: Lệnh này đẩy nội dung của đăng ký R4 và LR lên ngăn xếp.
B 0x3000049A : Lệnh này sẽ nhảy đến địa chỉ được chỉ định, 0x3000049A
lưu ý là đoạn code này có thể không có nghĩa và c

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *