书上写好的的程序
assume cs:code
data segment
db "welcome to masm",0
data ends
code segment
start:mov dh,10
mov dl,10
mov cl,2
mov ax,data
mov ds,ax
mov si,0
;pushf
;popf
int 7ch
mov ax,4c00h
int 21h
code ends
end start
安装07ch中断例程代码
assume cs:code
code segment
start:mov ax,cs
mov ds,ax
mov si,offset dis
mov ax,0
mov es,ax
mov di,200h
mov cx, offset disend-offset dis
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
dis:mov ax,0b800h
mov es,ax
mov ah,0
mov al,160
dec dh
mul dh
mov di,ax
mov al,2
dec dl
mul dl
add di,ax
mov ch,0
mov ah,cl
s:mov cl,[si]
jcxz myend
mov al,cl
mov es:[di],ax
add di,2
inc si
jmp s
myend:iret
disend:nop
code ends
end start
单步跟踪
- 一开始想法是根据执行t命令后显示的flag register标志位的值得出flag register这一个字节的值,后来发现flag register不作为flag位的值不知道,于是在代码中写了pushf和popf来显示flag register的值
结果如下:
即flag register的值位7202H - 执行过程中CS,IP以及栈中数值变化
(1)未执行中断例程前栈以及cs和ip的值
压入栈的ip是int 7ch
后的一行代码的ip,即0010H
执行中断例程后,cs变为0,ip为0200,栈中分别压入flag register,ip,cs
执行中断例程到iret
,执行完iret
后,cs,ip,flag register恢复为原来的值
继续执行主程序,直到结束