一段复制自身的程序解决办法

一段复制自身的程序
我看到一段复制自身到20h:0的程序,但最后两条指令没有正确复制。
源代码如下:
Assembly code
assume cs:Test 
Test segment 
        mov ax,cs 
        mov ds,ax 
        mov ax,20h 
        mov es,ax 
        mov bx,0 
        mov cx,cx 
      s:mov al,ds:[bx] 
        mov es:[bx],al 
        inc bx 
        loop s 
        mov ax,4c00h 
        int 21h 
Test ends 
end

debug的结果如下:
-r
AX=0000 BX=0000 CX=001B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B85 ES=0B85 SS=0B95 CS=0B95 IP=0000 NV UP EI PL NZ NA PO NC
0B95:0000 8CC8 MOV AX,CS
-u
0B95:0000 8CC8 MOV AX,CS
0B95:0002 8ED8 MOV DS,AX
0B95:0004 B82000 MOV AX,0020
0B95:0007 8EC0 MOV ES,AX
0B95:0009 BB0000 MOV BX,0000
0B95:000C 8BC9 MOV CX,CX
0B95:000E 8A07 MOV AL,[BX]
0B95:0010 26 ES:
0B95:0011 8807 MOV [BX],AL
0B95:0013 43 INC BX
0B95:0014 E2F8 LOOP 000E
0B95:0016 B8004C MOV AX,4C00
0B95:0019 CD21 INT 21
0B95:001B C3 RET
0B95:001C F9 STC
0B95:001D C3 RET
-g 0b95:16

AX=0021 BX=001B CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B95 ES=0020 SS=0B95 CS=0B95 IP=0016 NV UP EI PL NZ NA PE NC
0B95:0016 B8004C MOV AX,4C00
-u 20:0
0020:0000 8CC8 MOV AX,CS
0020:0002 8ED8 MOV DS,AX
0020:0004 B82000 MOV AX,0020
0020:0007 8EC0 MOV ES,AX
0020:0009 BB0000 MOV BX,0000
0020:000C 8BC9 MOV CX,CX
0020:000E 8A07 MOV AL,[BX]
0020:0010 26 ES:
0020:0011 8807 MOV [BX],AL
0020:0013 43 INC BX
0020:0014 E2F8 LOOP 000E
0020:0016 CC INT 3
0020:0017 004CCD ADD [SI-33],CL
0020:001A 2100 AND [BX+SI],AX
0020:001C 0000 ADD [BX+SI],AL

可见,源程序最后两条指令是
Assembly code
mov ax,4c00h 
        int 21h

而执行了复制之后,却变成了
Assembly code
INT     3

请问这是为什么?


------解决方案--------------------
单步trace,注意最后2条的状况。
------解决方案--------------------
探讨
我用的编译器是masm 5.0,然后用debug在dos下面调试,可以单步执行,但不方便实时的查看目标地址里面值的变化。请问有没有现代一点的汇编语言编译器,要支持16位汇编的?