組合語言 關於int中斷問題的思考

2021-06-25 21:14:57 字數 1729 閱讀 7192

看著王爽老師的書-----對int,iret,和棧的深入理解

讓用int中斷實現loop迴圈

原版的**:

assume cs:code

code segment

start:

mov ax,0b800h

mov es,ax

mov di,160*12

mov bx,offset s-offset se

mov cx,10

s: mov byte ptr es:[di],'!'

mov byte ptr es:[di+1],2

add di,2

;dec cx

int 7ch

se: nop

mov ax,4c00h

int 21h

code ends

end start

這個是中斷例程:

assume cs:code

code segment

start:

mov ax,cs

mov ds,ax

mov si,offset lp

mov ax,0

mov es,ax

mov di,200h

mov cx,offset lpend-offset lp

cld

rep movsb ;拷貝**

;設定中斷向量表

mov ax,0

mov es,ax

mov word ptr es:[7ch*4],200h

mov word ptr es:[7ch*4+2],0

mov ax,4c00h

int 21h;;;;;;;;;

lp: push bp

mov bp,sp

dec cx

jcxz lpret

add [bp+2],bx

lpret: pop bp

iret

lpend: nop

code ends

end start

我想著能不能將26 行的dec cx 一句從中斷例程中放置到外面,然後嘗試了一下,

將dec cx 放在int 7ch下面

結果報了錯,而且中斷執行完後出現的是一段我程式中沒有出現的**

由於我用的是dosbox編寫,以為是軟體的問題,又把原版的拿出來,看見沒有那一段程式

才確定是我修改以後的錯誤

然後我又將dec cx 放在 inc 7ch 上面,結果是成功了,於是很納悶,為什麼放在上面就可以成功

用debug跟蹤後,發現到了中斷以後,系統會將當前的ip,cs以及標誌暫存器入棧儲存,以便中斷執行完後可以恢復現場,因為當前棧頂的元素依次為bp,ip,cs,標誌暫存器

然後修改的時候,要用bp+2,指向ip,因為段位址都是相同的,只是偏移位移的不同,所以只修改ip,前面s 和se 之間的位移我們已經算出,我們是用s減去的se

所以 bx中的值肯定是負值,加上ip後,會恰好指向s 從而實現了迴圈

介面中為什麼會出現程式中沒有的程式,因為修改ip的時候,多了乙個 dec cx,多佔了乙個位元組,然後導致bx中為fff1(本來是fff2),,本來s的偏移位址是 000e,由於多加了乙個,算出來的ip是 000d,程式中上乙個是mov  cx,000a,佔三個位元組,而且偏移位址是000b,所以當ip是 000d的時候會出現一些程式中沒有的**

組合語言 內中斷

內中斷 在執行完當前正在執行的指令之後,檢測到從cpu內部發過來的或內部產生的一種特殊資訊,並且可以立即對所接收到的資訊進行處理 中斷資訊可以 於cpu外部和內部 內中斷的產生 1除法錯誤 0 2單步執行 1 3執行into指令 4 into 溢位中斷 4執行int指令,該指令格式 int n 指令...

組合語言 內中斷

中斷的意思是指cpu不在接著 剛執行的指令 向下執行,而是轉去處理這個特殊資訊,而這個特殊的資訊我們可以稱其為中斷資訊。中斷資訊是要求cpu馬上進行某種處理,並向所要進行的該種處理提供了必備的引數的通知資訊。對於8086cpu,當cpu內部有下面的情況發生的時候,將產生響應的中斷資訊。而中斷資訊中必...

組合語言 外中斷

cpu在計算機系統中,除了能夠執行命令,進行運算以外,還應該能夠對外部裝置進行控制,接收它們的輸入,向它們進行輸出。也就是說,cpu除了有運算能力外,還要有i o能力。在pc系統的介面卡和主機板上,裝有各種介面晶元。這些外設介面晶元的內部有若干暫存器,cpu將這些暫存器當作埠來訪問。外設的輸入不直接...