Credit: https://bh-cookbook.github.io/mips-asm/the-stack-part-4.html
Chào mừng bạn đến với bài viết thứ 6 của loạt bài về Kiến trúc MIPS. Trong phần này, chúng ta sẽ tìm hiểu về ngăn xếp (stack) và cách sử dụng nó trong MIPS.
Giới thiệu về stack
Ngăn xếp (stack) là một cấu trúc dữ liệu được sử dụng trong lập trình để lưu trữ các giá trị tạm thời. Nó hoạt động theo nguyên tắc “last-in, first-out” (LIFO), có nghĩa là phần tử được đưa vào cuối cùng sẽ được lấy ra đầu tiên.
Thanh ghi $sp trong MIPS
Trong MIPS, thanh ghi $sp (stack pointer) được sử dụng để lưu trữ địa chỉ hiện tại của đỉnh ngăn xếp. Khi một giá trị được đưa vào ngăn xếp, giá trị của $sp sẽ giảm đi để trỏ đến vị trí mới nhất trên ngăn xếp.
Cách sử dụng stack trong MIPS với thanh ghi $sp
Để đẩy một giá trị vào ngăn xếp (push), chúng ta sử dụng lệnh sw
(store word) để lưu trữ giá trị từ một thanh ghi vào vị trí của $sp hiện tại. Sau đó, giá trị của $sp sẽ được giảm đi 4 byte để trỏ đến vị trí mới.
Để lấy một giá trị từ ngăn xếp (pop), chúng ta sử dụng lệnh lw
(load word) để tải giá trị từ vị trí của $sp hiện tại vào một thanh ghi. Sau đó, giá trị của $sp sẽ được tăng lên 4 byte để trỏ đến vị trí mới.
Ví dụ code mẫu
Dưới đây là một ví dụ code mẫu để minh họa cách sử dụng ngăn xếp trong MIPS:
# Khởi tạo giá trị của $sp li $sp, 0x7fffeffc # Push giá trị 10 vào ngăn xếp sw $t0, 0($sp) sub $sp, $sp, 4 # Push giá trị 20 vào ngăn xếp sw $t1, 0($sp) sub $sp, $sp, 4 # Pop giá trị khỏi ngăn xếp và lưu vào $t2 addi $sp, $sp, 4 lw $t2, 0($sp) # Pop giá trị khỏi ngăn xếp và lưu vào $t3 addi $sp, $sp, 4 lw $t3, 0($sp)
Kết luận
Trong phần này, chúng ta đã tìm hiểu về ngăn xếp và cách sử dụng nó trong MIPS. Thanh ghi $sp được sử dụng để trỏ đến vị trí hiện tại trên ngăn xếp và các lệnh sw
và lw
được sử dụng để đẩy và lấy giá trị từ ngăn xếp. Việc hiểu về cách hoạt động của ngăn xếp là rất quan trọng để xây dựng các chương trình MIPS hiệu quả và ổn định.