0号中断处理程序,开始安装在0000:0200处的程序最后用死循环导致显示不出‘divided error’,改成直接退出就正常显示了。注意修改ss,sp之间的中断是不响应的。
1 assume cs : codesg, ss : stacksg 2 3 stacksg SEGMENT 4 dw 16 dup (0) 5 stacksg ENDS 6 7 8 9 codesg SEGMENT 10 11 start: mov ax, 0 12 mov es, ax 13 mov di, 200h 14 mov ax, cs 15 mov ds, ax 16 mov si, offset do0 17 mov cx, offset do0end - offset do0 18 cld 19 rep movsb 20 21 mov ax, 200h 22 mov es : [0], ax 23 mov ax, 0 24 mov es : [2], ax 25 26 mov ax, 4c00h 27 int 21h 28 29 do0: jmp short s0 30 datasg: db 'divide error!' 31 s0: mov ax, 0 32 mov es, ax 33 mov ax, 0b800h 34 mov ds, ax 35 mov si, 202h 36 mov di, 12 * 160 + 70 37 mov cx, 13 38 s: mov al, es : [si] 39 mov [di], al 40 mov al, 02h 41 mov [di + 1], al 42 add di, 2 43 add si, 1 44 loop s 45 46 mov ax, 4c00h 47 int 21h 48 49 do0end: nop 50 51 codesg ENDS 52 END start
注意有segment标识的都是段地址,否则其他标号都是物理地址,offset可取得标号偏移量。虚拟机下除法溢出中断程序变成如下: