左岸阳光

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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可取得标号偏移量。虚拟机下除法溢出中断程序变成如下:

posted on 2012-11-08 23:18  左岸阳光  阅读(835)  评论(0编辑  收藏  举报