《汇编语言第三版》王爽学习历程——实验13

这篇博客详细介绍了如何编写和应用中断例程,包括三个具体的实例:显示0结束字符串的中断例程,实现loop指令功能的中断例程,以及涉及si和bx寄存器操作的中断例程。通过汇编代码的展示和运行结果的分析,深入理解中断处理过程和技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编写、应用中断例程

第一个中断例程:
要求:
编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。
参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址。

汇编代码:

assume cs:codesg

codesg segment
        mov ax, cs
        mov ds, ax
        mov si, offset print_str    ;源地址

        mov ax, 0
        mov es, ax
        mov di, 200h                ;目标地址

        mov cx, offset print_str_end - offset print_str
        cld

        rep movsb

        mov word ptr es:[7ch*4], 200h
        mov word ptr es:[7ch*4+2], 0    ;设置中断向量表

        mov ax, 4c00h
        int 21h

 print_str: 
        push es
        push ax
        push bx
        push cx
        push dx     
        push di
        push si

        mov ax, 0b800h
        mov es, ax                   ;初始化显存

        mov al, 0a0h
        sub dh, 1
        mul dh
        mov bx, ax      ;行计算

        sub dl, 1
        add dl, dl
        mov dh, 0
        mov di, dx      ;列计算

        mov al, cl      ;输出颜色
        mov cx, 0       ;用作结束判断
        mov si, 0       ;字符串指针

   print_s:
        mov cl, [si]
        jcxz print_ok

        mov es:[bx][di], cl
        mov es:[bx][di+1], al
        inc si
        add di, 2       ;指针向后偏移

        jmp short print_s

   print_ok:
        pop si
        pop di
        pop dx
        pop cx
        pop bx
        pop ax
        pop es
        iret

   print_str_end:
        nop         ;空出一个字节来计算代码长度
codesg ends
end

运行结果:
这里写图片描述

第二个中断例程:
要求:
编写并安装int 7ch中断例程,功能为完成loop指令的功能。
参数:(cx)=循环次数,(bx)=位移。

汇编代码:

assume cs:code

code segment
 start:
        mov ax, cs
        mov ds, ax
        mov si, offset copy_loop

        mov ax, 0
        mov es, ax
        mov di, 200h

        mov cx, offset copy_loop_end - offset copy_loop
        cld

        rep movsb

        mov word ptr es:[7ch*4], 200h
        mov word ptr es:[7ch*4+2], 0

        mov ax, 4c00h
        int 21h

------------------------------------------------
--------------------copy_loop-------------------
-------参数:(cx)=循环次数,(bx)=移动位移---------
------------------------------------------------
 copy_loop:
        push bp

        dec cx
        jcxz loop_ok            ;cx为0,循环结束

        add [bp+2], bx          ;IP+位移

   loop_ok:
        pop bp
        iret

   copy_loop_end:
        nop

code ends
end start

运行结果:
这里写图片描述

第三个中断例程:
空格一:[si]
空格二:[bx]
空格三:inc si
空格四:add bx, 2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值