左岸阳光

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

(1)编写并安装int 7ch中断例程,在dh行,dl列用cl颜色属性从ds:si处输出以0结尾的字符串。

编写中断程序时要注意保护现场。安装程序如下:

 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, 0200h
14     mov ax, codesg
15     mov ds, ax
16     mov si, offset do0
17     
18     cld
19     mov cx, offset do0end - offset do0
20     rep movsb
21     
22     mov word ptr es : [07ch * 4], 0200h
23     mov word ptr es : [07ch * 4 + 2], 0
24 
25     mov ax, 4c00h
26     int 21h
27 
28 do0:    push ax
29     push es
30     push di
31     push si
32     mov ax, 0b800h
33     mov es, ax
34     mov al, dh
35     mov ah, 0
36     mov di, 160
37     mul di
38     mov di, ax
39     mov si, 2
40     mov al, dl
41     mov ah, 0
42     mul si
43     add di, ax
44     pop si
45 s:    mov al, [si]
46     mov es : [di], al
47     mov es : [di + 1], cl
48     add si, 1
49     add di, 2
50     cmp al, 0
51     jne s
52 
53     pop di
54     pop es
55     pop ax
56     iret
57 do0end: nop
58 
59 codesg ENDS
60 END start

使用int 7ch中断例程:

View Code
 1 datasg segment
 2     db 'welcome to masm!', 0
 3 datasg ends
 4 
 5 codesg SEGMENT:
 6 
 7 start:    mov ax, datasg
 8             mov ds, ax
 9             mov si, 0
10             mov cl, 02h
11             mov dh, 12
12             mov dl, 36    
13             int 7ch       
14                 mov ax, 4c00h
15                 int 21h
16 codesg ENDS
17 END start

 

(2)编写安装int 7ch中断,完成loop指令功能,cx为循环次数,bx为偏移位移。

 1 ;中断时的入栈顺序是pushf,push cs, push ip
 2 assume cs : codesg, ss : stacksg
 3 
 4 stacksg SEGMENT
 5     dw 16 dup (0)
 6 stacksg ENDS
 7 
 8 
 9 
10 codesg SEGMENT
11 
12 start:    mov ax, 0
13         mov es, ax
14         mov di, 0200h
15         mov ax, codesg ;需要安装的程序所在的段
16         mov ds, ax
17         mov si, offset int7c ;需要安装的程序的偏移
18 
19         mov cx,  offset int7cend - offset int7c
20         cld
21         rep movsb
22 
23         mov word ptr es : [7ch * 4], 0200h
24         mov word ptr es : [7ch * 4 + 2], 0
25 
26         mov ax, 4c00h
27         int 21h
28 
29 int7c:     push si
30         push bp
31         mov bp, sp
32         add bp, 4   ;find the pre-ip
33         mov si, ss : [bp] ;赋值ip->si
34         dec cx
35         jcxz s
36         add si, bx    ;cx不为0则改变栈中的ip值
37         mov ss : [bp], si
38     s:    pop bp
39         pop si
40         iret
41 int7cend:    nop
42 codesg ENDS
43 END start
44             

之后测试int 7ch时在第一行循环打印‘a’,结果没有出现,原因是命令行换行把显存里的东西刷新了。

测试结果:

posted on 2012-11-09 10:47  左岸阳光  阅读(1243)  评论(0编辑  收藏  举报