看著王爽老師的書-----對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將這些暫存器當作埠來訪問。外設的輸入不直接...