3.7.4.2 .Trao đổi dữ liệu giữa ngăn xếp và thanh ghi
3.8. Các lệnh chỉ dẫn trong chƣơng trình
Align: Lệnh chỉ dẫn việc căn chỉnh vị trí ơ nhớ hiện tại theo một kích thƣớc nhất định bằng cách
chèn thêm các bit 0 vào ô nhớ. Cú pháp: Align {expr{,offset}}
Trong đó: expr là số byte đƣợc căn chỉnh. Nếu expr không đƣợc chỉ ra, Align sẽ căn chỉnh vị trí lệnh tại từ nhớ tiếp theo.
Offset chỉ ra độ lệch từ vị trí đƣợc chỉ ra bởi expr.
Lệnh Align cho phép căn chỉnh các địa chỉ của lệnh tiếp theo tới vị trí ơ nhớ (n*expr + offset), n là các giá trị 0, 1,…. Nếu expr không đƣợc chỉ ra, lệnh Align sẽ đặt lệnh tiếp theo ở vị trí từ nhớ tiếp theo tính từ lệnh trƣớc đó.
Ví dụ 1: Đoạn mã sau đây sử dụng 2 ô nhớ 1 byte gồm ô nhớ thứ nhất và ô nhớ thứ 4 trong 1 từ nhớ 4 byte để lƣu dữ liệu:
AREA OffsetExample, CODE Label DCB 0x5
ALIGN 4,3 ; ô nhớ tiếp theo là: 0*4 + 3 = 3 DCB 0x6
Nhãn Label là một mảng ô nhớ trong đó ô nhớ thứ nhất có giá trị là 5. Lệnh ALIGN 4,3 chỉ dẫn rằng lệnh tiếp theo đƣợc căn chỉnh 4 byte và cách ô nhớ trƣớc đó một đoạn 3 byte. Kết quả là lệnh DCB thứ hai đặt giá trị 0x6 vào byte cuối cùng của từ nhớ và giá trị 0 đƣợc chèn vào 2 byte giữa.
Ví dụ 2:
AREA OffsetExample1, CODE DCB 0x1
DCB 0x2 DCB 0x3
ALIGN 4,2 ; 1*4 + 2 DCB 0x4
Trong ví dụ 2, lệnh ALIGN chỉ dẫn lệnh tiếp theo đƣợc căn chỉnh 4 byte và lệch một đoạn 2 byte. Trong trƣờng hợp này, n = 1 vì 3 byte đầu của từ nhớ đã đƣợc sử dụng. Ngoài ra, giá trị 0 sẽ đƣợc chèn vào 3 byte tiếp theo lệnh DCB thứ 3.
52
1 2 3 0 0 0 4
Từ nhớ thứ 1 Từ nhớ thứ 2
Hình 3. 11 Căn chỉnh ơ nhớ
Việc sử dụng Align có mục đích:
- Đảm bảo các địa chỉ dữ liệu Thumb đƣợc căn chỉnh theo đúng kích thƣớc của từ nhớ. Ví dụ, lệnh Thumb ADR label chỉ nạp dữ liệu có kích thƣớc 4 byte. Tuy nhiên có thể nhãn label đặt tại vùng nhớ không đƣợc căn chỉnh 4 byte. Do đó, lệnh Align 4 phải đƣợc sử dụng để đảm bảo dữ liệu đƣợc nạp đúng.
- Một số vi xử lý ARM nhƣ ARM940T có bộ nhớ đệm dữ liệu là 16 byte. Khi đó lệnh
Align 16 đƣợc sử dụng để đảm bảo dữ liệu đƣợc nạp đúng và tăng hiệu quả của bộ nhớ
đệm.
- Lệnh LDRD và STRD dùng để trao đổi dữ liệu có kích thƣớc 8 byte. Do đó, lệnh Align 8 phải đƣợc sử dụng trƣớc lệnh DCQ để đảm bảo dữ liệu đƣợc truy cập khi sử dụng lệnh LDRD và STRD.
DCB: Lệnh chỉ dẫn vi xử lý phẩn bổ một hoặc nhiều byte của bộ nhớ để lƣu dữ liệu.
Cú pháp: {label} DCB expr{ ,expr}…
Trong đó: expr là số nguyên trong khoảng từ -128 đến 255 hoặc chuỗi ký tự. Các ký tự trong chuỗi đƣợc nạp vào các byte liên tiếp trong bộ nhớ.
Trong trƣờng hợp DCB đƣợc đặt trƣớc một lệnh, chỉ dẫn Align đƣợc sử dụng để đảm bảo lệnh đó đƣợc căn chỉnh đúng.
DCD: Lệnh chỉ dẫn vi xử lý phẩn bổ một hoặc nhiều từ nhớ (đƣợc căn chỉnh 4 byte) để lƣu dữ
liệu.
DCW: Lệnh chỉ dẫn vi xử lý phẩn bổ một hoặc nhiều nửa từ nhớ (đƣợc căn chỉnh 2 byte) để lƣu
dữ liệu.