我们需要自己定义一个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