組合語言 拓展實驗 對中斷的深入理解

2021-10-04 12:27:17 字數 3579 閱讀 1652

編寫兩個源程式。兩個源程式負責的工作分別是:

1、1.asm,負責重灌1號中斷。

2、2.asm,負責計算2的8次方,結果以十六進製制顯示在螢幕**。

這兩個源程式執行中,配合實現以下功能:

執行1.exe,重灌的1號中斷進入記憶體,相應的中斷向量指向新的中斷處理程式,此中斷處理程式在2.exe執行過程中為其列印ip位址提供支援。

執行2.exe,執行的過程中,隨著每一條指令的執行,螢幕上都顯示其ip位址,並且最終實現2.asm本身的功能:計算2的8次方並顯示。

所以,在重灌1號中斷的基礎上,2.exe將實現兩個功能:

1、隨著程式的執行,十六進製制顯示每一條指令的ip。

2、十六進製制顯示2的8次方的運算結果。1.asm

;重灌一號中斷

assume cs:code

code segment

start:

mov ax,cs

mov ds,ax

mov si,offset re_one

mov ax,0

mov es,ax

mov di,200h

mov cx,offset one_end-offset re_one

cldrep movsb

mov ax,0

mov es,ax

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

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

mov ax,4c00h

int 21h

re_one:

push bp

push ax

push bx

push cx

mov byte ptr es:[di],'i'

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

mov byte ptr es:[di+2],'p'

mov byte ptr es:[di+3],3

mov byte ptr es:[di+4],'='

mov byte ptr es:[di+5],3

mov bp,sp

mov ax,[bp+8]

;ip mov bx,ax

and ah,0f0h ;取高位高四位

mov cl,4

shr ah,cl

add ah,30h

mov es:[di+6],ah

mov byte ptr es:[di+7],3

and bh,0fh ;取高位低四位

add bh,30h

mov es:[di+8],bh

mov byte ptr es:[di+9],3

and al,0f0h ;取低位高四位

shr al,cl

add al,30h

mov es:[di+10],al

mov byte ptr es:[di+11],3

and bl,0fh ;取低位低四位

cmp bl,0ah

ja letter

add bl,30h

jmp short s0

letter:

add bl,37h

s0: mov es:[di+12],bl

mov byte ptr es:[di+13],3

mov byte ptr es:[di+14],'h'

mov byte ptr es:[di+15],3

add di,160

pop cx

pop bx

pop ax

pop bp

iret

one_end:

nopcode ends

end start`

2.asm

assume cs:code

code segment

start:

mov ax,0b800h

mov es,ax

mov di,160*3+2*60

pushf

pop bx

or bh,00000001b ;置tf位為1

push bx

popf

mov ax,2 ;不會顯示這條指令的ip 因為執行單步中斷的時候ip已經指向了下一條指令

mov cx,3

s: mul ax

loop s ;2^8

pushf

pop bx

and bh,00000000b ;置tf位為0

push bx

popf

mov dh,3 ;顏色

mov bx,ax

mov bp,160*12+2*10

mov byte ptr es:[bp],'2'

mov byte ptr es:[bp+1],dh

mov byte ptr es:[bp+2],'^'

mov byte ptr es:[bp+3],dh

mov byte ptr es:[bp+4],'8'

mov byte ptr es:[bp+5],dh

mov byte ptr es:[bp+6],'='

mov byte ptr es:[bp+7],dh

mov ax,bx

and ah,0f0h ;取高位高四位

mov cl,4

shr ah,cl

add ah,30h

mov es:[bp+8],ah

mov es:[bp+9],dh

and bh,0fh ;取高位低四位

add bh,30h

mov es:[bp+10],bh

mov es:[bp+11],dh

and al,0f0h ;取低位高四位

shr al,cl

add al,30h

mov es:[bp+12],al

mov es:[bp+13],dh

and bl,0fh ;取低位低四位

重灌一號中斷之後,執行2.exe會自動呼叫一號中斷,如果只用int指令就需要在每一條指令之前都加上int指令才可以實現顯示每一條指令的ip,所以這裡可以用到之前寫的乙個子程式:置標誌暫存器的tf位為一。只需在2.asm開始將tf位置為一,在2.exe執行過程中tf位始終為一,也就實現了單步中斷。

實驗中一定要注意暫存器的儲存和恢復!!!

深入理解程式設計使用linux組合語言(一)

在編譯執行第四章power函式遇到報錯,報錯資訊invalid sp address 0xffffdf2c,通過gdb定位到程式 0x40007e mov ebx,dword ptr rbp 0x8 不知道原因是啥,查資料和琢磨了半天,終於想到可能是32位程式編譯的問題,然後通過新增32位程式編譯引...

深入理解 C函式呼叫與組合語言

函式在呼叫時,需要關注的有幾個點,如何傳遞引數,如何返回到原來的地方繼續執行。今天通過檢視函式對應的彙編進行分析。函式和呼叫函式的 如下 long long add long long x,long long y long long x 3,y 7 long long a add x,y 函式add...

《組合語言》第12章 內中斷 實驗12

王老師要求 仔細跟蹤除錯,在理解整個過程之前,不要進行後面課程的學習。這個實驗的答案,在文章中都有,每一步的講解,王老師講解的都很詳細到位。需要我們好好理解?實驗結果如下,加了一點顏色?中斷 cpu不在接著 剛執行完的程式 向下執行,而去轉去處理這個特殊資訊。中斷資訊 一種特殊的資訊。要求cpu馬上...