王爽《汇编语言》第三版 第13章 int指令 使用7ch中断处理程序实现loop功能

直接上代码:
思路:

test.asm:

        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

test.asm:

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

ins.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

效果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/include_heqile/article/details/80928421