bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

匯編語言第十五章外中斷小白筆記-創新互聯

15.1 接口芯片和端口

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

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

cpu通過端口和外部設備進行聯系。

15.2 外中斷信息

來自外部的中斷信息

外部中斷原有兩類:

第一類:可屏蔽中斷源

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

內中斷的過程:

(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鍵盤的處理過程

    • 鍵盤輸入

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

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

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

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

就是:

斷碼=通碼+80h
    • 引發9號中斷

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

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

    • 執行int9中斷例程

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

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

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

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

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

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

  1. 掃描碼送入60h端口

  1. 引發9號中斷

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

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

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

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讀取鍵盤的輸入數據

        ;原來的int調用是(取中斷碼類型)->(標志寄存器入棧)->(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指令,調用原來的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調用老的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”后除非不松開,只要松開就出現滿屏的"A"

直接根據前邊那個改的

先將老int9挪到一邊,在新得int9中用call調用老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,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

你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧

網站名稱:匯編語言第十五章外中斷小白筆記-創新互聯
瀏覽地址:http://vcdvsql.cn/article30/didspo.html

成都網站建設公司_創新互聯,為您提供用戶體驗定制網站、網頁設計公司、品牌網站建設企業建站品牌網站制作

廣告

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

小程序開發