Di chuyển dữ liệu đa thanh ghi

Một phần của tài liệu Giáo trình Lập trình hợp ngữ (Trang 102 - 105)

3.5. Nhóm lệnh truy cập bộ nhớ

3.5.3. Di chuyển dữ liệu đa thanh ghi

Một trong những ưu điểm của kiến trúc ARM là nó cho phép đọc hoặc ghi vùng dữ liệu liên tục trong bộ nhớ. Các lệnh di chuyển dữ liệu đa thanh ghi có thể di chuyển lượng dữ liệu nhiều thanh ghi giữa bộ nhớ và CPU chỉ trong một lệnh. Việc truyền dữ liệu bắt đầu từ một thanh ghi nền Rn trỏ đến vị trí bắt đầu của bộ nhớ. Các câu lệnh truyền dữ liệu đa thanh ghi hiệu quả hơn việc truyền dữ liệu đơn thanh ghi khi phải lưu trữ cũng như hồi phục nội dung chương trình.

Cú pháp các câu lệnh được mô tả trong Bảng 3.14 theo các chế độ địa chỉ khác nhau như mô tả trong Bảng 3.15, và có cấu trúc chung như sau:

<LDM|STM> {<cond>} <addressing mode> Rn{!}, <register>{^}

Bảng 3.14. Cú pháp các câu lệnh truyền đa dữ liệu

LDM Nạp dữ liệu đa thanh ghi {Rd}*N <- mem32[địa chỉ bắt đầu + 4*N]

STM Lưu dữ liệu đa thanh ghi {Rd}*N -> mem32[địa chỉ bắt đầu + 4*N]

87

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

Chế độ địa chỉ

Mô tả Địa chỉ bắt đầu

Địa chỉ kết thúc

Rn!

IA Tăng sau Rn Rn + 4*N –

4

Rn + 4*N

IB Tăng trước Rn + 4 Rn + 4*N Rn + 4*N

DA Giảm sau Rn – 4*N +

4

Rn Rn – 4*N

DB Giảm trước Rn – 4*N Rn - 4 Rn – 4*N

Ngoài ra, các lệnh LDM và STM có thể được sử dụng mà không cần ghi ngược lại địa chỉ nền như mô tả trong Bảng 3.16.

Bảng 3.16. Các lệnh nạp/lưu trữ đa giá trị

Các lệnh nạp/ lưu trữ đa thanh ghi Mô tả

LDMIA Rn, <reg_list> Đọc nhiều từ bắt đầu từ ô nhớ chỉ đến bởi Rn. Địa chỉ tăng sau mỗi lần đọc.

LDMDB Rn, <reg_list> Đọc nhiều từ bắt đầu từ ô nhớ chỉ đến bởi Rn. Địa chỉ giảm sau mỗi lần đọc.

STMIA Rn, <reg_list> Ghi nhiều từ vào bộ nhớ bắt đầu từ Rn.

Địa chỉ tăng sau mỗi lần ghi.

STMDB Rn, <reg_list> Ghi nhiều từ vào ô nhớ trỏ đến bắt đầu từ Rn. Địa chỉ giảm sau mỗi lần ghi

<reglist> ở bảng trên là danh sách các thanh ghi. Nó bao gồm ít nhất một thanh ghi, đồng thời:

 Bắt đầu với {và kết thúc với}

 Sử dụng “-” để chỉ ra khoảng. Ví dụ R0 – R4 nghĩa là R0, R1, R2, R3 và R4.

 Sử dụng dấu phẩy (“,”) để phân tách các thanh ghi.

Ví dụ 3.16 – Đọc dữ liệu từ một miền địa chỉ

Câu lệnh đọc địa chỉ 0x20000000 cho đến 0x2000000F vào thanh ghi từ R0 đến R3 như sau:

LDR R4, =0x20000000 ; Đặt R4 = 0x20000000 (địa chỉ)

LDMIA R4, {R0-R3} ; Đọc 4 từ liên tiếp và lưu vào R0 – R3

88

Các thanh ghi có thể không liên tiếp, như {R1, R3, R5-R7, R9}, có nghĩa là R1, R3, R5, R6, R7, R9. Tương tự, với các lệnh nạp/lưu trữ khác, ta có thể cập nhật thanh ghi nền với STM và LDM. Ví dụ:

LDR R8, =0x8000 ; Thiết lập R8 = 0x8000 (địa chỉ)

STMIA R8!, {R0 – R3} ; R8 = 0x8010 sau khi lưu giá trị Các câu lệnh cho phép ghi ngược được liệt kê trong Bảng 3.17 dưới.

Bảng 3.17. Các lệnh nạp/ lưu giá trị vào bộ nhớ với ghi ngược

Nạp / Lưu trữ nhiều giá trị và ghi ngược

Mô tả

LDMIA Rn!, <reg_list> Đọc nhiều từ tại vị trí ô nhớ được trỏ đến bởi Rd. Địa chỉ tăng sau mỗi lần đọc. Rn được ghi ngược sau mỗi lần truyền giá trị thành công.

LDMDB Rn!, <reg_list> Đọc nhiều từ tại vị trí ô nhớ trỏ đến bởi Rd. Địa chỉ giảm trước mỗi lần đọc. Rn được ghi ngược sau khi truyền giá trị thành công.

STMIA Rn!, <reg_list> Ghi nhiều từ lên ô nhớ trỏ đến bởi Rd. Địa chỉ tăng sau mỗi lần ghi. Rn được ghi ngược sau mỗi lần truyền giá trị.

STMDB Rn!, <reg_list> Ghi nhiều từ lên ô nhớ trở đến bởi Rd. Địa chỉ giảm trước mỗi lần ghi. Rn được ghi ngược sau mỗi lần truyền giá trị.

Chú ý rằng phiên bản 16 bit của các lệnh LDM và STM chỉ giới hạn ở các thanh ghi thuộc bank thấp và luôn cho phép ghi ngược, ngoại trừ khi thanh ghi nền là thanh ghi đích để được cập nhật sau khi đọc bộ nhớ. Ta có thể xem thêm một số ví dụ về các lệnh LDM và STM. Thanh ghi R0 là thanh ghi cơ sở Rn và đằng sau có dấu !, chỉ ra rằng thanh ghi được cập nhật sau khi câu lệnh được thực hiện.

Ví dụ 3.17 – Minh họa cập nhật thanh ghi sau khi thực hiện lệnh PRE mem32[0x80018] = 0x03

Mem32[0x80014] = 0x02 Mem32[0x80010] = 0x01 R0 = 0x00080010

R1 = 0x00000000 R2 = 0x00000000 R3 = 0x00000000 LDMIA R0!, {R1 – R3}

POST R0 = 0x0008001C R1 = 0x00000001

89 R2 = 0x00000002 R3 = 0x00000003

Trong ví dụ này, thanh ghi cơ sở R0 trỏ đến địa chỉ 0x80010 ở điều kiện ban đầu. Địa chỉ ô nhớ 0x80010, 0x80014 và 0x80018 chứa các giá trị lần lượt là 1, 2 và 3. Sau khi lệnh được thực hiện, các thanh ghi R1, R2 và R3 chứa các giá trị như trong Hình 3.6.

a) Trước câu lệnh LDMIA

b) Sau câu lệnh LDMIA Hình 3.6: Mô tả câu lệnh LDMIA

Việc di chuyển dữ liệu từ bộ nhớ sang thanh ghi sử dụng lệnh đa dữ liệu sẽ tiết kiệm tài nguyên hơn khi CPU thực hiện chương trình.

Một phần của tài liệu Giáo trình Lập trình hợp ngữ (Trang 102 - 105)

Tải bản đầy đủ (PDF)

(280 trang)