实验要求:
编写两个源程序。两个源程序负责的工作分别是:
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、思考1号中断的机制。
2、显示IP是1.exe实现的,2.exe执行中自动调用,不是要在2.asm中写这个功能。
3、尽量精简代码。
先上代码
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
cld
rep 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:
nop
code 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 ;取低位低四位
add bl,30h
mov es:[bp+14],bl
mov es:[bp+15],dh
mov byte ptr es:[bp+16],'H'
mov byte ptr es:[bp+17],dh
mov ax,4c00h
int 21h
code ends
end start
结果
关键点
重装一号中断之后,执行2.exe会自动调用一号中断,如果只用int指令就需要在每一条指令之前都加上int指令才可以实现显示每一条指令的IP,所以这里可以用到之前写的一个子程序:置标志寄存器的TF位为一。只需在2.asm开始将TF位置为一,在2.exe执行过程中TF位始终为一,也就实现了单步中断。
实验中一定要注意寄存器的保存和恢复!!!