Tải bản đầy đủ (.pdf) (7 trang)

STACK - PROCEDURE - INTERRUPT

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (79.79 KB, 7 trang )

19
CHƯƠNG 5 : STACK - PROCEDURE - INTERRUPT
5.1Khái niệm về STACK
Bộ vi xử lý 8088 dành riêng các thanh ghi SS và SP cho việc quản lý STACK, đó là một cấu trúc
đặc biệt được quy đònh như sau :
STACK là một vùng nhớ thuộc về segment do SS xác đònh Thanh ghi SP đóng vai trò một con trỏ
xác đònh điểm làm việc của STACK
Có hai tác vụ chuẩn trên STACK :
- PUSH thanhghi/offset (16 bit) :Cất giá trò 16 bit trong thanhghi/offset vào stack
- POP thanhghi/offset (16 bit) :Lấy giá trò 16 bit trong stack đặt vào thanhghi/offset
Cách thực hiện :
Tác vụ Push : trừ SP cho 2, sau đó đặt một giá trò 16 bit vào đòa chỉ SS:SP
Tác vụ Pop : lấy giá trò 16 bit tại đòa chỉ SS:SP rồi cộng SP với 2
Nếu ta dùng tác vụ Push để cất nhiều giá trò vào STACK, các giá trò này được xếp thành một hàng,
giá trò nào được push vào trước đứng đầu hàng, giá trò nào push vào sau đứng cuối hàng .Tác vụ Pop sẽ
lấy các giá trò từ STACK theo thứ tự từ cuối hàng . Do đó thứ tự lấy các giá trò từ STACK bằng Pop phải
ngược lại thứ tự đã cất chúng bằng Push .
Trong quá trình thực hiện chương trình để tránh hiện tượng các quá trình trung gian làm sai lạc giá
trò các thanh ghi, biện pháp thông thường là cất giá trò các thanh ghi này vào STACK trước khi thực hiện
quá trình trung gian . Thực hiện quá trình trung gian xong, lấy lại giá trò đầu cho các thanh ghi từ STACK.
Thí dụ :
push DX ; cất DX
push AX ; cất AX
mov ah,2 ;
mov dl,7 ; beep
int 021h ;
pop AX ; lấy lại AX
pop DX ; lấy lại DX

Chú ý :
- Số phần tử có thể cất vào stack chỉ tùy thuộc vào kích thước của stack.


- Đã cất giá trò nào vào stack thì phải nhớ lấy ra !
5.2THỦ TỤC
Chương trình của chúng ta có một số đoạn được sử dụng nhiều lần . Đối với các đoạn chương trình
này, tốt nhất là tổ chức thành các thủ tục (procedure) Mỗi lần cần sử dụng ta chỉ cần gọi đến chúng theo
các tên đã được đặt . Việc tổ chức thành thủ tục sẽ giúp cho chương trình ngắn gọn và rõ ràng hơn nhiều.
Bộ vi xử lý 8088 cung cấp các lệnh có liên quan đến thủ tục như sau :



5.2.1Chỉ thò CALL
20
CALL Tên-procedure
Tác vụ CALL sẽ chuyển điều khiển chương trình đến procedure được chỉ đònh bằng cách cất đòa chỉ
của lệnh kế tiếp vào stack,rồi chỉ CS:IP đến đòa chỉ của procedure được chỉ đònh.
CALL word ptr <đòa-chỉ>
Chuyển điều khiển bằng cách push IP vào stack,sau đó nạp cho IP word lưu chứa tại đòa-chỉ
CALL dword ptr <đòa-chỉ>
Chuyển điều khiển bằng cách push CS, push IP, sau đó nạp cho IP word ptr đòa-chỉ[0], nạp cho CS
word ptr đòa-chỉ[2]
5.2.2Chỉ thò RET
RET [n]
Quay trở lại lệnh kế tiếp lệnh CALL đã gọi procedure.Một procedure thông thường sẽ kết thúc bằng
lệnh RET. Thực hiện bằng cách lấy từ stack đòa chỉ đã được lưu nhớ trong lệnh CALL rồi gán lại cho
CS:IP.
Nếu chỉ thò RET đi kèm với một hằng số thì sau khi CS và IP được phục hồi, SP sẽ được cộng thêm
hằng số ấy ( tương đương với việc loại bỏ khỏi stack ngần ấy byte ).
5.2.3NEAR và FAR :
Nếu procedure được gọi bởi lệnh CALL ở trong cùng segment,thì chỉ cần thay đổi IP để chuyển
điều khiển.Do đó chỉ có IP được cất vào stack, và lệnh RET tương ứng cũng chỉ lấy lại giá trò cho IP từ
stack . Kết quả là CS không thay đổi trong khi thực hiện các lệnh trên. Trong trường hợp này lệnh CALL

và RET tương ứng được gọi là NEAR .
Khi thực hiện một CALL near, IP được cất vào stack (push)
Khi thực hiện một RET near, IP được lấy ra từ stack (pop)
Ngược lại với NEAR, là FAR.
Khi thực hiện một CALL far, trước tiên CS được cất vào stack, kế tiếp là IP . Sau đó cả IP lẫn CS
đều được gán giá trò mới . Khi thực hiện một RET far, trước tiên IP được lấy ra từ stack, kế tiếp là CS .
5.2.3Quy đònh của trình hợp dòch về NEAR và FAR
Nếu procedure-A là NEAR thì mặc nhiên các lệnh RET thuộc procedure-A là NEAR và các lời gọi
tới procedure-A (CALL procedure-A) là NEAR
Nếu procedure-B là FAR thì mặc nhiên các lệnh RET thuộc procedure-B là FAR và các lời gọi tới
procedure-B (CALL procedure-B) là FAR
5.3INTERRUPT
5.3.1Interrupt trên 8088/8086
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 ngắt
(interrupt table). Bảng ngắt có 256 phần tử liên tiếp được đánh số từ 0-255 (0-0FFh). Mỗi phần tử của
bảng ngắt chiếm 4 byte tạo thành đò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à một interrupt. Interrupt là một procedure loại FAR, nhưng chỉ được gọi bằng
lệnh : INT số-hiệu.
Khi thực hiện lệnh INT, Flag được cất vào stack kế tiếp là CS và IP. Điều khiển được chuyển hướng
bằng cách nạp cho CS và IP các giá trò tương ứng trong bảng ngắt (lấy từ phần tử có thứ tự bằng số hiệu đi
kèm với chỉ thò INT )
Interrupt kết thúc bằng lệnh IRET, khi thực hiện IRET, IP, CS và Flag được trả lại giá trò cũ.
Một interrupt có thể được phát động bằng hai cách : do phần cứng hay do phần mềm .
21
5.3.2Interrupt cứng (hard interrupt)
Khi một thiết bò ngoại vi cần thông báo một đôi điều gì đó với CPU thông thường một interrupt sẽ
được phát động.Chương trình đang được thực hiện bởi CPU sẽ tạm dừng lại, chỉ thò INT Int-no được thực
hiện ngay tức khắc với Int-no là số hiệu của interrupt được phát động.Các interrupt được phát động theo
kiểu này được gọi là các interrupt cứng . Các interrupt cứng luôn luôn cất tất cả các thanh ghi được sử
dụng đến vào stack trước khi thực hiện công việc của mình. Công việc một interrupt cứng thực hiện

thường chiếm một thời gian rất ngắn.Sau đó các thanh ghi sẽ được hoàn trả từ stack và interrupt kết thúc
bằng tác vụ IRET . Như vậy, các interrupt cứng đã tạm ngắt đoạn chương trình hiện thời để thực hiện một
số tác vụ nào đó đáp ứng với nguyên nhân đã tạo ra interrupt, sau đó lại cho đoạn chương trình ấy tiếp tục
. Người sử dụng và bản thân chương trình đang chạy vẫn cứ tưởng mình đang làm chủ hoàn toàn
Computer !
Các interrupt cứng được điều khiển bởi interrupt controller . Trên IBM PC đó là vi mạch 8259A của
Intel . 8258A cho phép quản lý 8 interrup cứng . Trên IBM AT, hai vi mạch 8259A được sử dụng cung cấp
16 interrupt cứng .
Mỗi interrupt cứng được ký hiệu : IRQ <n> ( n = 0..7 hoặc 0..15 )
Mỗi IRQ sẽ được chỉ đònh tương ứng với một số hiệu từ 0 đến 255 . Đó chính là số hiệu của interrupt
được phát động. Để tránh trường hợp interrupt cứng bò lồng vào nhau ( một interrupt cứng được phát động
trở lại trong khi đoạn chương trình của nó chưa kết thúc) Interrupt controller sẽ không cho phép phát động
thêm bất cứ interrupt cứng nào khác sau khi một interrupt cứng được gọi . Do đó trước khi kết thúc, một
interrupt cứng phải cho phép interrupt controller hoạt động trở lại (enable interrupt) bằng cách gởi ra port
020h giá trò 020h.
mov al,020h
out 020h,al
...
iret
5.3.2 Interrupt mềm (soft interrupt)
Một interrupt được phát động bởi một chỉ thò INT ngay bên trong đoạn chương trình đang được thực
hiện gọi là một interrupt mềm . Nói một cách khác, interrupt mềm là một interrupt được chương trình sử
dụng chủ động gọi đến .
Lẽ dó nhiên, một chương trình cũng có thể cố ý gọi đến một interrupt cứng . Nhưng hành động ấy sẽ
chẳng làm interrupt ấy trở thành “mềm” ! Thông thường việc gọi thẳng đến một interrupt cứng từ chương
trình sẽ tạo ra các hậu quả không tốt đẹp gì cho lắm : đoạn chương trình của interrupt cứ đinh ninh rằng
một thiết bò ngoại vi, hay một tác nhân ngoài nào đó đang chờ đợi nó trả lời !
Số lượng interrupt cứng rất ít so với số các phần tử của bảng ngắt,do đó hầu hết các interrupt còn lại
đều được sử dụng như các interrupt mềm
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 procedure phức tạp đảm nhận.Các procedure này một phần được cung cấp bởi ROM
BIOS,một phần thuộc về hệ điều hành .
Chương trình của chúng ta khi có yêu cầu sử dụng đến các thiết bò ngoại vi chỉ cần gọi đến
procedure 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 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 . Để giải quyết vấn đề trên, ta có thể viết các procedure ấy dưới dạng các interrupt và để ROM
BIOS hay hệ điều hành tự cài đặt đòa chỉ của chúng vào bảng ngắt theo từng số hiệu đã quy đònh trước .
Khi cần sử dụng đến các procedure ấy, chương trình của chúng ta chỉ cần thực hiện chỉ thò INT tương ứng .
22
Các interrupt theo nghóa nêu trên chính là các interrupt mềm . Thông thường một interrupt mềm
được gọi kèm theo một số tham số, các tham số ấy được đặt trong các thanh ghi theo một quy tắc đã đònh
trước .
Mỗi interrupt có thể cung cấp nhiều chức năng khác nhau, các chức năng này được gọi là các
service hoặc các function . Chức năng được chỉ đònh bằng số hiệu đặt trong AH khi thực hiện lệnh INT .
5.3.3Các interrupt trên IBM AT ( Theo Norton Utilities )
Int-no Interrup Name Int-no Interrup Name
00 Divide by Zero
01 Single Step
02 Nonmaskable
03 Breakpoint
04 Overflow
05 Print Screen
06 Reserved
07 Reserved
08 System Timer <--> IRQ 0 Timer
Output 0
09 Keyboard <--> IRQ 1 Keyboard
0A Reserved <--> IRQ 2 [Cascade]

0B Reserved <--> IRQ 3 COM2
0C Reserved <--> IRQ 4 COM1
0D Reserved <--> IRQ 5 LPT2
0E Diskette <--> IRQ 6 Floppy Disk
0F Reserved <--> IRQ 7 LPT1
10 Video
11 Equipment Determination
12 Memory Size Determination
13 Fixed Disk/Diskette
14 Asynchronous Communication
15 System services
16 Keyboard
17 Printer
18 Resident BASIC
19 Bootstrap Loader
1A Real-Time Clock Services
1B Keyboard Break
1C User Timer Tick
1D Video Parameters
1E Diskette Parameters
1F Video Graphics Characters
20 Program Terminate
21 General DOS functions
22 Terminate Address
23 Ctrl-Break Handler Address
24 Critical Error Handler
25 Absolute Disk Read
26 Absolute Disk Write
27 Terminate and Stay Resident
28 DOS Idle

29 DOS Internal - FAST PUTCHAR
2A-2D Reserved for DOS
2E DOS - Execute Command
2F Multiplex (process interface)
30-32 Reserved for DOS
33 Microsoft Mouse Driver
34-3E Reserved for DOS
3F Overlay Manager
40 Diskette BIOS Revector
41 Fixed Disk Parameters
42 Relocated Video Handler
43 Reserved
44 Novell Netware API
45 Reserved
46 Fixed Disk Parameters
47-49 Reserved
4A User Alarm
4B-5F Reserved
60-66 Reserved for User Programs
67 Expanded Memory
68-6F Reserved
70 Real-Time Clock
71-74 Reserved
75 Redirect to NMI Interrupt
76-79 Reserved
7A Novell Netware (API)
7B-7F Reserved
80-85 Reserved for BASIC
86-F0 Reserved for BASIC interpreter
F1-FF Reserved for User Programs


23
5.3.4Lấy đòa chỉ một interrupt
Truy nhập trực tiếp bảng ngắt :
xor ax,ax
mov es,ax
mov ax,word ptr es:[Int-no*4]
mov Offs-Int,ax
mov ax,word ptr es:[Int-no*4+2]
mov Seg-Int,ax
...
Offs-Int dw 0
Seg-Int dw 0
Dùng chức năng 035h của interrupt 021h
mov ah,035h ; AH = 035h : get int-addr
mov al,Int-no ; AL = Int-no
int 021h ; Return :
mov Offs-Int,bx ; BX = Offset
mov Seg-Int,es ; ES = Segment
5.3.5Thay đòa chỉ một interrupt
Truy nhập trực tiếp bảng ngắt :
CLI ; Cấm interrupt
xor ax,ax
mov es,ax
mov word ptr es:[Int-no*4],Offset-New-Int
mov word ptr es:[Int-no*4+2],Segment-new-Int
STI ; Cho phép interrupt
...
Dùng chức năng 025h của interrupt 021h
mov ah,025h ; AH = 025h : set int-addr

mov al,Int-no ; AL = Int-no
mov dx,Offset-new-Int ;
; DS:DX = New-Int address
int 021h
5.3.6Thay thế một interrupt
Một vài chương trình trong quá trình thực hiện đã thay thế một số interrupt của hệ thống bằng các
đoạn chương trình của mình . Nếu interrupt này không thuộc về ROM BIOS lẫn hệ điều hành thì đây chỉ
là một cách cài đặt các thủ tục dưới dạng interrupt.Khi cần gọi đến thủ tục nào chỉ cần gọi interrupt tương
ứng .
5.3.7“Xỏ mũi” interrupt ( Hook interrupt vector )
Nếu interrupt bò thay thế thuộc về ROM BIOS hay hệ điều hành, thông thường đoạn chương trình
thay thế phải đảm nhiệm tất cả các khả năng của interrupt cũ : phải viết lại những gì đã có . Trong trường
hợp này người ta thường chọn một giải pháp khác : mỗi khi interrupt được phát động chương trình thay thế
sẽ được chuyển quyền, interrupt cũ sẽ được gọi thực hiện từ chương trình thay thế nếu có yêu cầu . Giải
pháp này cho phép chúng ta bổ sung thêm một số chức năng, hay tạo một số hiệu ứng phụ cho một
interrupt mà vẫn giữ được tất cả các khả năng của nó.

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×