自定义loop指令-在屏幕中间显示80个!

我们需要自己定义一个loop指令,然后在屏幕中间去显示80个!,loop指令其实做的事情就是一个短转移指令做的时候就是(cx)=(cx)-1,如果cx!=0,那么就让(IP)=(IP)+8位位移,所以我们下面需要准备的就是一个是用cx来放循环的次数,然后还有就是用bx来存放位移

程序如下所示

assume cs:code

code segment

    start:mov ax,cs
          mov ds,ax
          mov si,offset lp
          mov ax,0
          mov es,ax
          mov di,200h ;从0:200是放示例程序的地方
          mov cx,offset ok - 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,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 ;之所以这里di+2是因为一个字节是字符,一个字节是字符的属性
          int 7ch
        se:nop

           mov ax,4c00h
           int 21h

       lp:push bp ;中断程序
          mov bp,sp
          dec cx
          jcxz lpret
          add [bp+2],bx
    lpret:pop bp
          iret   

       ok:nop

code ends
end start

执行结果
这里写图片描述

输出80个!之后的值
这里写图片描述

这里写图片描述

这里再简单的介绍下中断处理程序

   lp:push bp ;先压入bp
          mov bp,sp ;将sp给bp也就是将栈顶指针给bp
          dec cx ;然后cx减1就是为了模拟loop指令
          jcxz lpret ;如果cx为0了就直接跳到lpret处,然后pop出数据返回
          add [bp+2],bx ;首先我们要明白栈中的数据从栈顶到栈底分别为bp的原先的值,se的偏移地址,然后是cs寄存器的值装的也就是s的段地址,然后再是标志寄存器的值,所以bp+2的值就是se的偏移地址加上bx就为s的偏移地址了
    lpret:pop bp ;pop出数据
          iret   ;做的就是pop IP,pop CS popf

猜你喜欢

转载自blog.csdn.net/zcmuczx/article/details/80368150