汇编程序44:检测点13.1 (jmp near ptr 标号指令的中断例程)
1 安装程序: 2 assume cs:code 3 //jmp near ptr 标号指令的替代实现,使用iret指令 4 code segment 5 start: 6 mov ax,cs 7 mov ds,ax 8 mov si,offset sub1 9 mov ax,0020h 10 mov es,ax 11 mov di,0 12 mov bx,offset sub2 - offset sub1 13 cld 14 rep movsb 15 mov ax,0 16 mov es,ax 17 mov word ptr es:[7ch*4],200h 18 mov word ptr es:[7ch*4+2],0 19 mov ax,4c00h 20 int 21h 21 sub1: 22 push bp 23 mov bp,sp 24 cmp bx,-32768 //近转移最小值偏移 25 jl s0 //有符号数小于则转移 26 cmp bx,32767 //近转移最大值偏移 27 jg s0 //有符号数大于则转移 28 add [bp+2],bx //加上两转的偏移即可得到转移目标地址 29 s0: 30 pop bp 31 iret 32 sub2: 33 nop 34 code ends 35 36 end start
1 测试程序: 2 assume cs:code 3 //将数据段的数据显示屏幕上 4 data segment 5 db 'conversation',0 6 data ends 7 8 code segment 9 start: 10 mov ax,data 11 mov ds,ax 12 mov si,0 13 mov ax,0b800h 14 mov es,ax 15 mov di,12*160 16 s: 17 cmp byte ptr [si],0 18 je ok 19 mov al,[si] 20 mov es:[di],al 21 inc si 22 add di,2 23 mov bx,offset s - offset ok 24 int 7ch //安装程序 25 ok: 26 mov ax,4c00h 27 int 21h 28 code ends 29 30 end start