Duy Nguyen Hoang A fully enthusiastic boy

MIPS Architecture Series – Phần 8: Pointer

3 min read

pointer mips

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ủa array 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ử x 5 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ằng add $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ãn exit 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ệnh sw để 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ệnh addi $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ãn loop 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ư lwsw, 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

Avatar photo
Duy Nguyen Hoang A fully enthusiastic boy

Leave a Reply

Your email address will not be published. Required fields are marked *