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