Nhóm lệnh truyền dữ liệu giữa các thành phần bên trong vi xử lý

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

 Truyền dữ liệu giữa hai thanh ghi đa năng với nhau

 Truyền dữ liệu giữa một thanh ghi đa năng và một thanh ghi đặc biệt (CONTROL, PRIMASK, BASEPRI, FAULTMASK)

 Truyền một giá trị tức thời vào thanh ghi.

MOV là lệnh ARM đơn giản nhất. Chức năng của nó là sao chép N vào thanh ghi đích, với N có thể là một giá trị tức thời hay một thanh ghi. Lệnh này được dùng trong việc thiết lập giá trị ban đầu và chuyển dữ liệu giữa các thanh ghi.

Cú pháp: <instruction> {<cond>}{S} Rd, N

MOV Nạp một giá trị 32 bit vào trong thanh ghi Rd = N MVN Nạp NOT của giá trị 32 bit vào thanh ghi Rd = ~N

77

Bảng 3.4. Các câu lệnh truyền dữ liệu bên trong vi xử lý

Lệnh Đích Nguồn Thao tác

MOV R4, R0 Sao chép giá trị R0 vào R4

MOVS R4, R0 Chép giá trị R0 vào R4 và cập nhật cờ

MRS R7, PRIMASK Chép giá trị thanh ghi PRIMASK vào R7

MSR CONTROL, R2 Chép giá trị thanh ghi R2 vào CONTROL

MOV R3, #0x34 Thiết lập giá trị R3 = 0x34 MOVS R3, #0x34 Thiết lập giá trị R3 = 0x34

và cập nhật APSR MOVW R6, #0x1234 Thiết lập giá trị R6 =

0x1234

MOVT R6, #0x7865 Thiết lập 16 bit cao của thanh ghi R6 = 0x8765

MVN R3 R7 Chép giá trị R3 = -R7

Ví dụ 3.8 – minh họa lệnh MOV PRE R5 = 5

R7 = 8

MOV R7, R5 ; chép giá trị R5 vào R7 POST R5 = 5

R7 = 5

Ở đây, lệnh MOV sẽ sao chép nội dung của thanh ghi R5 sang thanh ghi R7.

Lệnh MOVS tương tự với lệnh MOV, điểm khác biệt ở đây là nó cập nhật các cờ trong thanh ghi xPSR, bằng cách sử dụng hậu tố “S”. Để nạp một giá trị trực tiếp 8 bit vào thanh ghi đa chức năng, lệnh MOVS là đủ và nó có thể được thực hiện với lệnh Thumb 16 bit nếu như thanh ghi đích thuộc dãy từ R0-R7. Để nạp một giá trị trực tiếp vào một thanh ghi từ R8 trở lên, hay nếu xPSR không được cập nhật, phiên bản 32 bit của lệnh MOV/MOVS sẽ được sử dụng.

Để nạp một giá trị trực tiếp lớn (giữa 9-bit và 16-bit), lệnh MOVW có thể được sử dụng. Phụ thuộc vào công cụ biên dịch hợp ngữ đang sử dụng, nó có thể tự động chuyển đổi MOV hay MOVS sang lệnh MOVW nếu như giá trị tức thời có giá trị giữa 9- bit và 16-bit.

Nếu ta cần nạp giá trị 32 bit vào thanh ghi, ta cần sử dụng cách khác. Một cách thường được sử dụng là dùng lệnh LDR như sau:

78

LDR R0, =0x12345678 ; R0 = 0x12345678

Trình hợp dịch sẽ quy đổi câu lệnh này sang lệnh truyền dữ liệu bộ nhớ và một đoạn dữ liệu bên trong chương trình:

LDR R0, [PC, #offset]

DCD 0x12345678

Lệnh LDR sẽ đọc bộ nhớ tại địa chỉ [PC + offset] và lưu giá trị đấy trong thanh ghi R0. Giá trị của thanh ghi PC không thực sự là địa chỉ của lệnh LDR.

Nếu như thao tác cần thay đổi giá trị của thanh ghi thành một địa chỉ trong vùng mã lệnh chương trình trong một khoảng xác định, ta có thể sử dụng lệnh ADR hay ADRL. Một cách khác để nạp các giá trị 32 bit là kết hợp giữa lệnh MOVW và lệnh MOVT.

Ví dụ 3.9 – Kết hợp lệnh MOVW và MOVT

MOVW R0, #0x789A ; Thiết lập R0 = 0x0000789A

MOVT R0, #0x3456 ; Thiết lập 16 bit cao của R0 = 0x3456

; bây giờ R0 = 0x3456789A

Khi so sánh phương pháp này với lệnh sử dụng LDR, LDR cho phép câu lệnh dễ đọc hơn, và trình biên dịch có thể giảm kích thước mã lệnh bằng cách dùng lại dữ liệu được tạo ra, nếu như cùng một giá trị hằng số được sử dụng ở nhiều điểm khác nhau trong đoạn mã lệnh. Tuy nhiên, phụ thuộc vào thiết kế bộ nhớ hệ thống, trong một vài trường hợp phương pháp kết hợp MOVW và MOWT sẽ cho mã lệnh có tốc độ xử lý nhanh hơn nếu như bộ nhớ đệm hệ thống được sử dụng và nếu lệnh LDR gặp trường hợp không tìm thấy dữ liệu trong bộ nhớ đệm.

Như đã trình bày ở trên, N có thể là thanh ghi hay giá trị tức thời. Tuy nhiên, N còn có thể là nội dung của một thanh ghi đã được tiền xử lý bởi bộ dịch bên trong CPU. Các lệnh gây thay đổi dữ liệu thường được xử lý bởi bộ ALU. Một tính năng đặc biệt của vi xử lý ARM là khả năng dịch các số 32 bit ở các thanh ghi nguồn đi một số nguyên sang trái hay phải trước khi dữ liệu đó được đưa vào bộ ALU. Việc này đặc biệt hiệu quả khi nạp các hằng số vào thanh ghi và thực hiện nhân/chia hai đối với giá trị trong thanh ghi.

79

Hình 3.4: Bộ dịch bit trong lõi vi xử lý

Các phép dịch được thực hiện bởi bộ dịch bao gồm dịch số học và dịch lôgic.

Bảng 3.5 sẽ tổng hợp các thao tác dịch bit có thể có và cú pháp của các lệnh dịch được mô tả trong Bảng 3.6.

Bảng 3.5. Các lệnh dịch bit

Mã gợi nhớ

Mô tả Dịch Kết quả Giới hạn

LSL Dịch trái lôgic

xLSLy x << y #0 – 31 LSR Dịch phải

lôgic

xLSRy (unsigned) x >> y #1 – 32 ASR Dịch phải

số học

xASRy (signed) x >> y #1 – 32 ROR Quay phải xRORy ((unsigned)x>>y|x<<(32-

y))

#1 – 31 RRX Quay phải

giữ dấu

xRRX (c flag <<31) | ((unsigned)x >>1 )

Không

80

Hình 3.5: Mô tả quá trình dịch trái

Bảng 3.6. Tổng hợp cú pháp các lệnh dịch

Thao tác dịch Cú pháp

Giá trị trực tiếp #immediate

Thanh ghi Rm

Dịch trái giá trị trực tiếp Rm, LSL #shift_imm

Dịch trái thanh ghi Rm, LSL Rs

Dịch phải giá trị trực tiếp Rm, LSR #shift_imm

Dịch phải thanh ghi Rm, LSR Rs

Dịch phải số học một giá trị trực tiếp Rm, ASR #shift_imm Dịch phải số học thanh ghi Rm, ASR Rs

Quay phải giá trị trực tiếp Rm, ROR #shift_imm

Quay phải thanh ghi Rm, ROR Rs

Quay phải giữ dấu Rm, RRX

Ví dụ 3.10 – Minh họa lệnh dịch PRE CPSR = nzcvqiFt_USER

R0 = 0x00000000 R1 = 0x80000004 MOVS R0, R1, LSL #1 POST CPSR = nzCvqiFt_USER

R0 = 0x00000008 R1 = 0x80000004

Ở ví dụ trên, thanh ghi R0 chứa giá trị của R1 sau khi đã được dịch trái 1 bit.

Đồng thời, cờ nhớ (C) được thiết lập do có bit S ở đằng sau câu lệnh MOV.

81

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

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

(280 trang)