当cpu执行除法时发生溢出时,执行该程序。添上了注释,其中有一个问题还没有解决,有时间再来看看,毕竟我看来还是个比较重要的问题。本来寒假抽空打算把上次写的一个U disk Virus 写下注释,也算作为win32SDK的告别,看起来时间不允许了~~
assume cs:codesg
codesg segment
main: mov ax , cs ; 设置源地址
mov ds , ax
mov si , offset do0
mov ax , 0 ; 设置目的地址,即是0:200h
mov es , ax
mov di , 200h
mov cx , offset do0end-offset do0 ; 设置cx,传送个数
cld
rep movsb
mov ax , 0 ; 设置中断向量表
mov es , ax
mov word ptr es: [ 0 ] , 200h ; 注意低地址存放偏移地址 高地址存放段地址
mov word ptr es: [ 2 ] , 0h
mov ax , 4c00h
int 21h
do0: jmp short dostart ; 下条语句是定义字符串 执行时跳过
codesg segment
main: mov ax , cs ; 设置源地址
mov ds , ax
mov si , offset do0
mov ax , 0 ; 设置目的地址,即是0:200h
mov es , ax
mov di , 200h
mov cx , offset do0end-offset do0 ; 设置cx,传送个数
cld
rep movsb
mov ax , 0 ; 设置中断向量表
mov es , ax
mov word ptr es: [ 0 ] , 200h ; 注意低地址存放偏移地址 高地址存放段地址
mov word ptr es: [ 2 ] , 0h
mov ax , 4c00h
int 21h
do0: jmp short dostart ; 下条语句是定义字符串 执行时跳过
do0word: db 'overflow!'
;
必须把字符串放在内存空闲的地方
do0start: mov ax , cs ; 把overflow放在显存当中
mov ds , ax
mov si , 202h ; 设置字符串首地址 如果设置offset do0word等不到正确地址 不知为何
mov ax , 0b800h
mov es , ax
mov di , 12 * 160 + 36 * 2
mov cx, 9
s: mov al , [ si ]
mov es: [ di ] , al
do0start: mov ax , cs ; 把overflow放在显存当中
mov ds , ax
mov si , 202h ; 设置字符串首地址 如果设置offset do0word等不到正确地址 不知为何
mov ax , 0b800h
mov es , ax
mov di , 12 * 160 + 36 * 2
mov cx, 9
s: mov al , [ si ]
mov es: [ di ] , al
mov es:[di+1],02h
inc si
add di , 2
loop s
mov ax , 4c00h
int 21h
inc si
add di , 2
loop s
mov ax , 4c00h
int 21h
do0end: nop
codesg ends
end main
codesg ends
end main
需要注意以下几点:
1.安装程序分为两步:第一步 把do0的代码拷至0;200H,注意拷贝代码时设置cx的技巧;第二步:设置中断向量
2.设置字符串首地址问题,待解决