|
20鱼币
本帖最后由 u654f 于 2012-8-30 00:37 编辑
assume cs:code
code segment
start:
;注册子程序
mov ax,cs
mov ds,ax ;设置源地址为代码段
mov si,offset pregstart
mov ax,0h
mov es,ax ;设置一个安全的目标地址
mov di,200h
mov cx,offset pregend-offset pregstart
cld ;设置递增
rep movsb ;传送字串
mov ax,0
mov es,ax
mov word ptr es:[0*4],200h
mov word ptr es:[0*4+2],0 ;设置中断向量表
;程序结束
mov ax,4c00h
int 21h
;子程序
pregstart:
jmp short maincode
data:
db 'Hello world!',0
maincode:
mov ax,cs
mov ds,ax
mov si,offset data
mov ax,0b800h
mov es,ax
mov di,12*160+36*2
mov cx,13
childcode:
mov dh,0
mov dl,[si]
mov al,[si]
mov es:[di],al
inc si
add di,1
mov al,02h
mov es:[di],al
add di,1
mov cx,dx
jcxz endflag
jmp short childcode
endflag:
mov ax,4c00h
int 21h
pregend:nop
code ends
end start
看上面红色加粗的代码,为什么这样写不行?如果换成mov si,202h是可以的或者写成 mov si,200h+offset data-offset pregstart也是可以的
|
最佳答案
查看完整内容
mov si,offset data
data是相对于安装程序的偏移(你可以用debug查看一下),你把安装程序复制到0:200H处,字符串的si已经定位不到字符串了,由于jmp short maincode占用了2个字节,所以字符串的地址必须从202h开始,你不管用offset什么,si等于202h就行,这样就可以定位到字符串。
http://bbs.fishc.com/thread-20960-1-6.html看六楼
|