项羽姓秦 发表于 2020-4-1 16:38:41

实验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

想了解具体的代码运行过程,不知道代码如何向下运行的。

项羽姓秦 发表于 2020-4-2 13:22:51

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

sos2356 发表于 2021-2-21 16:11:00

把溢出代码移到
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]
查看完整版本: 实验12很多不懂的地方,想得到一个详细的运行过程