彙編筆記_第十三章
阿新 • • 發佈:2019-01-02
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)