书中示例
assume cs:codecode segment
start:mov ax,csmov ds,axmov si,offset lpmov ax,0mov es,axmov di,200hmov cx,offset end0-offset lpcldrep movsb ;lp到end0的指令传送到0:200处mov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0 ;设置7c表项的入口地址为0000:0200,也就是int 7ch时,执行lp到end0的指令mov ax,0b800hmov es,axmov di,160*12;设置bx的位移mov bx,do0-semov cx,80
do0: mov byte ptr es:[di],'!'add di,2int 7ch ;中断,cs和ip入栈。cs为do0所在的段地址,ip为执行完int 7ch后下一条指令的偏移地址;此时栈顶是se的偏移地址
se: nopmov ax,4c00hint 21hlp: push bp ;bp入栈,此时栈顶是bpmov bp,sp ;当前栈顶的偏移地址。dec cxjcxz lpret ;cx=0则转移到lpret,否则继续执行add [bp+2],bx ;bp+2为se的偏移地址;此时ip=se+bx=se+do0-se=do0lpret:pop bp ;bp出栈iret ;ip、cs、flag依次出栈,此时ip=d0的偏移地址;也就是回到do0标号处继续执行指令,直到cx=0,ip=se的偏移地址。
end0:nop mov ax,4c00hint 21hcode ends
end start
可能还可以优化,这代码看着有点多。
检测点13.1
同上。
assume cs:code
data segmentdb 'conversation',0
data ends
code segment
start:mov ax,csmov ds,axmov si,offset lpmov ax,0mov es,axmov di,200hmov cx,offset end0-offset lpcldrep movsb ;lp到end0的指令传送到0:200处mov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0 ;设置7c表项的入口地址为0000:0200,也就是int 7ch时,执行lp到end0的指令mov ax,0b800hmov es,axmov ax,datamov ds,axmov di,160*12mov si,0;设置bx的位移mov bx,offset s-offset ok
s: cmp byte ptr [si],0je okmov al,[si]mov es:[di],almov byte ptr es:[di+1],2inc siadd di,2int 7ch ;中断,cs和ip入栈。cs为s所在的段地址,ip为执行完int 7ch后下一条指令的偏移地址;此时栈顶是ok的偏移地址
ok: mov ax,4c00hint 21hlp: push bp ;bp入栈,此时栈顶是bpmov bp,sp ;当前栈顶的偏移地址。dec cxjcxz lpret ;cx=0则转移到lpret,否则继续执行add [bp+2],bx ;bp+2为ok的偏移地址;此时ip=ok+bx=ok+s-ok=slpret:pop bp ;bp出栈iret ;ip、cs、flag依次出栈,此时ip=s的偏移地址;也就是回到do0标号处继续执行指令,直到cx=0,ip=ok的偏移地址。
end0:nop mov ax,4c00hint 21hcode ends
end start