Trong phần này, chúng ta sẽ tìm hiểu về pointer trong MIPS và cách dùng nó để truy vấn dữ liệu trong mảng.
Giới thiệu về pointer
Pointer là một loại biến đặc biệt trong lập trình, nó lưu trữ địa chỉ của một vùng nhớ khác. Pointer thường được sử dụng để truy cập và thao tác dữ liệu trên bộ nhớ.
Mối liên hệ giữa array và pointer trong MIPS
Trong MIPS, một mảng cũng có thể được biểu diễn bằng pointer. Mỗi phần tử trong mảng tương ứng với một địa chỉ trong bộ nhớ. Sử dụng pointer, ta có thể truy cập và thay đổi giá trị của các phần tử mảng.
Cách dùng pointer để truy xuất data từ word trong MIPS
Để truy xuất data từ word trong MIPS, ta cần sử dụng các hướng dẫn về con trỏ (pointer) như lw
(load word) và sw
(store word). Ví dụ, để load một từ từ địa chỉ được lưu trữ trong một con trỏ $t0
, ta có thể sử dụng lệnh sau:
lw $t1, 0($t0) # Load từ word từ địa chỉ $t0 và lưu vào $t1
Tương tự, để lưu một từ vào một địa chỉ được lưu trữ trong con trỏ $t0
, ta có thể sử dụng lệnh sau:
sw $t1, 0($t0) # Lưu từ word từ $t1 vào địa chỉ $t0
Ví dụ code mẫu
Dưới đây là một ví dụ về cách sử dụng pointer để truy cập và lặp qua một mảng trong MIPS:
.data array: .word 1, 2, 3, 4, 5 .text main: la $t0, array # $t0 là con trỏ trỏ tới ô array[0] li $t1, 20 # Khởi tạo $t1 bằng kích thước của mảng (4B x 5 = 20B) add $t2, $t0, $t1 # $t2 là con trỏ của array[length - 1] loop: slt $t3, $t0, $t2 # Nếu con trỏ t0 đang ở cuối mảng (t0 >= t2) thì t3 = 0 beq $t3, $0, exit # Nếu t3 = 0 thì thoát vòng lặp sw $0, 0($t0) # Lưu giá trị 0 vào ô array[i] addi $t0, $t0, 4 j loop exit: # Kết thúc chương trình
Giải thích
Trong đoạn code mẫu, chúng ta có một mảng array
chứa các giá trị số nguyên. Mục tiêu của chúng ta là gán giá trị 0 cho tất cả các phần tử trong mảng.
- Đầu tiên, chúng ta sử dụng lệnh
la
để gán địa chỉ củaarray
cho thanh ghi$t0
, tức là$t0
sẽ trỏ tới phần tử đầu tiên của mảng. - Tiếp theo, chúng ta sử dụng lệnh
li
để gán giá trị 20 cho thanh ghi$t1
. Giá trị này tương ứng với kích thước của mảng (4
byte/phần tử x5
phần tử =20
byte). - Lệnh
add
được sử dụng để tính địa chỉ của phần tử cuối cùng của mảng và lưu trữ vào thanh ghi$t2
. Bằngadd $t2, $t0, $t1
- Lệnh
slt
được sử dụng để so sánh địa chỉ hiện tại ($t0
) với địa chỉ cuối cùng của mảng ($t2
). Nếu$t0
không nhỏ hơn$t2
(tức là nằm ở cuối mảng), thanh ghi$t3
sẽ được đặt bằng 0. - Sử dụng lệnh
beq
, chúng ta kiểm tra giá trị của$t3
. Nếu$t3
bằng 0 (nghĩa là con trỏ$t0
đang ở cuối mảng), chương trình sẽ nhảy đến nhãnexit
và thoát khỏi vòng lặp. - Trong trường hợp con trỏ
$t0
không ở cuối mảng, chúng ta sử dụng lệnhsw
để lưu giá trị 0 vào ô nhớ mà$t0
đang trỏ tới. Sau đó, chúng ta tăng địa chỉ của$t0
lên 4 byte bằng lệnhaddi $t0, $t0, 4
, nhằm di chuyển con trỏ đến phần tử tiếp theo trong mảng. - Cuối cùng, chúng ta sử dụng lệnh nhảy
j
để quay lại nhãnloop
và tiếp tục vòng lặp.
Kết luận
Pointer là một công cụ quan trọng trong MIPS để truy cập và thao tác dữ liệu trên bộ nhớ. Việc sử dụng pointer cho phép ta linh hoạt truy xuất và thay đổi giá trị của các phần tử mảng. Bằng cách sử dụng các hướng dẫn như lw
và sw
, ta có thể truy xuất data từ word và thực hiện các xử lý phù hợp trong chương trình MIPS.
References: https://www.youtube.com/watch?v=sEYDvY0apRc