Kích thước của ngăn xếp được khai báo ở đầu chương trình hợp ngữ sau từ khoá .Stack
Ví dụ:
.Stack 100h
Khi đó ngăn xếp có kích thước bằng 100h byte (256 byte hay 128 word)
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT
Kiến trúc máy tính 2 - 58 Mỗi lệnh Push sẽ chiếm dụng 1 word của
ngăn xếp, như vậy ngăn xếp khai báo như trên sẽ cho phép cất tối đa 128 lần.
Người lập trình sẽ phải tính toán để khai báo ngăn xếp có kích thước hợp lý nhất (không quá thừa hay thiếu)
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT
Kiến trúc máy tính 2 - 59
Cấu trúc của ngăn xếp:
Dữ liệu được lấy ra khỏi ngăn xếp theo trình tự ngược lại so với khi cất vào, nghĩa là cất vào sau thì sẽ được lấy ra trước (LIFO - Last In First Out). Bộ vi xử lý 8086 sử dụng hai thanh ghi chuyên dụng cho các thao tác với ngăn xếp là SS (Stack Segment) và SP (Stack Pointer).
SS chứa địa chỉ segment còn SP chứa địa chỉ offset của ô nhớ trong ngăn xếp
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT
Kiến trúc máy tính 2 - 60 Dữ liệu được cất vào ngăn xếp theo trật tự
ngược lại so với các đoạn nhớ khác (từ địa chỉ cao xuống địa chỉ thấp).
Giả sử khai báo ngăn xếp là .Stack 100h thì ngăn xếp sẽ bắt đầu tại địa chỉ offset =
0100h và kết thúc tại offset = 0000h
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 61 … 0000h Kết thúc stack … 00FAh 00FCh 00FEh offset = 0100h ← SP = 0100h …
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT
Kiến trúc máy tính 2 - 62 Khi ngăn xếp chưa có dữ liệu thì SP trỏ tới ô nhớ có địa chỉ cao nhất trong ngăn xếp.
Sau mỗi lệnh Push thì SP sẽ giảm đi 2 để trỏ tới ô tiếp theo của ngăn xếp, dữ liệu sẽ được cất vào ô nhớ do SP trỏ tới
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT
Kiến trúc máy tính 2 - 63
Ví dụ:
Cất ba thanh ghi AX, BX, CX vào ngăn xếp: PUSH AX
PUSH BX PUSH CX
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT
Kiến trúc máy tính 2 - 64
Sau lệnh PUSH AX:
Do giảm SP đi 2 rồi mới cất thanh ghi AX vào ngăn xếp nên sẽ tạo ra một ô rỗng ở địa chỉ cao nhất … 00FAh 00FCh 00FEh AX ← SP = 00FEh 0100h Rỗng …
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 65 Sau lệnh PUSH BX: … 00FAh 00FCh BX ← SP = 00FEh 00FEh AX 0100h Rỗng …
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 66 Sau lệnh PUSH CX: … 00FAh CX ← SP = 00FEh 00FCh BX 00FEh AX 0100h Rỗng …
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT
Kiến trúc máy tính 2 - 67 Muốn lấy nội dung của ba thanh ghi ra
khỏi ngăn xếp thì phải tiến hành theo trình tự ngược lại:
POP CX POP BX POP AX
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT
Kiến trúc máy tính 2 - 68
Sau lệnh POP CX:
Dữ liệu tại ô nhớ do SP trỏ tới (offset = 00FAh) sẽ được nạp vào thanh ghi CX, sau đó SP tăng lên 2 để trỏ tới ô cao hơn. Ô nhớ chứa CX đã được giải phóng nên ta không cần quan tâm tới nội dung bên trong nó nữa
…00FAh - 00FAh - 00FCh BX ← SP = 00FEh 00FEh AX 0100h Rỗng …
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT
Kiến trúc máy tính 2 - 69
Sau lệnh POP BX:
Dữ liệu tại ô nhớ có offset = 00FCh được nạp vào thanh ghi BX … 00FAh - 00FCh BX 00FEh AX ← SP = 00FEh 0100h Rỗng …
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT
Kiến trúc máy tính 2 - 70
Sau lệnh POP AX:
Dữ liệu tại ô nhớ có offset = 00FEh được nạp vào thanh ghi AX. … 00FAh - 00FCh BX 00FEh AX 0100h Rỗng ← SP = 00FEh …
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 71 Thủ tục Cấu trúc thủ tục Sử dụng thủ tục trong chương trình Quan hệ giữa thủ tục và ngăn xếp
Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT
Kiến trúc máy tính 2 - 72