欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

15.1 接口芯片和端口

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

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

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

15.2 外中斷信息

來自外部的中斷信息

外部中斷原有兩類:

第一類:可屏蔽中斷源

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

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

(1)取中斷類型碼n

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

(3)cs、ip入棧

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

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

指令:

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

cpu必須響應。

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

過程:

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

(2)cs ip入棧

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

15.3pc鍵盤的處理過程

    • 鍵盤輸入

鍵盤中每個按鍵相當于一個開關,鍵盤中有一個芯片對鍵盤上的每一個鍵的開關狀態(tài)進行掃描。

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

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

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

就是:

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

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

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

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

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

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

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

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

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

BIOS鍵盤換緩沖區(qū)是系統(tǒng)啟動后,BIOS用于存放int9 中斷例程所接受的鍵盤輸入的內(nèi)存區(qū)。該內(nèi)存區(qū)可以存儲15個鍵盤輸入(15個字型數(shù)據(jù)),因為int9 中斷例程除了接收掃描碼外還要產(chǎn)生掃描碼對應的字符碼,所以在BIOS鍵盤緩沖區(qū)中,一個鍵盤輸入用一個字單元存放,高位存放掃描碼,低位存放字符碼(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號中斷

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

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

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

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

改變顏色

那個咱就是說代碼一定不要放到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                        ;在中斷向量表中設置新的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中斷例程的入口恢復為原來的地址





                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)用是(取中斷碼類型)->(標志寄存器入棧)->(if=0,tf=0)->(cs、ip入棧)->(ip=n*4,cs=n*4+2)
        ;我們將地址放到ds中,所以第一步可省,那么就剩(標志寄存器入棧)->(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]
        ;那么就剩(標志寄存器入棧)->(if=0,tf=0)->call dword ptr ds:[0]三步
        ;
        ;






                pushf                                      ;標志寄存器入棧
        ;   pushf
        ;   pop   bx
        ;   and   bh,11111100b    ;標志寄存器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機器碼復制粘貼到0:204

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

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

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

然后進行判斷如果是某個鍵就進行啥啥

其實就是在原來的int9前邊加了一點東西

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

實驗15 安裝新的int9中斷例程

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

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

先將老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)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

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

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

廣告

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

小程序開發(fā)