You are on page 1of 4

Chương 5: Stack – Procedure - Interrupt

5.1. Stack
Bộ xử lý 8088 dùng các thanh ghi SS và SP dể quản lý một cấu trúc đặc biệt gọi là
STACK. Các tác vụ cơ bản trên STACK:

Lệnh Ý nghĩa thực hiện


PUSH <Reg_16/Mem_16> SUB SP,2
MOV WORD PTR SS:[SP],<Reg_16/Mem_16>
POP <Reg_16/Mem_16> MOV <Reg_16/Mem_16>,WORD PTR SS:[SP]
ADD SP,2
PUSHF SUB SP,2
<Reg_16/Mem_16> MOV WORD PTR SS:[SP],<Flag>
POPF <Reg_16/Mem_16> MOV <Flag>,WORD PTR SS:[SP]
ADD SP,2

Ta có thể "cất" các giá trị 16 bit vào STACK bằng lệnh PUSH và sau đó lấy ra trở lại
bằng lệnh POP. Các giá trị được push vào STACK sau sẽ dược pop ra trước và ngược
lại. Thí dụ:
MOV AX,1
MOV BX,2
MOV CX,3
PUSH AX
PUSH BX
PUSH CX
POP AX ; AX=3
POP BX ; BX=2
POP CX ; CX=1

Người ta thường dùng STACK để bảo tồn giá trị các thanh ghi . Đoạn chương trình
sau thực hiện tác vụ gán cho BX giá trị (DH*80 + DL)*2 và không làm thay đổi
thanh ghi AX :
PUSH AX
PUSH DX
MOV AL,80
MUL DH
XOR DH,DH
ADD AX,DL
SHL AX,1
MOV BX,AX
POP DX
POP AX

Khi dùng STACK để bảo tồn giá trị các thanh ghi phải luôn thực hiện đúng thứ tự
push vào trước thì pop ra sau.
5.2. Procedure
5.2.1. Lệnh Call và Return
Thủ tục hóa các đoạn chương trình là cơ sở của kỹ thuật lập trình hiện đại. Bộ xử lý
8088 hỗ trợ tổ chức chương trình theo thủ tục bằng các lệnh sau:

Lệnh Ý nghĩa thực hiện


CALL NEAR <Label> PUSH IP
MOV IP offset of <Label>
RET NEAR [n] POP IP
RETN [n] [SUB SP,n]
CALL FAR <Label> PUSH CS
PUSH IP
MOV CS segment of <Label>
MOV IP offset of <Label>
RET FAR [n] POP IP
RETF [n] POP CS
[SUB SP,n]

<Label> là một nhãn bất kỳ trong chương trình hợp ngữ

Lệnh CALL cất con trỏ lệnh IP (và CS nếu như là FAR) vào STACK rồi chuyển điều
khiển đến địa chỉ của <Label>. Sau đó nếu gặp lệnh RET, con trỏ lệnh được hoàn trả
lại vào con trỏ lệnh IP (và CS cũng vậy nếu như là RETF).

Ta có thể viết các đoạn chương trình nhận quyền điều khiển chuyển đến từ nhiều nơi
khác nhau (bằng lệnh CALL) và quay trở về chỉ bằng một lệnh chung là RET. Đoạn
chương trình như vậy được gọi là một thủ tục (procedure). Một thủ tục gọi là FAR
nếu như kết thúc bằng lệnh RETF (FAR), được gọi là NEAR nếu như kết thúc bằng
RETN (NEAR)

Một dạng thức khác của lệnh CALL

Lệnh Ý nghĩa thực hiện


CALL WORD PTR <Label> PUSH IP
MOV IP,WORD PTR <Label>
CALL DWORD PTR <Label> PUSH IP
PUSH CS
MOV IP,WORD PTR <Label>
MOV IP,WORD PTR <Label+2>

Theo dạng thức này, địa chỉ được chuyển đến lưu tại <Label> .
Tương ứng với tất cả các lệnh CALL đã nêu ta có lệnh JMP với cùng cú pháp.

5.2.2. Tham số và giá trị của hàm


Các tham số của các chương trình có thể được gán bởi các thanh ghi, nhưng số lượng
thanh ghi trong CPU là hữu hạn nên có khả năng không lưu đủ các tham số của
chương trình. Ta có thể giải quyết vấn đề này bằng cách đưa các tham số cần truyền
vao stack (Push) và gán dần vào các thanh ghi, quá trình này được thực hiện bởi các
lệnh trong chương trình con. Lưu ý kết thúc chương trình con ta gọi lệnh RET[n] để
loại bỏ các tham số đã đẩy vào stack.

5.3. Interrupt
5.3.1. Hardware Interrupt
Là cơ chế mà thiết bị ngoại vi dùng để liên lạc với CPU. Mỗi thiết bị ngoại vi có một
kênh làm việc riêng với CPU (Interrupt Request Line). Thường thì các CPU có từ 8-16
kênh, riêng CPU 8088 có 8 kênh:
• IRQ0 : Timer
• IRQ1 : Keyboard
• IRQ2 : dùng trong máy AT
• IRQ3 : Serial Port 2
• IRQ4: Serial Port 1
• IRQ5 : Hard Disk
• IRQ6 : Floppy Disk
• IIRQ 7 : Parallel Port
Tại 1 thời điểm chỉ có 1 IRQ được kích hoạt. Khi CPU nhận tín hiệu từ thiết bị ngoại vi
thông qua IRQ sẽ lập tức:
• Ngừng các công việc đang làm.
• Bảo lưu trạng thái thực hiện lệnh vào stack và các thanh ghi cờ hiệu.
• Chuyển sang thực hiện chương trình con đặc biệt chuẩn bị sẵn cho các kênh IRQ
(chứa trong ROM BIOS).
• Sau khi thực hiện xong chương trình con đặc biệt này, CPU sẽ thực hiện tiếp
chương trình đang thực hiện (lệnh IRET)

5.3.2. Software Interrupt


Bộ vi xử lý 8088 dành riêng vùng nhớ từ 0000:0000 đến 0000:03FF để tạo thành một
bảng địa chỉ. Bảng địa chỉ này có 256 phần tử được đánh số từ 0-255 (0-0FFh). Mỗi
phần tử chiếm 4 byte lưu giữ địa chỉ (hai byte đầu chứa offset và hai byte sau chứa
segment) của một procedure đặc biệt gọi là interrupt. Interrupt là một procedure loại
FAR, nhận quyền điều khiển và kết thúc qua các lệnh :

Lệnh Ý nghĩa thực hiện


INT [n] PUSH <Flag>
PUSH CS
n là số hiệu của interrupt PUSH IP
n = 0-255 (00h- 0FFh) MOV CS word ptr 0000:[n*4]
MOV IP word ptr 0000:[n*4+2]
IRET POP IP
POP CS
POP <Flag>

Các tác vụ điều khiển các thiết bị ngoại vi như màn hình, bàn phím, máy in,đĩa cứng,đĩa
mềm ... cần phải có các thủ tục phức tạp đảm nhận.Các thủ tục này thường được cung cấp
bởi ROM BIOS và hệ điều hành .
Các chương trình khi có yêu cầu sử dụng đến các thiết bị ngoại vi chỉ cần gọi đến thủ tục
tương ứng . Sử dụng lệnh CALL để truy nhập đến các procedure thuộc về ROM BIOS
hay hệ điều hành đòi hỏi địa chỉ của các thủ tục ấy phải cố định.Yêu cầu ấy hầu như
không thể thực hiện được bởi vì với mỗi phiên bản (version) mới của ROM BIOS hay hệ
điều hành, ta lại có một bộ các địa chỉ mới ! Và như vậy các chương trình viết theo cách
này chỉ có thể chạy được với một ROM BIOS và một hệ điều hành xác định. Vấn đề trên
được giải quyết bằng cách gán địa chỉ các thủ tục hệ thống cho các interrupt, các chương
trình khác sẽ thực hiện chỉ thị INT thay cho lời gọi CALL.

You might also like