汇编语言(第3版,王爽著):实验13-2 编写、应用中断例程 实现 loop 指令的功能

实验13-2 编写、应用中断例程-实现 loop 指令的功能

1. 思路:

可以参考第 13 章中的例子

2. int 7ch 中断例程代码:

文件名:exp132.asm

assume cs:code

code segment
    start:
        mov ax, cs
        mov ds, ax
        mov si, offset lp                       ; 设置 ds:si 指向源地址
        mov ax, 0
        mov es, ax
        mov di, 200h                            ; 设置 es:di 指向目的地址
        mov cx, offset lpend - offset lp        ; 设置 cx 为传输长度
        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


    lp:
        push bp                     ; 将 bp 的值入栈,并且当前栈顶 sp 改变 (sp)=(sp)-2
        mov bp, sp                  ; 将当前栈顶的值送入 bp 中
        dec cx
        jcxz lpret                  ; 如果 cx 为 0,则不改变栈中的偏移地址,直接返回
        add ss:[bp + 2], bx         ; ((ss)*16 + (bp) + 2) 就是栈中的偏移地址,加上位移,就等于了 s 标号处的地址
    lpret:
        pop bp
        iret                        ; 未改变的栈中的偏移地址 或 改变了的栈中的偏移地址,此时也出栈


    lpend:
        nop
code ends

end start

3. 跟踪程序代码:

文件名:exp132d.asm

assume cs:code

code segment
    start:
        mov ax, 0b800h
        mov es, ax
        mov di, 160*12
        mov bx, offset s - offset se        ; 设置从标号 se 到标号 s 的转移位移
        mov cx, 80

    s:
        mov byte ptr es:[di], '!'
        add di, 2
        int 7ch                             ; 如果 (cx) != 0,转移到标号 s 处

    se:
        nop
        mov ax, 4c00h
        int 21h
code ends

end start

4. 程序运行效果:

程序运行效果

5. Debug 跟踪调试过程:

Debug 跟踪调试过程

posted @ 2022-05-26 13:09  夏夜星空晚风  阅读(76)  评论(0编辑  收藏  举报