STACK - PROCEDURE - INTERRUPT

7 395 0
STACK - PROCEDURE - INTERRUPT

Đang tải... (xem toàn văn)

Thông tin tài liệu

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ừ stackinterrupt 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ó. 24 Nguyên tắc này có thể được thực hiện như sau : Lấy đòa chỉ interrupt cất vào Old-Int mov ah,035h mov al,Int-no int 021h mov word ptr Old-Int[0],bx mov word ptr Old-Int[2],es . Old-Int dd 0 Thay đòa chỉ interrupt bằng đòa chỉ của New-Int mov ah,025h mov al,Int-no mov dx,offset New-Int int 021h Khi New-Int được gọi : New-Int sẽ làm một số tác vụ cần thiết như kiểm tra,thay đổi tham số . rồi chuyển quyền cho Old- Int bằng cách nhảy thẳng đến đầu vào của Old-Int. New-Int proc near ; Thực hiện các tác vụ cần thiết jmp dword ptr cs:Old-Int New-Int endp Hoặc Old-Int sẽ được gọi như một thủ tục, khi quyền điều khiển được trả về, New-Int bắt đầu kiểm tra và biến đổi kết quả trả về từ Old-Int . Cuối cùng kết thúc bằng IRET New-Int proc near pushf call dword ptr cs:Old-Int ; Thực hiện các tác vụ cần thiết iret New-Int endp 5.4MỘT SỐ CHỨC NĂNG CỦA INTERRUPT 021H Interrupt 021h trên IBM PC được dành riêng cho hệ điều hành DOS. Hầu hết các chức năng của DOS được cung cấp qua interrupt này . Trong các thí dụ kế tiếp chúng ta sẽ sử dụng đến một số các chức năng căn bản sau : 5.4.1Read keyboard and echo Input : AH = 1 Output : AL = ASCII code Chức năng : đọc một ký tự từ bàn phím, nếu chưa có thì chờ cho đến khi một phím được gõ . Phím được đọc cũng đồng thời được in ra màn hình tại vò trí con trỏ hiện thời. 5.4.2Print character Input : AH = 2 DL = ASCII code 25 Output : None Chức năng : in một ký tự ra màn hình tại vò trí con trỏ hiện thời. Các ký tự điều khiển sẽ ảnh hưởng lên chức năng này. Một số ký tự điều khiển trên IBM PC : 7 : Bell, có tác dụng làm loa beep một tiếng 8 : Backspace, có tác dụng kéo lùi con trỏ sang trái một ký tự 10 : Line feed (LF), có tác dụng dời con trỏ xuống hàng kế tiếp 13 : Carry return (CR), có tác dụng đưa con trỏ về đầu dòng hiện tại 5.4.3Print string Input : AH = 9 DS:DX = string terminated by ‘$’ Output : None Chức năng : in một chuỗi ra màn hình bắt đầu từ vò trí con trỏ hiện thời . Chuỗi được quy đònh kết thúc bởi ký tự ‘$’ . Trong chuỗi chấp nhận các ký tự điều khiển. . 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à. 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

Ngày đăng: 29/09/2013, 11:20

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan