-->

WE ARE CEE

CENTER ELECTRICAL ENGINEERING

FPGA, Embedded System, PCB Layout, Robotics and More

Khoa học & Công nghệ

Lập trình Assembly-Bài 5-P1

Ngắt (Interrupt) là các tín hiệu mà các thành phần trong hệ thống, như: thiết bị ngoại vi, hệ điều hành, chương trình người sử dụng, ..., gửi đến vi xử lý (họ Intel) mỗi khi nó cần trao đổi thông tin với vi xử lý hay cần được sự phục vụ từ vi xử lý. Ngắt cũng có thể phát sinh từ chính bên trong vi xử lý khi nó phát hiện một lỗi nghiêm trong xảy ra trong quá trình xử lý của nó. Khi nhận được một tín hiệu yêu cầu ngắt vi xử lý sẽ dừng ngay thao tác (lệnh) hiện tại để xem xét và đáp ứng yêu cầu ngắt đó, sau đo mới tiếp tục lại từ thao tác (lệnh) mà nó bị dừng trước đó.          

Các máy IBM_PC, sử dụng vi xử lý Intel, bao gồm nhiều loại ngắt: Ngắt phần cứng, ngắt phần mềm, ngắt bên trong, ngắt không chắn được (ngắt có độ ưu tiên cao nhất). Trong đó ngắt phần mềm là các ngắt được phát sinh từ hệ điều hành và chương trình của người sử dụng, điều này thường thấy trong các chương trình hợp ngữ.

Hệ thống các ngắt mềm bên trong máy tính IBM_PC được cung cấp bởi BIOS và hệ điều hành, gồm 256 ngắt, chúng được đánh số từ 0 đến 255 và được gọi là số hiêu ngắt. Mỗi ngắt mềm tương ứng với một chương con được gọi là chương trình con phục vụ ngắt, tức là, để đáp ứng một yêu cầu ngắt mềm thì hệ thống sẽ phải thực hiện một chương trình con phục vụ ngắt tương ứng.

Hợp ngữ cung cấp lệnh Int để các chương trình gọi một ngắt mềm khi cần. Khi gọi ngắt mềm chương trình phải chỉ ra số hiệu ngắt cần gọi, khi đó hệ thống sẽ phải gọi thực hiện chương trình con phục vụ ngắt tương ứng để đáp ứng yêu cầu gọi này.

 Trong môi trường hệ điều hành 16 bít MSDOS, ngay sau khi khởi động, hệ điều hành nạp tất cả 256 chương trình con phục vụ ngắt vào bộ nhớ. Khi đó 256 địa chỉ (Segment:Offset) các vùng nhớ, nơi  định vị của 256 chương trình con phục vụ ngắt, sẽ được lưu trữ tại một không gian nhớ đặc biệt trong bộ nhớ, vùng nhớ này được gọi là bảng vector ngắt (mỗi địa chỉ định vị của một chương trình con phục vụ ngắt được gọi là một vector ngắt.

Như vậy khi hệ thống nhận được một yêu cầu ngắt n (Int   n) từ chương trình thì nó phải: 1. Dừng lệnh hiện tại, đưa giá trị con trỏ lệnh CS:IP hiện tại (đó chính là địa chỉ của lệnh sau lệnh gọi ngắt) vào lưu trữ ở hai phần tử trên đỉnh Stack; 2. Xác định phần tử (địa chỉ) trong bảng vector ngắt chứa vector ngắt của ngắt n, lấy giá trị tại đây (2 phần tử liên tiếp) để đưa vào cặp thanh ghi con trỏ lệnh CS:IP (đây chính là địa chỉ của lệnh đầu tiên của chương trình con phục vụ ngắt n trong bộ nhớ); 3. Bắt đầu thực hiện chương trình con phục vụ ngắt cho đến khi gặp lệnh kết thúc chương trình này, đó là lệnh Iret; 4. Lấy nội dung của hai phần tử trên đỉnh Stack đặt vào lại cặp thanh ghi con trỏ lệnh để quay trở lại tiếp tục thực hiện lệnh sau lệnh gọi ngắt trong chương trình.

Những vấn đề liên quan đến Stack và cơ chế của một lời gọi ngắt sẽ được chúng tôi làm rõ hơn ở phần sau của tài liệu này.     

Lệnh Int

Cú pháp:

                        Int          <n>

Trong đó: Trong đó <n> là số hiệu ngắt của một ngắt mềm cần gọi. Tức là, n có thể là một trong các giá trị từ 0 đến 255, đó chính là số hiệu ngắt của 256 ngắt mềm mà BIOS và MSDOS cung cấp.

Tác dụng: Lệnh Int (Interrupt) được sử dụng để gọi một ngắt mềm (của BIOS hoặc MSDOS) trong chương trình hợp ngữ. Khi một ngắt mềm được gọi thì hệ thống sẽ thực hiện chương trình con phục vụ ngắt tương ứng với nó.

Ví dụ 1:

                       Int           10h                 ; gọi ngắt 10h của BIOS

                       Int           20h                 ; gọi ngắt 20h của MSDOS

Một ngắt mềm, hay chính xác hơn là một chương trình con phục vụ ngắt, có thể thực hiện nhiều chức năng khác nhau, mỗi chức năng này được thể hiện thông qua một con số, được gọi là số hiệu hàm của ngắt. Do đó, trước khi gọi ngắt chương trình phải chỉ rõ gọi ngắt với hàm nào, bằng cách đặt số hiệu hàm cần gọi vào thanh ghi AH.

Ví dụ 2:

        Mov        Ah, 01                        ; gọi ngắt 21h với hàm 01, Hay nói ngược lại: gọi hàm

        Int           21h                 ; 01 của ngắt 21h

Trước khi gọi hàm/ngắt chương trình cần cung cấp đầy đủ dữ liệu vào (nếu có) cho nó, sau khi hàm/ngắt được thực hiện chương trình cần xác định rõ nó có trả về dữ liệu kết quả (dữ liệu ra) hay không, nếu có thì chứa ở đâu: thanh ghi hay ô nhớ, và có tác động đến các cờ hiệu hay không. 

 

Ví dụ 3:

        Mov        Ah, 02                                    ; đặt số hiệu hàm cần gọi vào AH

        Mov        DH, 10                        ; cung cấp dữ liệu vào thứ nhất vào DH

        Mov        DL, 20                        ; cung cấp dữ liệu vào thứ hai vào DL

        Int           10h                             ; gọi ngắt 10h với hàm 02. Hàm/ngắt này không

                                                            ; trả về dữ liệu kết quả.

Dãy lệnh trên thực hiện việc gọi hàm 02 của ngắt 10h (ngắt của BIOS), nó thực hiện việc dịch chuyển con trỏ đến dòng 10 cột 20 của màn hình văn bản.

Ví dụ 4:

        Mov        Ah, 2Bh                      ; gọi ngắt 21h với

        Int           21h                             ; hàm 2Bh

Hàm này trả về ngày-tháng-năm hiện tại (theo đồng hồ hệ thống trên máy tính). Cụ thể: Thanh ghi CX (1980-2099) chứa năm hiện tại, thanh ghi DH (1-12) chứa tháng hiện tại, thanh ghi DL (1-31) chứa ngày hiện tại. Đồng thời AL cho biết ngày trong tuần (0 : chủ nhật, 6 : thứ 7).

BÀI VIẾT LIÊN QUAN:

Seminar: Giới thiệu dây chuyền làm mạch in PCB

Chiều ngày 1/12/2017 Trung tâm CEE đã tổ chức Seminar: Giới thiệu dây chuyền ...

Robot giúp các cặp đôi hôn nhau từ xa

Các nhà khoa học đang chế tạo phần đầu robot có thể cảm nhận và truyền áp lực ...

Phát triển pin Lithium-không khí mới với hiệu suất gấp 5 lần so với hiện tại

Một nguyên mẫu pin lithium-air (liti-không khí) hoàn toàn mới với mức năng ...

12 công cụ giúp bạn thoải mái làm việc từ bất cứ đâu trên thế giới

Chỉ cần mạng Internet tốt và các công cụ làm việc ổn, bạn hoàn toàn có thể dễ ...