汇编语言王爽第三版 实验12 0号中断的处理程序

实验 编写0号中断处理程序

先来梳理几个书上没仔细讲的指令,后面要用。


MOVSB REP CEL

MOVSB即字符串传送指令,这条指令按字节传送数据。通过SI和DI这两个寄存器控制字符串的源地址和目标地址,比如DS:SI这段地址的N个字节复制到ES:DI指向的地址,复制后DS:SI的内容保持不变。

MOVSB 的英文是 move string byte,意思是搬移一个字节,
它是把 DS:SI 所指地址的一个字节搬移到 ES:DI 所指的地址上,搬移后原来的内容不变,但是原来 ES:DI 所指的内容会被覆盖而且在搬移之后 SI 和 DI 会自动地指向下一个要搬移的地址。 一般而言,通常程序设计师一般并不会只搬一个字节,通常都会重复许多次,
如果要重复的话,就得把重复次数 ( 也就是字串长度 ) 先记录在 CX 寄存器,
并且在 MOVSB 之前加上 REP 指令,
REP 是重复 (repeat) 的意思。这种写法很是奇怪,一般而言汇编语言源文件的每一行都只有一个指令,但 REP MOVSB 却可以在同一行写两个指令,当然分开写也是一样的。

通过标志位DF控制移动的方向,CLD(CLear Direction flag)则是清方向标志位,也就是使DF的值为0,在执行串操作时,使地址按递增的方式变化,这样便于调整相关段的的当前指针。这条指令与STD(SeT Direction flag)的执行结果相反,即置DF的值为1。
例如:

MOV CX ,100
LEA SI,FIRST
LEA DI,SECOND
REP MOVSB
以上程序段的功能是从缓冲区FIRST传送100个字节到SECOND缓冲区.

程序中就是通过这些步骤,把中断程序写入目标地址的。

实际运行结果
屏幕中间 白底蓝字 处显示了字符串"divide error!"
在这里插入图片描述

assume cs:code
    code segment
    start:  mov ax,cs
            mov ds,ax
            mov si,offset do0
            
            mov ax,0
            mov es,ax
            mov di,200H
            
            mov cx,offset do0end - offset do0 ;这一步是用来测量转移代码长度
            cld
            rep movsb    ;这两步代码请参考上面的解释
            
            
            mov ax,0
            mov es,ax
            mov word ptr es:[0*4],200H    
            mov word ptr es:[0*4+2],0
            ;以上的代码是设置中断表,
            也就是说将执行中断程序代码所在的地址写进去让中断机制调用
            
            
            
            mov ax,4c00H
            int 21H
            
            
        do0:    jmp short do0Start
                db 'divide error!'
            
        do0Start:   mov ax,cs
                    mov ds,ax
                    mov si,202H
                    
                    
                    mov ax,0B800H
                    mov es,ax
                    mov di,12*160+36*2
                ;这是显示器中间位置的
                
                    mov ah,71H;这是设置字体的样式,详细去见好像是第十章的实验这样子
                    mov cx,13
                s:  mov al,[si]
                    mov es:[di],al
                    mov es:[di+1],ah
                    inc si
                    add di,2
                    loop s
            
                    mov ax,4c00H
                    int 21H
            do0end: nop
                
        code ends
        end start
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值