使用中断处理程序实现loop功能

思路:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
assume cs:code
 
code segment
start:  mov ax, 0b800h
        mov es, ax
        mov di, 160*12
 
        mov bx, offset s-offset se
        mov cx, 80
    s:  mov byte ptr es:[di], '!'
        add di, 2
        int 7ch
    se: nop
 
        mov ax, 4c00h;
        int 21h
code ends
end start
 
在7ch中断处理程序中,需要返回到s处来完成循环
在跳转到7ch时,cs和ip入栈,ip存放的正是se的偏移量
bx=s-se,现在我们得到了se的偏移量,只需要加上bx就能得到
s的偏移量了
因此在处理程序中,我们使用下面这段代码:
    show:       push bp
                mov bp, sp
                dec cx
                jcxz showret
                add [bp+2], bx
    showret:    pop bp
                iret
    分析一下这段代码,访问栈段内存,所以要使用bp寄存器
    先保存他的值,然后让他指向栈顶,现在的栈中存储的数据是这样的:
        +----+  每次将cx的值减1,当cx值为0时,恢复bp的值并返回
        | bp |  如果cx的值不为0,就修改ip的值,将其加上bx,得到标号s的
        +----+  偏移地址,然后恢复bp的值,执行iret指令,相当于
        | ip |  pop ip      pop cs
        +----+  这样一来,程序就会执行到s标号处
        | cs |  如果add [bp+2], bx没有被执行,当iret执行完之后
        +----+  就会执行到se处,这时程序也就结束了
        |flag| 
        +----+  完整的安装程序:
        |····|  assume cs:code
        +----+ 
                code segment
                start:  mov ax, cs
                        mov ds, ax
                        mov si, offset show
                        mov ax, 0
                        mov es, ax
                        mov di, 200h
                        mov cx, offset showend-offset show
                        cld
                        rep movsb
 
                        mov ax, 0
                        mov es, ax
                        mov word ptr es:[7ch*4], 200h
                        mov word ptr es:[7ch*4+2], 0
 
                        mov ax, 4c00h
                        int 21h
 
                show:   push bp
                        mov bp, sp
                        dec cx
                        jcxz showret
                        add [bp+2], bx
                showret:pop bp
                        iret
                showend:nop
 
                code ends
                end start

t2.asm:  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
assume cs:code
 
code segment
start:  mov ax, 0b800h
        mov es, ax
        mov di, 160*12
 
        mov bx, offset s-offset se
        mov cx, 80
    s:  mov byte ptr es:[di], '!'
        mov byte ptr es:[di+1], 02h
        add di, 2
        int 7ch
    se: nop
 
        mov ax, 4c00h;
        int 21h
code ends
end start
t1.asm(安装程序)
 
assume cs:code
 
code segment
start:  mov ax, cs
        mov ds, ax
        mov si, offset show
        mov ax, 0
        mov es, ax
        mov di, 200h
        mov cx, offset showend-offset show
        cld
        rep movsb
 
        mov ax, 0
        mov es, ax
        mov word ptr es:[7ch*4], 200h
        mov word ptr es:[7ch*4+2], 0
 
        mov ax, 4c00h
        int 21h
 
show:   push bp
        mov bp, sp
        dec cx
        jcxz showret
        add [bp+2], bx
showret:pop bp
        iret
showend:nop
 
code ends
end start  

  

 

运行过程:

先运行t1.exe,安装中断程序

再通过debug调试t2.exe

运行至int 7ch处时如下所示:

 

 

 可以看出此时的CS 、IP、和栈中的内容,栈中的数值为之前单步中断保存的flag、CS、IP等寄存器的值,再执行一步-t,进入中断服务函数,如下所示

 

 此时栈顶指针为FFFA(指向1C),其中076A为保存的CS,001C为保存的IP值,继续执行两次-t,看到:

 

SP变为FFF8指向(00),BP的值0000入栈后,将SP的值赋值给了BP。继续多次执行-t后如图:

 

 栈中保存的IP值已经被重新赋值为000E(001c+FFF2),继续执行如下:

 

 将栈中的BP、IP、CS、flag寄存器依次出栈,栈顶指针SP变为0000.程序将会跳到S处继续运行,

至此,完成了第一次循环。后面的循环调用过程类似

 

posted on   lh03061238  阅读(204)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2019-07-15 UBOOT2016.05 看门狗

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示