Chuyển dữ liệu 16 bit hoặc nhỏ hơn

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

Chương 4. LẬP TRÌNH HỢP NGỮ ARM CƠ BẢN

4.2. Thao tác chuyển dữ liệu

4.2.1. Chuyển dữ liệu 16 bit hoặc nhỏ hơn

Ví dụ 4.5 – Chuyển nội dung 2 biến nhớ 16 bit

Chuyển nội dung của biến nhớ Value sang một biến nhớ 16 bit khác là Result.

 Đầu vào: Value = 123

 Đầu ra: Result = 123

Chương trình 4.1: 4.1_move.s

1 AREA RESET, DATA, READONLY

2 DCD 0x20001000

3 DCD Main

4 value DCD 123 5

6 AREA MYDATA, DATA, READWRITE 7 result DCD 0

8

9 AREA MYCODE, CODE, READONLY

10 ENTRY

11

12 Main

13 LDR R1, =value ;Lấy địa chỉ

14 LDRB R2, [R1] ;Nạp 1byte, địa chỉ chứa trong

;R1 vào R2

15 LDR R3, =result

16 STRB R2,[R3]

17 SWI &11

18

19 NOP

20

21 END

Chương trình này thực hiện hai bước đơn giản: (1) nạp nội dung của vùng nhớ 16 bit Value và thanh ghi R1, (2) lưu nội dung của R1 ra vùng nhớ 16 bit Result. Mặc dù chỉ thực hiện thao tác chuyển dữ liệu giữa hai vùng nhớ nhưng với kiến trúc RISC của AMR, chúng ta không thể chuyển trực tiếp mà phải nạp dữ liệu từ bộ nhớ vào thanh ghi rồi lưu lại từ thanh ghi ra bộ nhớ.

123

Ví dụ 4.6 – Tìm số bù 1

Tìm số bù 1 của số được lưu trong biến nhớ Value, kết quả lưu ra biến nhớ Result.

 Đầu vào: Value = C123

 Đầu ra: Result = FFFF3EDC Chương trình 4.2: 4.2_Bu1.s

1 AREA RESET, DATA, READONLY

2 DCD 0X20001000

3 DCD Main

4 value DCD 123 6

7 AREA MYDATA, DATA, READWRITE 8 result DCD 0

9

10 AREA MYCODE, CODE, READONLY 11

12 Main

13 LDR r1, =value ;Lấy địa chỉ

14 LDR r2, [r1] ;Nạp giá trị vào R2

15 MVN r2, r2 ;Thực hiện not R2 = not r2 16 LDR r3, =result ;Lấy địa chỉ của result

17 STR r2,[r3] ;Lưu kết quả

;R3 chứa địa chỉ của result

;Giá trị trong R2 được lưu ra result 18 SWI #11

19

20 NOP 21 END

Chương trình này giải quyết bài toán theo ba bước chính: (1) nạp nội dung của biến nhớ Value vào thanh ghi R1, (2) thực hiện phép đảo bit trên R1, (3) lưu giá trị của R1 ra biến nhớ Result.

Trong các thao tác chuyển dữ liệu, lập trình viên có thể sử dụng bất kỳ thanh ghi nào ngoại trừ R15 – con trỏ lệnh, chứa địa chỉ của câu lệnh tiếp theo sẽ thực hiện, R14 – thanh ghi liên kết giữa chương trình chính và chương trình con, và R13 – con trỏ ngăn xếp.

Toán tử LDR, STR có thể làm việc với các chế độ địa chỉ khác nhau. Trong chương trình, hai toán tử này làm việc theo chế độ địa chỉ tức thời – nghĩa là địa chỉ của biến nhớ Value và Result được chứa trực tiếp trong câu lệnh. Trong chế độ địa

124

chỉ tức thời, địa chỉ độ dời (ofset) của vùng nhớ tham chiếu phải nhỏ hơn 8. Nghĩa là chỉ cho phép nạp/ lưu tối đa 8 byte dữ liệu.

Ví dụ 4.7 – Chia biến nhớ 8 bit

Chia biến nhớ 8 bit Value (định dạng LSB) thành 2 phần 4 bit và lưu trữ vào biến nhớ 16 bit Result (định dạng MSB). 4 bit cao được lưu trữ trong byte thấp và 4 bit thấp được lưu trữ trong byte cao của biến nhớ Result.

 Đầu vào: Value = 5F

 Đầu ra: Result = 050F Chương trình 4.3: 4.3_Nibble.s

1 TTL Ch4Ex4.3 - nibble

2 AREA RESET, DATA, READONLY

3 DCD 0X20001000

4 DCD Main

5 Mask DCW &000F ; Mặt nạ bit = %0000000000001111

6 Value DCB &5F 7

8 AREA MYDATA, DATA, READWRITE 9 Result DCD 0;

10

11 AREA Program, CODE, READONLY

12 ENTRY

13 Main

14 LDR R1, Value ; Nạp địa chỉ vùng nhớ giá trị 15 LDR R2, Mask ; Nạp địa chỉ vùng mặt nạ bit 16 MOV R3, R1, LSR #0x4 ; Copy 4 bit cao vào R3 17 MOV R3, R3, LSL #0x8 ; Dịch trái 1 byte 18 AND R1, R1, R2 ; AND số với mặt nạ bit

19 ADD R1, R1, R3

20

21 LDR R5, =Result

22 STR R1, [R5] ; Lưu kết quả

23 SWI &11

25

26 END

Chương trình trên minh họa các thao tác xử lý dữ liệu theo byte. Mặc dù hầu hết các câu lệnh hợp ngữ ARM thực hiện các thao tác trên word (4 byte) nhưng lập trình viên có thể thực hiện thao tác trên byte bằng cách thêm hậu tố “B” vào mã lệnh. Ví dụ, lệnh LDR thường được sử dụng để nạp 4 byte nhớ vào trong thanh ghi còn lệnh LDRB sử dụng để nạp 1 byte nhớ vào thanh ghi. Ở đây, kích thước thanh

125

ghi trong ARM Cortex-M3 là 4 byte nên 1 byte bộ nhớ sẽ được nạp vào byte thấp của thanh ghi. Tương tự, lệnh STR sử dụng để lưu dữ liệu từ thanh ghi ra 4 byte bộ nhớ còn STRB sử dụng để lưu dữ liệu ra 1 byte bộ nhớ.

Ghi chú:

 Với ARM, lệnh MOV được sử dụng để lưu chuyển dữ liệu bên trong vi xử lý. Khác với vi xử lý 80x86, vì ARM sử dụng kiến trúc nạp/lưu trữ nên không sử dụng MOV để lưu chuyển dữ liệu giữa bộ nhớ và thanh ghi.

 Để cải tiến hiệu năng của chương trình, lập trình viên nên sử dụng thao tác trên thanh ghi và hạn chế sử dụng các thao tác truy cập bộ nhớ.

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

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

(280 trang)