;问题:用中断例程完成loop指令的功能
;应用举例:在屏幕中断显示80个'!'?
1.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 ;rep 为cx!=0 继续 拷贝[movsb] ;设置7ch中断例程的入口地址 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 ;7ch中断例程 lp: push bp mov bp, sp dec cx jcxz lpert add ss:[bp+2], bx ;ss:[bp+2] 为 int 7ch 下一条指令的第一个字节 地址 ;bx为 s标号 到 int 7ch 下一条指令的第一个字节 地址 的偏移地址 lpert: pop bp iret lpend: nop code ends end start
2.asm
;实现loop
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], '!' mov byte ptr es:[di+1], 0ah add di, 2 ;loop s int 7ch ;如果(cx)!=0,转移到标号s处 se: nop mov ax, 4c00h int 21h code ends end start