日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

int指令---汇编学习笔记

發布時間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 int指令---汇编学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

int指令

int指令可以引發中斷


13.1 int指令

int指令格式:int n,n為中斷類型碼,它的功能是引發中斷過程。

CPU執行int n指令,相當于引發一個n號中斷的中斷過程,執行過程如下。

  • 取中斷類型碼n
  • 標志寄存器入棧,IF=0、TF=0
  • CS、IP入棧
  • (IP)=(n?4),(CS)=(n?4+2)(IP)=(n?4),(CS)=(n?4+2)

  • 13.2 編寫供應用程序調用的中斷例程

    很簡單的例子自己看。


    13.3 對int、iret和棧的深入理解

    用int 7ch來模擬loop指令,挺復雜的。

    大致步驟如下:

  • int引發中斷的過程,將CS、IP入棧
  • 將棧中的(IP)=(IP)?(loop?loop)(IP)=(IP)?(loop指令位置?loop標號位置)
  • 執行iret指令,將CS、IP彈出
  • 例子:

    將上面的例子簡單概括一下:

  • int 7ch引發中斷,將CS、IP入棧
  • 7ch中斷例程中的add [bp+2],bx是將入棧后的IP改為s標號處的IP
  • iret指令執行后,將CS、IP彈出,將指令執行位置重新定位到s標號處
  • 如果cx等于0,那么將不會執行add [bp+2],bx,這樣程序將向下繼續執行
  • 檢測點 13.1
    (1)在上面的內容中,我們用7ch中斷例程實現loop的功能,則上面的7ch中斷例程所能進行的最大轉移位移是多少?
    答:必須在1個字所能存儲的范圍以內,也就是0000~FFFF,容量大小是65536。
    (2)用7ch中斷例程完成jmp near ptr s指令的功能,用bx向中斷例程傳送轉移位移。
    應用舉例:在屏幕的第12行,顯示data段中以0結尾的字符串。

    assume cs:code data segmentdb 'conversation',0 data endscode segmentstart:mov ax,datamov ds,axmov si,0mov ax,0b800hmov es,axmov di,12*160s:cmp byte ptr [si],0je okmov al,[si]mov es:[di],alinc siadd di,2mov bx,offset s-offset okint 7chok:mov ax,4c00hint 21hcode ends end start

    int 7ch中斷例程及安裝

    assume cs:codecode segmentstart:mov ax,csmov ds,axmov si,offset smov ax,0mov es,axmov di,200hmov cx,offset se-offset scldrep movsbmov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0mov ax,4c00hint 21hs:push bpmov bp,spadd [bp+2],bxpop bpiretse:nopcode ends end start

    完整程序:

    assume cs:code data segmentdb 'conversation',0 data endscode segmentstart:mov ax,csmov ds,axmov si,offset smov ax,0mov es,axmov di,200hmov cx,offset se-offset scldrep movsbmov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0mov ax,datamov ds,axmov si,0mov ax,0b800hmov es,axmov di,12*160s1:cmp byte ptr [si],0je okmov al,[si]mov es:[di],alinc siadd di,2mov bx,offset s1-offset okint 7chok:mov ax,4c00hint 21hs:push bpmov bp,spadd [bp+2],bxpop bpiretse:nopcode ends end start

    13.4 BIOS和DOS所提供的中斷例程

    BIOS中主要包括以下幾部分內容。

  • 硬件系統的檢測和初始化程序
  • 外部中斷和內部中斷的中斷例程
  • 用于對硬件設備進行I/O操作的中斷例程
  • 其他和硬件系統相關的中斷例程
  • 操作系統DOS也提供了中斷例程,從操作系統的角度來看,DOS的中斷例程就是操作系統向程序員提供的編程資源。

    BIOS和DOS在所提供的中斷例程中包含了許多子程序,這些子程序實現了程序員在編程的時候經常需要用到的功能。程序員在編程的時候,可以用int指令直接調用BIOS和DOS提供的中斷例程,來完成某些工作。

    和硬件設備相關的DOS中斷例程中,一般都調用了BIOS的中斷例程。


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

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

  • 開機后,CPU一加電,初始化(CS)=0FFFFH,(IP)=0,自動從FFFF:0單元開始執行程序。FFFF:0處有一條轉跳指令,CPU執行該指令后,轉去執行BIOS中的硬件系統檢測和初始化程序。
  • 初始化程序將建立BIOS所支持的中斷向量,即將BIOS提供的中斷例程的入口地址登記在中斷向量表中。注意,對于BIOS所提供的中斷例程,只需將入口地址登記在中斷向量表中即可,因為它們是固化到ROM中的程序,一直在內存中存在。
  • 硬件系統檢測和初始化完成后,調用int 19h進行操作系統的引導。從此將計算機交由操作系統控制。
  • DOS啟動后,除完成其他工作外,還將它所提供的中斷例程裝入內存,并建立相應的中斷向量。
  • 檢測點 13.2
    判斷下面說法的正誤:
    (1)我們可以編程改變FFFF:0處的指令,使得CPU不去執行BIOS中的硬件系統檢測和初始化程序。
    答:不行,因為BIOS的中斷例程是ROM(只讀)。
    (2)int 19h中斷例程,可以由DOS提供。
    答:不行,因為int 19h是用來啟動DOS的。而DOS不能在沒被啟動的情況下提供int 19h。


    13.6 BIOS中斷例程應用

    自行閱讀,略過。


    13.7 DOS中斷例程應用

    這里說明一個內容,其他自行閱讀,略過。

    mov ah,4c ;程序返回 mov al,0 ;返回值 int 21h

    實驗13 編寫、應用中斷例程

    (1)編寫并安裝int 7ch中斷例程,功能為顯示一個用0結束的字符串,中斷例程安裝在0:200處。
    參數:(dh)=行號,(dl)=列號,(cl)=顏色,ds:si指向字符串首地址。

    assume cs:code data segmentdb 'welcome to masm!',0 data ends code segmentstart:mov dh,10mov dl,10mov cl,2mov ax,datamov ds,axmov si,0int 7chmov ax,4c00hint 21h code ends end start

    7ch中斷例程編寫及其安裝

    assume cs:code code segmentstart:mov ax,csmov ds,axmov si,offset smov ax,0mov es,axmov di,200hmov cx,offset se-offset scldrep movsbmov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0mov ax,4c00hint 21h s:mov ax,0b800hmov es,axmov ax,160mul dhmov di,axmov ax,2mul dladd di,axsl:mov al,ds:[si]mov ah,0cmp ah,alje okmov ah,clmov es:[di],axinc siadd di,2jmp slok:iretse:nopcode ends end start

    實驗結果:

    (2)編寫并安裝int 7ch中斷例程,功能為完成loop指令的功能。
    參數:(cx)=循環次數,(bx)=位移。

    assume cs:code code segmentstart:mov ax,0b800hmov es,axmov di,160*12mov bx,offset s-offset semov cx,80s:mov byte ptr es:[di],'!'add di,2int 7chse:nopmov ax,4c00hint 21h code ends end start

    7ch中斷例程及其安裝:

    assume cs:code code segmentstart:mov ax,csmov ds,axmov si,offset smov ax,0mov es,axmov di,200hmov cx,offset se-offset scldrep movsbmov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0mov ax,4c00hint 21h s:push bpmov bp,spdec cxjcxz okadd [bp+2],bxok:pop bpiretse:nopcode ends end start

    實驗結果:

    (3)下面的程序,分別在屏幕的第2、4、6、8行顯示4句英文詩,補全程序。

    assume cs:code code segments1:db 'Good,better,best,','$'s2:db 'Never let it rest,','$'s3:db 'Till good is better,','$'s4:db 'And better,best.','$'s:dw offset s1,offset s2,offset s3,offset s4row:db 2,4,6,8start:mov ax,csmov ds,axmov bx,offset smov si,offset rowmov cx,4ok:mov bh,0mov dh,mov dl,0mov ah,2int 10hmov dx,mov ah,9int 21hloop okmov ax,4c00hint 21h code ends end start

    實驗結果:

    總結

    以上是生活随笔為你收集整理的int指令---汇编学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。