匯編語言第十五章外中斷小白筆記-創(chuàng)新互聯(lián)

15.1 接口芯片和端口

pc 系統(tǒng)的接口卡和主板上,裝有各種接口芯片。這些外設(shè)接口芯片內(nèi)部有若干寄存器,cpu將這些寄存器當(dāng)作端口來訪問。

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、呼圖壁ssl等。為1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的呼圖壁網(wǎng)站制作公司

cpu通過端口和外部設(shè)備進(jìn)行聯(lián)系。

15.2 外中斷信息

來自外部的中斷信息

外部中斷原有兩類:

第一類:可屏蔽中斷源

cpu是否響應(yīng)中斷要看標(biāo)志寄存器。if=1的話,執(zhí)行完當(dāng)前指令后去響應(yīng)中斷。if=0的話,不響應(yīng)中斷。

內(nèi)中斷的過程:

(1)取中斷類型碼n

(2)標(biāo)志寄存器入棧,if=0,tf=0

(3)cs、ip入棧

(4)(ip)=(n*4),(cs)=(n*4+2)

if=0就是為了屏蔽其他的可屏蔽中斷

指令:

sti   ;if=1
cli   ;if=0
第二類:不可屏蔽中斷

cpu必須響應(yīng)。

8086cpu不可屏蔽終端類型碼固定為2,所以屏蔽過程中不需要取中斷類型碼。

過程:

(1)標(biāo)志寄存器入棧,if=0,tf=0

(2)cs ip入棧

(3)(ip)=(8),(cs)=(0ah)

15.3pc鍵盤的處理過程

    • 鍵盤輸入

鍵盤中每個(gè)按鍵相當(dāng)于一個(gè)開關(guān),鍵盤中有一個(gè)芯片對(duì)鍵盤上的每一個(gè)鍵的開關(guān)狀態(tài)進(jìn)行掃描。

按下一個(gè)鍵時(shí),開關(guān)接通,芯片會(huì)產(chǎn)生一個(gè)掃描碼,掃描碼說明了按下的鍵在鍵盤上的位置。掃描碼被送入主板上的相關(guān)接口芯片的寄存器中,該寄存器的端口地址為60h

松開按下的鍵時(shí),也會(huì)產(chǎn)生一個(gè)掃描碼,掃描碼說明了松開的鍵在鍵盤上的位置,松開按鍵時(shí)產(chǎn)生的掃描碼也會(huì)被送入60h端口中。

一般按下鍵盤時(shí)的掃描碼被叫做通碼,松開時(shí)的掃描碼叫做斷碼。掃描碼長度為一個(gè)字節(jié),通碼第7位為0,斷碼第七位為1

就是:

斷碼=通碼+80h
    • 引發(fā)9號(hào)中斷

鍵盤的輸入到達(dá)60h端口時(shí),相關(guān)的芯片就會(huì)向cpu發(fā)出中斷類型碼為9的可屏蔽中斷信息。

cpu檢測(cè)到該中斷信息后,如果if=1,則響應(yīng)中斷,引發(fā)中斷過程,轉(zhuǎn)去執(zhí)行int9中斷例程

    • 執(zhí)行int9中斷例程

(BIOS)系統(tǒng)板的ROM(只讀內(nèi)存)中放有一套程序,稱為BIOS(基本輸出輸入系統(tǒng))

BIOS提供了int9 的中斷例程,用來進(jìn)行鍵盤的讀取和輸出。

:(1)讀出60h端口中的掃描碼

(2)如果是字符鍵的掃描碼,將該掃描碼和它所對(duì)應(yīng)的字符碼(ascll)送入內(nèi)存(一個(gè)字節(jié)加一個(gè)字節(jié)=一個(gè)字),=中的BIOS鍵盤緩沖區(qū),如果是控制鍵的掃描碼,則將其轉(zhuǎn)化成狀態(tài)字節(jié)(用二進(jìn)制記錄控制鍵和切換鍵狀態(tài)字節(jié))寫入內(nèi)存中儲(chǔ)存狀態(tài)字節(jié)的單元(內(nèi)存單元)。

(3)對(duì)鍵盤系統(tǒng)進(jìn)行相關(guān)的控制,比如像向芯片發(fā)出應(yīng)答信息

BIOS鍵盤換緩沖區(qū)是系統(tǒng)啟動(dòng)后,BIOS用于存放int9 中斷例程所接受的鍵盤輸入的內(nèi)存區(qū)。該內(nèi)存區(qū)可以存儲(chǔ)15個(gè)鍵盤輸入(15個(gè)字型數(shù)據(jù)),因?yàn)閕nt9 中斷例程除了接收掃描碼外還要產(chǎn)生掃描碼對(duì)應(yīng)的字符碼,所以在BIOS鍵盤緩沖區(qū)中,一個(gè)鍵盤輸入用一個(gè)字單元存放,高位存放掃描碼,低位存放字符碼(ascll)。

assume cs:code,ds:data,ss:stack
data segment
         db 128 dup(0)
data ends

stack segment stack
          db 128 dup(0)
stack ends




code segment

    start:             mov  ax,stack
                       mov  ss,ax
                       mov  sp,128
                        call init_reg
                       call show_keywordstatus



                       mov  ax,4C00h
                       int  21h

    ;===============================
    init_reg:          mov  bx,0B800h

                       mov  es,bx
                       mov  bx,40h
                       mov  ds,bx

                       ret
    ;====================================
    show_status:       push cx
                       push dx
                       push ds
                       push es
                       push si
                       push di

    
    
                       mov  cx,8
     
    showstatus:        mov  dx,0


                       shl  al,1
                       adc  dx,30h
                       mov  es:[di],dl
                       add  di,2
                       loop showstatus
                        

                       pop  di
                       pop  si
                       pop  es
                       pop  ds
                       pop  dx
                       pop  cx

                       ret

    ;===========================
    show_keywordstatus:

                       mov  si,17h
    testA:             
                       mov  di,160*10+40*2
                       mov  al,ds:[si]
                      
                       call show_status

                       jmp  testA
                       ret


code ends

end start
15.4 編寫int9中斷例程

鍵盤的輸入處理過程:

  1. 鍵盤產(chǎn)生掃描碼

  1. 掃描碼送入60h端口

  1. 引發(fā)9號(hào)中斷

  1. cpu執(zhí)行int9中斷例程處理鍵盤輸入

編程:在屏幕中依次顯示'a'~'z' esc后改變顏色。

由于cpu執(zhí)行速度太快,所以要在每一次輸入后都進(jìn)行好多次循環(huán)來延遲時(shí)間。

assume cs:code
stack segment
          db 128 dup (0)
stack ends



code segment
    start:mov  ax,stack
          mov  ss,ax
          mov  sp,128
    
          mov  ax,0b800h
          mov  es,ax
          mov  ah,'a'
    s:    mov  es:[160*12+40*2],ah


          call delay

          inc  ah
          cmp  ah,'z'
          jna  s
          mov  ax,4c00h
          int  21h



    delay:push ax
          push dx
          mov  dx,10h
          mov  ax,0

    s1:   sub  ax,1
          sbb  dx,0
          cmp  ax,0
          jne  s1
          cmp  dx,0
          jne  s1
          pop  dx
          pop  ax
          
          
          ret





code ends

    end start

改變顏色

那個(gè)咱就是說代碼一定不要放到vscode的安裝目錄中

assume cs:code
stack segment
              db 128 dup (0)
stack ends

data segment
             dw 0,0
data ends



code segment
        start:  mov   ax,stack
                mov   ss,ax
                mov   sp,128
    
                mov   ax,data
                mov   ds,ax

                mov   ax,0
                mov   es,ax

                push  es:[9*4]
                pop   ds:[0]
                push  es:[9*4+2]
                pop   ds:[2]                               ;將原來的int9中斷例程,的入口保存在ds:0、ds:2中
                cli
                mov   word ptr es:[9*4],offset int9
                mov   es:[9*4+2],cs                        ;在中斷向量表中設(shè)置新的int9 中斷例程的入口地址
                sti





                mov   ax,0b800h
                mov   es,ax
                mov   ah,'a'
        s:      mov   es:[160*12+40*2],ah


                call  delay

                inc   ah
                cmp   ah,'z'
                jna   s

                mov   ax,0
                mov   es,ax

                push  ds:[0]
                pop   es:[9*4]
                push  ds:[2]
                pop   es:[9*4+2]                           ;將中斷向量表中int9中斷例程的入口恢復(fù)為原來的地址





                mov   ax,4c00h
                int   21h



        delay:  push  ax
                push  dx
                mov   dx,10h
                mov   ax,0

        s1:     sub   ax,1
                sbb   dx,0
                cmp   ax,0
                jne   s1
                cmp   dx,0
                jne   s1
                pop   dx
                pop   ax
          
          
                ret


        ;======================================
        int9:   push  ax
                push  bx

                push  es

                in    al,60h                               ;從端口60h讀取鍵盤的輸入數(shù)據(jù)

        ;原來的int調(diào)用是(取中斷碼類型)->(標(biāo)志寄存器入棧)->(if=0,tf=0)->(cs、ip入棧)->(ip=n*4,cs=n*4+2)
        ;我們將地址放到ds中,所以第一步可省,那么就剩(標(biāo)志寄存器入棧)->(if=0,tf=0)->(cs、ip入棧)->(ip=n*4,cs=n*4+2)
        ;(cs、ip入棧)->(ip=n*4,cs=n*4+2)==call dword ptr ds:[0]
        ;那么就剩(標(biāo)志寄存器入棧)->(if=0,tf=0)->call dword ptr ds:[0]三步
        ;
        ;






                pushf                                      ;標(biāo)志寄存器入棧
        ;   pushf
        ;   pop   bx
        ;   and   bh,11111100b    ;標(biāo)志寄存器if=tf=0
        ;   push  bx
        ;   popf
                call  dword ptr ds:[0]                     ;模擬int指令,調(diào)用原來的int9中斷例程

                cmp   al,1
                jne   int9ret

                mov   ax,0b800h
                mov   es,ax
                inc   byte ptr es:[160*12+40*2+1]          ;屬性值加1改變顏色


        int9ret:pop   es
                pop   bx
                pop   ax
                iret


code ends

    end start
15.5安裝新的int9中斷例程序

按下F1后屏幕顏色改變

大概思路就是先將自己寫好的int9機(jī)器碼復(fù)制粘貼到0:204

需要先將老int9的csip存到0:200

然后改變中斷信息表int9為新的int9的csip

新的int9中會(huì)使用call調(diào)用老的int9

然后進(jìn)行判斷如果是某個(gè)鍵就進(jìn)行啥啥

其實(shí)就是在原來的int9前邊加了一點(diǎn)東西

assume cs:code

stack segment stack
          db 128 dup(0)
stack ends




code segment

    start:  mov   ax,stack
            mov   ss,ax
            mov   sp,128


            push  cs
            pop   ds

            mov   ax,0
            mov   es,ax


            mov   si,offset int9
            mov   di,204h
            mov   cx,offset int9end-offset int9
            cld

            rep   movsb

            push  es:[9*4]
            pop   es:[200h]
            push  es:[9*4+2]
            pop   es:[202h]

            cli
            mov   word ptr es:[9*4],204h
            mov   word ptr es:[9*4+2],0
            sti
          



            mov   ax,4C00h
            int   21h

    int9:   push  ax
            push  bx
            push  cx

            push  es
            in    al,60h

            pushf
            call  dword ptr cs:[200h]

            cmp   al,3bh
            jne   int9ret

            mov   ax,0b800h
            mov   es,ax
            mov   bx,1
            mov   cx,2000
    s:      inc   byte ptr es:[bx]

            add   bx,2
            loop  s


    int9ret:pop   es
            pop   cx
            pop   bx
            pop   ax
            iret
    int9end:nop



code ends

end start

實(shí)驗(yàn)15 安裝新的int9中斷例程

按下“A”后除非不松開,只要松開就出現(xiàn)滿屏的"A"

直接根據(jù)前邊那個(gè)改的

先將老int9挪到一邊,在新得int9中用call調(diào)用老int9

新的int9可以在調(diào)用之后加一些功能

assume cs:code

stack segment stack
          db 128 dup(0)
stack ends

code segment

    start:  mov   ax,stack
            mov   ss,ax
            mov   sp,128


            push  cs
            pop   ds

            mov   ax,0
            mov   es,ax


            mov   si,offset int9
            mov   di,204h
            mov   cx,offset int9end-offset int9
            cld

            rep   movsb

            push  es:[9*4]
            pop   es:[200h]
            push  es:[9*4+2]
            pop   es:[202h]

            cli
            mov   word ptr es:[9*4],204h
            mov   word ptr es:[9*4+2],0
            sti
          



            mov   ax,4C00h
            int   21h

    int9:   push  ax
            push  bx
            push  cx

            push  es
            in    al,60h

            pushf
            call  dword ptr cs:[200h]

            cmp   al,1eh+80h
            jne   int9ret

            mov   ax,0b800h
            mov   es,ax
            mov   bx,0
            mov   cx,2000
    s:      mov  byte ptr es:[bx],'A'

            add   bx,2
            loop  s


    int9ret:pop   es
            pop   cx
            pop   bx
            pop   ax
            iret
    int9end:nop



code ends

end start

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站名稱:匯編語言第十五章外中斷小白筆記-創(chuàng)新互聯(lián)
瀏覽地址:http://bm7419.com/article30/didspo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、定制網(wǎng)站、網(wǎng)頁設(shè)計(jì)公司、品牌網(wǎng)站建設(shè)、企業(yè)建站、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)