汇编语言(第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 跟踪调试过程
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容