实验12很多不懂的地方,想得到一个详细的运行过程
附代码assume cs:code
code segment
start:mov ax,cs
mov ds,ax
mov si,offset do0
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do0end - offset do0
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:,200h
mov word ptr es:,0
mov ax,4c00h
int 21h
do0:jmp short do0start
db "divide error!"
do0start:
mov ax,cs
mov ds,ax
mov si,202h
mov ax,0b800h
mov es,ax
mov di,12*160+36*2
mov cx,13
s: mov al,
mov es:,al
inc si
add di,1
mov al,02h
mov es:,al
add di,1
loop s
mov ax,4c00h
int 21h
do0end:nop
code ends
end start
溢出代码:
assume cs:code
code segment
start:
mov ax,1000h
mov cl,1
div cl
code ends
end start
想了解具体的代码运行过程,不知道代码如何向下运行的。 assume cs:code
code segment
start:mov ax,cs
mov ds,ax
mov si,offset do0
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do0end - offset do0
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:,200h
mov word ptr es:,0
mov ax,4c00h
int 21h
; 这个程序是将以下程序装入“安全空间”
; 以下程序并不是现在运行的,是等到CPU触发了零号中断才会通过索引中断号来运行的。
; 事实上就是两个程序。
do0:jmp short do0start
db "divide error!"
do0start:
mov ax,cs
mov ds,ax
mov si,202h
mov ax,0b800h
mov es,ax
mov di,12*160+36*2
mov cx,13
s: mov al,
mov es:,al
inc si
add di,1
mov al,02h
mov es:,al
add di,1
loop s
mov ax,4c00h
int 21h
do0end:nop
code ends
end start
把溢出代码移到
mov word ptr es:,0 后面
mov ax,1000h
mov cl,1
div cl
就可以看到效果了,这里会触发溢出,然后去中断向量表中查询0号中断,此时0号中断的内容为00 02 00 00,也就是去执行0000:0200处的代码,0000:0200处的代码就是从do0开始到do0end的那部分代码,代码的功能就是在b800:12*160+36*2处开始,显示字符串'divide error'
页:
[1]