編寫兩個源程式。兩個源程式負責的工作分別是:
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馬上...