1. 程式人生 > 其它 >組合語言(第3版,王爽著):實驗12 編寫 0 號中斷的處理程式

組合語言(第3版,王爽著):實驗12 編寫 0 號中斷的處理程式

  • 我們要做以下幾個事情:
  1. 編寫可以顯示 "divide error!" 的中斷處理程式:do0
  2. 將 do0 送入記憶體 0000:0200 處
  3. 將 do0 的入口地址 0000:0200 儲存在中斷向量表 0 號表項中
  4. 編寫一個除法溢位的測試程式,用於觸發除法錯誤,產生內中斷
  • 程式碼實現:

檔名:exp12.asm

assume cs:code

code segment

    start:
        mov ax, cs
        mov ds, ax
        mov si, offset do0                      ; 設定 ds:si 指向源地址

        mov ax, 0
        mov es, ax
        mov di, 200h                            ; 設定 es:di 指向目的地址

        mov cx, offset do0end - offset do0      ; 設定 cx 為傳輸長度
        cld                                     ; 設定傳輸方向為正
        rep movsb

        ; 設定中斷向量表
        mov ax, 0
        mov es, ax
        mov word ptr es:[0 * 4], 200h           ; 中斷處理程式的偏移地址
        mov word ptr es:[0 * 4 + 2], 0h         ; 中斷處理程式的段地址

        mov ax, 4c00h
        int 21h


    do0:
        jmp short do0start
        db "divide error!"
    do0start:
        mov ax, cs
        mov ds, ax
        mov si, 202h                            ; 設定 ds:si 指向字串

        mov ax, 0b800h
        mov es, ax
        mov di, 12*160 + 36*2                   ; 設定 es:di 指向視訊記憶體空間的中間位置

        mov cx, 13                              ; 設定 cx 為字串的長度
    s:
        mov al, ds:[si]
        mov es:[di], al
        mov byte ptr es:[di + 1], 02h           ; 設定字元屬性
        inc si
        add di, 2
        loop s

        mov ax, 4c00h
        int 21h


    do0end:
        nop

code ends

end start
  • 跟蹤除錯過程:

  • 測試程式:
    參考書本第 12 章中的例子,編寫一個除法溢位的測試程式

檔名:exp12div.asm

assume cs:code

code segment
    start:
        mov ax, 1000h
        mov bh, 1
        div bh

        mov ax, 4c00h
        int 21h
code ends

end start
  • 測試程式的聯調測試過程: