1. 程式人生 > >彙編筆記_第十三章

彙編筆記_第十三章


title: 彙編筆記_第十三章
date: 2019-01-02 15:45:55
tags:

  • 筆記
    categories:
  • 組合語言

中斷程式設計

int 指令

int n:n為中斷型別碼,功能是引發中斷過程

定製自己的中斷

eg:將data段中的字元轉化為大寫

assume cs:code
data segment 
    db 'coversation',0
data ends

code segment
start:
    mov ax,data
    mov ds,ax
    mov si,0

    int 7ch

    mov ax,4c00h
    int 21h

code ends
end start



capital:
    push cx
    push si
change:
    mov cl,[si]
    mov ch,0
    jcxz ok
    and byte ptr [si],0DFH
    inc si
    jmp short change

ok:
    pop si
    pop cx
    iret

capitalend:nop

軟體中斷子程式的編寫

  • 儲存現場
  • STI開中斷指令;如允許中斷巢狀,則開中斷
  • 處理中斷
  • CLI關中斷指令
  • 恢復現場
  • IRET指令,返回被中斷的程式

對int,iret和棧的深入理解

用7ch中斷完成loop指令的功能

bx:儲存位移(負的)
cx: 儲存迴圈次數

所以7ch的功能有:

  • dec cx
  • 判斷(cx),不為零迴圈,為零向下執行
assume cs:code
code segment
start:
    mov ax,0b800h
    mov es,ax
    mov di,160*12

    mov bx,offset s-offset se
    mov cx,80

  s:
    mov byte ptr es:[di],'!'
    add di,2
    int 7ch
  se:nop

  mov ax,4c00h
  int 21h

code ends
end start


;int 7ch:
;直接修改IP的值到s處實現迴圈
;訪問棧需要使用bp

lp:
    push bp
    mov bp,sp
    dec cx
    jcxz lpret
    add [bp+2],bx   ;[bp+2]即為IP
lpret:
    pop bp
    iret

BIOS和DOS中斷例程

rom中存放著BIOS(基本輸入輸出系統):

  • 硬體系統的檢測和初始化程式
  • 外部中斷和內部中斷例程
  • 用於對硬體裝置進行IO操作的中斷例程
  • 其他和硬體系統相關的中斷例程

BIOS和DOS中斷例程的安裝過程

  • CPU開機加電後,初始化(CS)=0FFFFH,(IP)=0,自動從FFFF:0單元開始執行程式(該單元處為一條跳轉指令,CPU會轉去執行BIOS中的硬體系統檢測和初始化程式)
  • 初始化程式將建立BIOS所支援的中斷向量,將BIOS提供的中斷例程的入口地址登記在中斷向量表中
  • 硬體系統檢測和初始化完成後,呼叫 int 19h 進行作業系統的應道,從而將計算機交由作業系統控制
  • DOS啟動後,除完成其他工作外,還將它提供的中斷例程裝入記憶體,並建立相應的中斷向量

BIOS中斷

BIOS主要分為:

  • 系統硬體檢測和初始化程式
  • 內中斷的中斷處理程式
  • 硬體中斷的中斷處理程式
  • IO裝置及介面控制等功能模組

螢幕及游標控制 int 10h

游標控制

  • 游標大小控制
ah=01h
ch=游標開始行
cl=游標結束行
int 10h
  • 設定游標位置
ah=01h
dh=行號
dl=列號
bh=頁號
int 10h
  • 讀游標位置
ah=03h
bh=頁號
int 10h

返回值:
dh=行號
dl=列號
cx=游標大小

卷屏、清屏、開視窗

  • 選擇顯示頁
ah=05h
al=頁號
int 10h
  • 螢幕開視窗
ah=06h
al=0
bh=視窗顏色屬性
ch=左上角行號
cl=左上角列號
dh=右下角行號
dl=右下角列號
int 10h
  • 螢幕上卷
ah=06h
al=上卷行數
bh=捲入行屬性
ch=左上角行號
cl=左上角列號
dh=右下角行號
dl=右下角列號
int 10h
  • 螢幕下卷
ah=07h

字元讀與顯示

  • 讀當前游標處字元和屬性
ah=08h
bh=頁號
int 10h

返回值:
ah=屬性
al=字元
  • 顯示多個帶屬性的相同字元
ah=09h
bh=頁號
cx=字元重複個數
al=字元
bl=屬性
int 10h


7   6 5 4  3  2 1 0
bl  r g b  i  r g b
閃爍 背景 高亮 前景

DOS中斷

顯示功能呼叫

  • 顯示一個字元
ah=02h
dl=字元
int 21h
功能:螢幕上顯示一個字元,游標跟隨字元移動。檢驗DL是否為Ctrl_Break。
  • 顯示一個字元
ah=06h
dl=字元
int 21h
功能:螢幕上顯示一個字元,游標跟隨字元移動。不檢驗Ctrl_Break。
  • 顯示一串字元
ah=09h
ds:dx=字串地址
int 21h
功能:螢幕上顯示一串字元,游標跟隨字元移動。要求字串必須以$結尾。

輸入

  • 鍵入一個字元並回顯
ah=01h
int 21h
返回值:AL=字元的ASCII碼。
  • 鍵入一個字元不回顯
ah=07h
int 21h
返回值:AL=字元的ASCII碼。不檢驗鍵入的字元是否為Ctrl_Break。

(end)