TRƯỜNG ĐẠI HỌC HÀNG HẢI VIỆT NAM
BÁO CÁO BÀI TẬP LỚN
MÔN HỌC KIẾN TRÚC MÁY TÍNH TIÊN TIÊN
Đề tài: TÌM HIỂU KIẾN TRÚC MIPS
GVHD : TS. Nguyễn Trọng Đức
Nhóm 01 : Lê Hoàng Dương
Lê Quyết Tiến
Đặng Trung Hiếu
Nguyễn Hoàng Thùy Trang
Bùi Thị Hương
Hải Phòng, tháng 5 năm 2014
CHƯƠNG I: KIẾN TRÚC CISC VÀ RISC
1.1. Kiến trúc CISC
CISC (Complex Instruction Set Computer) - Kiến trúc với tập lệnh phức tạp
được nghĩ ra từ những năm 1960. Vào thời kỳ này, người ta nhận thấy các chương
trình dịch khó dùng các thanh ghi, và các vi lệnh thì được thực hiện nhanh hơn các
lệnh đồng thời phải làm giảm độ dài các chương trình. Các đặc tính này khiến người
ta ưu tiên chọn các kiểu ô nhớ - ô nhớ và ô nhớ - thanh ghi, với những lệnh phức
tạp và dùng nhiều kiểu định vị. Điều này dẫn tới việc các lệnh có chiều dài thay đổi
và như thế thì dùng bộ điều khiển vi chương trình (Microprogramme) là hiệu quả
nhất.
Một số đặc điểm của kiến trúc CISC:
- Lệnh có độ dài thay đổi, phức tạp, có thể bao gồm một vài phép toán nhỏ,
tuy nhiên lệnh của CISC gần với ngôn ngữ lập trình bậc cao.
- Có nhiều chế độ địa chỉ phức tạp.
- Hỗ trợ các loại dữ liệu phức tạp.
- Một lệnh có thể được thực hiện trên nhiều chu kỳ.
- Sử dụng kỹ thuật điều khiển vi chương trình.
Bộ xử lý IBM 370/168 DEC 11/780 iAPX 432
Năm sản xuất 1973 1978 1982
qua chuỗi lệnh số học và lệnh nạp/ghi.
- Thuận tiện cho việc thiết kế song song.
- Chú trọng các thao tác với thanh ghi.
Bộ xử lý IBM 801 RISC1 MIPS
Năm sản xuất 1980 1982 1983
Số lệnh 120 39 55
Dung lượng bộ nhớ vi
chương trình
0 0 0
Độ dài lệnh (tính bằng
bit)
32 32 32
Kỹ thuật chế tạo ECL MSI NMOS VLSI NMOS VLSI
Cách thực hiện lệnh Thanh ghi-thanh ghi Thanh ghi-thanh ghi Thanh ghi-thanh ghi
Hình 1.1 Thông số một vài máy RISC
1.3. So sánh giữa CISC và RISC
RISC CISC
Ưu điểm
- Diện tích của bộ xử lý dùng cho
bộ điều khiển giảm từ 60% (cho
các bộ xử lý CISC) xuống còn 10%
(cho các bộ xử lý RISC). Như vậy
có thể tích hợp thêm vào bên trong
bộ xử lý các thanh ghi, các cổng
vào ra và bộ nhớ cache.
- Tốc độ tính toán cao nhờ vào việc
giải mã lệnh đơn giản, nhờ có
nhiều thanh ghi (ít thâm nhập bộ
nhớ), và nhờ thực hiện kỹ thuật ống
dẫn liên tục và có hiệu quả (các
phải dùng nhiều lệnh để làm một
công việc nhất định.
- Cần thiết phải tính các địa chỉ
hiệu dụng vì không có nhiều cách
- Diện tích của bộ xử lý dùng cho bộ
điều khiển lớn. Giảm khả năng tích hợp
thêm vào vi xử lý.
- Tốc độ tính toán còn chậm. Thời gian
xây dựng xong bộ vi xử lý là lâu hơn
do các câu lệnh phức tạp nên khả năng
định vị.
- Tập lệnh có ít lệnh nên các lệnh
không có sẵn phải được thay thế
bằng một chuỗi lệnh của bộ xử lý
RISC.
- Các chương trình dịch gặp nhiều
khó khăn vì có ít lệnh làm cho có ít
lựa chọn để diễn dịch các cấu trúc
của chương trình gốc. Sự cứng
nhắc của kỹ thuật ống dẫn cũng gây
khó khăn.
- Có ít lệnh trợ giúp cho ngôn ngữ
cấp cao.
xảy ra rủi ro nhiều.
CHƯƠNG II: KIẾN TRÚC MIPS
2.1. Giới thiệu về MIPS:
MIPS - Microprocessor without Interlocked Pipeline Stages: là một kiến
trúc xử lý kiểu RISC được phát triển bởi công ty MIPS technologies. Các bộ xử lý
MIPS được phát triển như là một phần của chương trình nghiên cứu VLSI ở trường
đại học Stanford đầu những năm 80. Năm 1984, Hennessy rời khỏi trường Stanford
quyền: Đưa ra một tập các môi trường đảm bảo cho ISA hoạt động. PRA
cung cấp các cơ chế cần thiết để quản lý các tài nguyên của bộ xử lý: bộ nhớ
ảo, cache, các ngoại lệ…
• MIPS application specific extension(ASE)-Các thành phần mở rộng tùy
chọn cho ứng dụng: Cung cấp các chức năng nâng cao được thiết kế riêng
biệt cho các chức năng khác nhau.
• MIPS user defined instruction (UDI)-Câu lệnh được người dùng định
nghĩa: Đây là các câu lệnh đặc biệt cho các ứng dụng khác nhau với các mục
đích khác nhau khi một bộ xử lý áp dụng kiến trúc MIPS.
Trên thực tế máy tính làm việc thông qua việc lấy lệnh ngôn ngữ máy từ bộ nhớ,
giải mã và tính toán chúng. Ngôn ngữ máy và các giá trị sẽ được tính toán và mã
hóa thành mã nhị phân. Máy tính chỉ làm việc với các giá trị nhị phân, để thực hiện
xây dựng một kiến trúc máy tính sử dụng kiến trúc MIPS thì các thành phần cơ bản
phải bao gồm là:
o Program counter (PC): con trỏ chương trình.
o Memory : Bộ nhớ.
o Instruction Register: tập các thanh ghi lệnh.
o Register File: tập các thanh ghi.
o ALU: Khối đơn vị số học và logic.
o CU: khối đợn vị kiểm soát
Tất cả các thành phần ngoại trừ CU, thì đều được kết nối với nhau bằng Bus. Hầu
hết các bus của kiến trúc Mips đều có kích thước 32-bits. Dưới đây là một minh họa
về thành phần và đường đi của dữ liệu trong kiến trúc MIPS. Ngày nay việc cài đặt
theo kỹ thuật đường ống (Pipeline) và siêu vô hướng (Superscalar) là chung nhất
cho các bộ xử lý hiệu năng cao.
Hình 2.1 Thành phần và đường đi dữ liệu trong kiến trúc MIPS
2.3. Tập các thanh ghi trong kiến trúc MIPS:
Kiến trúc MIPS cung cấp một tập hợp gồm các thanh ghi chung, các thanh
ghi dấu phẩy động FPU, thanh ghi chương trình (hay còn được gọi là con trỏ
chương trình PC), và các thanh ghi đặc biệt HI, LO. Kích thước của thanh ghi trong
function call)
Địa chỉ trả về
- Thanh ghi zero( có tên là $zero:) chứa giá trị 0, không có một giá trị nào được ghi
vào thanh ghi zero.
- Thanh ghi 1( có tên là $at): được gọi cho hợp ngữ tạm thời, thanh ghi này dành
cho tính toán các lệnh marco, và không nên được sử dụng cho các chương trình hợp
ngữ.
- Các thanh ghi $k0 và $k1: được sử dụng bởi các nhân( kernel) của hệ điều hành,
và không nên bị thay đổi bởi chương trình người dùng.
- Thanh ghi cuối cùng $31 ($ra): được sử dụng giống như là một thanh ghi liên kết
bởi lệnh nhảy và lệnh liên kết, cái mà sẽ được sử dụng để gọi một thủ tục. Thanh
ghi $31 được sử dụng để ghi nhớ địa chỉ trả về của một thủ tục được gọi.
- Các thanh ghi $v0 và $v1: dùng để lưu trữ giá trị trả về của hàm.
- Các thanh ghi $t0-$t9: là các thanh ghi có nhớ lời gọi, dùng cho các giá trị tạm
thời mà không cần phải nhớ mỗi khi có lời gọi.
- Các thanh ghi $s0-$s7: là các thanh ghi có nhớ lời gọi, dùng cho các giá trị
không thay đổi mỗi khi có lời gọi.
- Thanh ghi $sp: là con trỏ stack, trỏ tới đỉnh của một stack.
- Thanh ghi $rp: là con trỏ frame.
- Thanh ghi $ra: ghi lại địa chỉ trả về mỗi khi có lời gọi hàm.
- Thanh ghi $gp: là con trỏ toàn cục trỏ tới vị trí giữa của khối bộ nhớ 64K vùng
heap, nơi chứa các biến và hằng số toàn cục.
2.3.1.2. Thanh ghi đặc biệt (2 thanh ghi)
Hai thanh ghi đặc biệt được gọi là thanh ghi HI và thanh ghi LO, chúng được
sử dụng để kiểm soát kết quả của một lệnh thực hiện nhân hoặc chia số nguyên.
Thao tác nhân của MIPS có kết quả chứa trong 2 thanh ghi HI và LO. Bit 0-31
thuộc LO và 32-63 thuộc HI.
2.3.1.3. Thanh ghi chương trình(PC)
Sau khi một chương trình được viết như là một chương trình bằng ngôn ngữ
hợp ngữ sử dụng một trình tạo văn bản, chương trình được chuyển thành mã máy
S (bit dấu) Phần mũ Phần lẻ
1bit 11 bit 52 bit
- Số dấu chấm động đơn kẹp đôi (kiểu PS) 64-bits:
S Phần mũ Phần lẻ S phần mũ phần lẻ
1 bit 8 bit 23 bit 1 bit 8 bit 23 bit
Các định dạng số dấu chấm tĩnh hỗ trợ bởi FPU:
- Kiểu Word 32-bits:
S Interger
1 bit 31 bit
- Kiểu LongWord (kiểu L) 64-bits:
S Interger
1 bit 63 bit
2.3.2.2. Các thanh ghi đa năng
Trong phiên bản 1 của kiến trúc số dấu chấm động chỉ có trong kiến trúc
MIPS64 nhưng ở phiên bản 2 thì chúng được hỗ trợ trong cả kiến trúc MIPS32.
FPU 32-bits có 32 thanh ghi 32-bits FPRs, mỗi thanh chứa một kiểu dữ liệu
32 bits. Kiểu xác định kép (Double-pricesion-kiểu D) được lưu trữ trong các cặp
thanh ghi chẵn, lẻ của FPRs, còn số nguyên dài (kiểu L) và kiểu Paired single (kiểu
PS) thì không được hỗ trợ.
FPU 64-bits có 32 thanh ghi 64 bits số dấu chấm động, mỗi thanh ghi có thể
chứa mọi kiểu dữ liệu. Để tương thích với FPU 32-bits, bit FR trong thanh ghi CP0
Status được sử dụng trong MIPS64 phiên bản 1 hoặc bất kỳ bộ xử lý phiên bản 2
nào hỗ trợ FPU 64-bits để điểu chỉnh FPU sang trạng thái mà các thanh ghi FPRs
được coi như các thanh ghi 32 bits, và sẽ lưu trữ các kiểu dữ liệu giống FPRs 32-
bits.
o FR =0 : chế độ 64-bits
o FR =1 : chế độ 32-bits. Khi đó chỉ 32 bits đầu được sử dụng, 32 bits sau
không dùng.
Hình 2.3. Thanh ghi đa năng
2.3.2.3. Các thanh ghi điều khiển
word và Doubleword có thể được thiết lập theo kiểu đầu to (big-endian) hoặc kiểu
đầu nhỏ (little-endian). Khi mà bộ xử lí được thiết lập theo kiểu đầu to, thì byte số
0 là byte có ý nghĩa cao nhất và ngược lại, đối với kiểu đầu nhỏ thì byte số 0 là
byte có ý nghĩa thấp nhất.
Hình 2.4. Kiểu big-endian trong kiểu dữ liệu Word (32-bits)
Hình 2.5. Kiểu little-endian trong kiểu dữ liệu Word (32-bits)
Hình 2.6: Dữ liệu kiểu đầu nhỏ trong Doubleword.
Hình 2.7. Dữ liệu đầu to trong Doubleword
2.5.2. Cách thức đánh địa chỉ:
Kiến trúc MIPS được biết đến với tập lệnh máy tính đơn giản nên các nhà
thiết kế kiến trúc MIPS đã cung cấp cho chúng ta một tập hợp các lệnh cơ bản.
Trong trường hợp muốn gọi một giá trị từ bộ nhớ chính hoặc ghi một giá trị vào bộ
nhớ chính, chỉ một phương thức đánh địa chỉ được cài đặt trong phần cứng của máy
tính. Phương pháp đánh địa chỉ này được hiểu như là phương pháp đổi chỗ nhiều
địa chỉ cơ sở. Phương thức đánh địa chỉ đưa ra cách thức để biết được làm thế nào
mà một toán hạng được xác định.
Như chúng ta đã biết thì đối với một toán hạng nó có thể có 3 vị trí: trong
thanh ghi, trong bộ nhớ, hoặc nằm ngay trong phần của câu lệnh và được hiểu như
là một hắng số. Việc xác định một hằng số được coi như một toán hạng gọi là
phương thức đánh địa chỉ tức thời. Tương tự như vậy, việc xác định một toán
hạnh được lưu trong thanh ghi gọi là phương thức đánh địa chỉ thanh ghi. Mọi bộ
xử lý đều chấp nhận hai phương thức đánh địa chỉ này. Sự khác nhau giữa bộ xử lí
RISC và CISC là làm thế nào chúng xác định được một toán hạng trong bộ nhớ.
Việc thiết kế CISC tập trung vào sự biến đổi rộng rãi của phương thức đánh địa chỉ
bộ nhớ. Còn việc thiết kế RISC chỉ chấp nhận duy nhất một hoặc nhiều nhất là hai
kiểu phương thức đánh địa chỉ trong câu lệnh nạp và ghi bộ nhớ. Tất cả các kiến
trúc MIPS chấp nhận hai phương thức đánh địa chỉ sau đây:
• Địa chỉ của toán hạng được tính toán bởi phép cộng nội dung của một thanh
ghi và một hằng số. Nếu như là hằng số bằng 0, nội dung của thanh ghi được
xử lý giống như là địa chỉ của một toán hạng. Trong phương thức này, địa
cấu trúc tập lệnh của MIPS32.
3.1. Nguyên tắc thiết kế tập lệnh MIPS
Tính đơn giản quan trọng hơn tính quy tắc:
- Chỉ thị lệnh có kích thước cố định: 32 bits với MIPS32 và 64 bits với
MIPS64.
- Ít định dạng chỉ thị lệnh: 3 loại định dạng.
- Mã lệnh ở vị trí cố định: 6 bit đầu.
Càng nhỏ thì xử lý càng nhanh:
- Số chỉ thị lệnh giới hạn.
- Số thanh ghi giới hạn.
Tăng tốc độ xử lý cho những trường hợp thường xuyên xảy ra:
- Các toán hạng số học lấy từ thanh ghi (dựa trên cơ chế load/store).
- Các chỉ thị lệnh có thể chứa toán hạng trực tiếp.
Thiết kế đòi hỏi sự thỏa hiệp tốt:
- 3 loại định dạng chỉ thị lệnh.
3.2. Các cấu trúc lệnh trong MIPS
3.2.1. Cấu trúc lệnh R-Format (Register)
- Cấu trúc lệnh:
- Các trường được sử dụng:
Trường Độ dài Ý nghĩa
opcode 6 bit Mã thao tác, cho biết lệnh làm gì
rd (Destination Register) 5 bit Thanh ghi đích, dùng để chứa kết quả của lệnh
rs (Source Register) 5 bit
Thanh ghi nguồn, dùng để chứa toán hạng
nguồn thứ nhất
rt (Target Register) 5 bit
Thanh ghi nguồn, dùng để chứa toán hạng
nguồn thứ hai
sa (shamt) 5 bit
Chứa số bit cần dịch trong các lệnh dịch, nếu
cơ sở ra rs nhằm phục vụ truy xuất bộ nhớ
trong lệnh lw và sw
- Các lệnh sử dụng cấu trúc này:
+ Sử dụng trong các trường hợp nạp/ghi dữ liệu và làm việc với hằng số. Một số
lệnh: lw, sw, lb, sb, lh, sh, addi, andi, ori, lui (sử dụng trong trường hợp thao tác với
hằng số 32 bit),…
+ Sử dụng trong trường hợp lệnh rẽ nhánh có điều kiện: beq, bne. Lúc này thì
trường immediate không chứa địa chỉ nhãn sẽ nhảy đến mà sẽ chứa khoảng cách so
với địa chỉ nằm trong thanh ghi PC (Program Counter) – thanh ghi chứa địa chỉ lệnh
đang được thực hiện. Tuy nhiên mỗi lệnh trong MIPS có kích thước 1 từ nhớ (32
bit) và MIPS truy xuất bộ nhớ theo nguyên tắc Alignment Restriction, do đó đơn vị
của immediate là từ nhớ. Cách tính địa chỉ rẽ nhánh có thể hiểu như sau:
Nếu không thực hiện rẽ nhánh: PC = PC + 4 (PC + 4: địa chỉ của lệnh kế tiếp trong
bộ nhớ)
Nếu thực hiện rẽ nhánh: PC = (PC + 4) + (immediate * 4)
Immediate: cho biết số lệnh cần nhảy qua để tới nhãn.
3.2.3. Cấu trúc J-Format (Jump)
- Cấu trúc lệnh:
- Các trường được sử dụng:
Trường Độ dài Ý nghĩa
opcode 6 bit Mã thao tác, cho biết lệnh làm gì
target address 26 bit Địa chỉ đích nhảy đến
- Các lệnh sử dụng cấu trúc này: cấu trúc lệnh J-Format được sử dụng chủ yếu
trong các lệnh nhảy: j, jr, jal,…
3.3. Các lệnh cơ bản trong kiến trúc MIPS
3.3.1. Các lệnh nạp/ghi (load/store)
- Đây là các lệnh duy nhất được phép truy xuất bộ nhớ trong tập lệnh của
MIPS. Các lệnh nạp và ghi (Load and Store Instructions) là các lệnh di chuyển dữ
liệu giữ bộ nhớ và các thanh ghi chung. Chúng đều là các lệnh có định dạng kiểu
immediate (I-type), do đó phương thức đánh địa chỉ duy nhất được hỗ trợ là thanh
Sw (Store word) sw $s1,0xFD
Lưu trữ word trong thanh ghi tới
địa chỉ 0xFD
Swl (Store word left) swl $s1,0xFD
Lưu trữ halfword cao trong
thanh ghi $s1 tới địa chỉ 0xFD
Swr (Store word right) swr $s1,0xFD
Lưu trữ halfword thấp trong
thanh ghi $s1 tới địa chỉ 0xFD
3.3.2. Các lệnh số học, logic và lệnh dịch
Các lệnh điện toán (Computational Instructions) thực hiện các phép tính số
học, logic, dịch chuyển, nhân, và chia trên các giá trị của các thanh ghi. Các lệnh
này bao gồm lệnh định dạng kiểu thanh ghi (kiểu R-type, trong đó đã bao gồm đồng
thời các toán hạng và kết quả được lưu trữ trong các thanh ghi) và định dạng kiểu
immediate (I-type, trong đó đã bao gồm một toán hạng có là một giá trị định dạng
immediate với 16 bit).
3.3.2.1. Lệnh số học
Cú pháp:
Opt opr, opr1,opr2
Opt – tên thao tác
Opr – Thanh ghi chứa kết quả
Opr1 – Thanh ghi (toán hạng nguồn thứ nhất)
Opr2 – Thanh ghi hoặc hằng số (toán hạng nguồn thứ hai)
- 8 thanh ghi thường được sử dụng để thực hiện các phép tính được đánh số từ $16
đến $23 ~ $s0 đến $s7
- 8 thanh ghi thường được sử dụng để lưu trữ tạm thời kết quả các phép toán được
đánh số từ $8 đến $15 ~ $t0 đến $t7
- Để thực hiện phép gán trong MIPS sẽ cho cộng giá trị cần gán với thanh ghi zero:
Add $s0,$s1,$0 hoặc add $s0,$s1,$zero
Câu lệnh Ví dụ Ý nghĩa
÷
$s2
$hi=$s1 mod $s2
$hi=$s1
÷
$s2
$hi=$s1 mod $s2
3.3.3.2. Các lệnh logic
Cú pháp:
Opt opr, opr1,opr2
Opt – tên thao tác
Opr – Thanh ghi chứa kết quả (toán hạng đích)
Opr1 – Thanh ghi (toán hạng nguồn thứ nhất)
Opr2 – Thanh ghi hoặc hằng số (toán hạng nguồn thứ hai)
- Các lệnh and, or, nor: toán hạng nguồn thứ 2 phải là thanh ghi.
- Không tồn tại lệnh not mà sử dụng nor thay cho not: A nor 0 = not (A or 0) = not
A
- Phép and thường được sử dụng trong việc chuyển đổi ký tự thường thành ký tự
hoa, ký tự số thành số thông qua kỹ thuật mặt nạ.
Câu lệnh Ví dụ Ý nghĩa
AND and $s1,$s2,$s3 $s1=$s2 /\ $s3
AND immediate andi $s1,$s2,0xFD $s1=$s2 /\ 0xFD
NOR nor $s1,$s2,$s3 $s1= ¬($s2 \/ $s3 )
NOT* not $s1,$s2 $s1= ¬ $s2
OR or $s1,$s2,$s3 $s1=$s2 \/ $s3
OR immediate ori $s1,$s2,0xFD $s1=$s2 /\ 0xFD
Exclusive OR xor $s1,$s2,$s3
$s1=$s2
⊕
$s3
$s1 = 0000 0000 0000 0000 0000 0000 0001 0101 = 21
(85/2
2
)
sra $s1, $s2, 2 # dịch phải số học $s2 2 bít
$s2 = 1111 1111 1111 1111 1111 1111 1111 0000 = -16
$s1 = 1111 1111 1111 1111 1111 1111 1100 0000 = -4
(-16/2
2
)
3.3.3. Các lệnh nhảy và rẽ nhánh
Các lệnh nhảy và rẽ nhánh (Jump and Branch Instructions) là các lệnh thay đổi
dòng kiểm soát của một chương trình. Lệnh rẽ nhánh có cấu trúc lệnh I-Format còn
lệnh nhảy sử dụng cấu trúc lệnh J-Format.
3.3.3.1. Các lệnh rẽ nhánh
Câu lệnh Ví dụ Ý nghĩa
b (Branch) b lab Rẽ nhánh vô điều kiện tới
nhãn lab.
beq (Branch on equal) beq $s1,$s2,L If ($s1 == $s2) go to L
bne (Branch on not equal) bne $s1,$s2,L If ($s1 != $s2) go to L
bgez (Branch on greater than
equal zero)
bgez $s1,L
If ($s1
≥
0) go toL
bgt (Branch on greater) bgt src1,src2,lab Branch if src1>src2
bgtz (Branch on greater than
Zero)
bgtz $s1,L If ($s1 > 0) go to L
jalr (Jump and link register) jalr $s1,$s2 $s2=PC + 4;go to $s1
jr (Jump register) jr $sr Go to $ra
3.3.4. Các lệnh di chuyển dữ liệu
Các câu lệnh di chuyển dữ liệu di chuyển dữ liệu giữa các thanh ghi. Các câu lệnh
đặc biệt được cung cấp để di chuyển dữ liệu vào và ra các thanh ghi đặc biệt là HI
và LO.
Câu lệnh Ví dụ Ý nghĩa
Move move $s1,$s2
Copy nội dung của $s2 tới
$s1
Mfhi mfhi $s1
Copy nội dung của thanh ghi
hi tới $s1
Mflo mflo $s1
Copy nội dung của thanh ghi
lo tới $s1
Mthi mthi $s2
Copy nội dung của $s2 tới
thanh ghi HI
Mtlo mtlo $s2
Copy nội dung của thanh ghi
$s2 tới thanh ghi LO
3.3.5. Làm việc với Stack
Stack (ngăn xếp) là vùng nhớ đặc biệt được truy cập theo cơ chế “vào trước ra sau”
(LIFO – Last In First Out), nghĩa là dữ liệu nào đưa vào sau sẽ được lấy ra trước.
Thanh ghi $sp đóng vai trò là con trỏ ngăn xếp (stack pointer), luôn chỉ đến đỉnh
của stack. Stack phát triển theo chiều giảm của địa chỉ vùng nhớ (đỉnh của stack
luôn có địa chỉ thấp). Hai thao tác cơ bản trong stack là push (đưa một phần tử vào
stack) và pop (lấy một phần tử ra khỏi stack). Cơ chế như sau:
• push: giảm $sp đi 4, lưu giá trị vào ô nhớ mà $sp chỉ đến.