以下一代码
code           segment
               assume cs:code,ds:code,es:code
               org 7c00h
start:         mov ax,code
               mov ds,ax
               ....
               ....               ;用于调用INT10显示字符串,等用户按键则跳转selfcopy
jmp selfcopy
first_address  dd 00f07c00h       ;这里是两行数据,放着将要跳转的地址
second_address dd 00007c00h
loadpart:     ...                         ;loadpart:这部分代码将被复制到00f0:7c00处
              ...                         ;功能是调用int 13h载入磁盘某扇区到0000:7c00处
                                          ;再跳转0000:7c00执行
              
              jmp [second_address]        ;问题出在这,本程序所有代码原地址就是0000:7c00
                                         ;刚刚前面从磁盘载入的,已经把second_address覆盖
                                          ;无法实现跳转
                                          ;全代码后面偶详细说明问题
              
              
selfcopy:     mov ax,00f0h
              mov es,ax
              mov di,offset loadpart
              mov cx,0200h
              mov si,7c00h                ;设置循环
    circle:   mov al,[di]
              mov es:[si],al              ;循环工作部分,用于将自身loadpart:开始的512字节
              inc di                      ;复制到00F0:7c00处
              inc si
              loop circle
              jmp [first_address]         ;跳去00F0:7c00处执行,也即是loadpart:,经测试
                                          ;此处不成问题
这程序打算写进引导扇区,文章系在网吧所写,由于作者水平所限(编程还要不停翻书- -)所以没有完全写出完整代码,不看书下,可能也有语法错误,但问题不在这
程序思路是,本程序得到执行,会将自身的代码移动到00f0:7c00处,再跳转去继续执行,经过不断测试,(段寄存器的设置,也完全考虑到)上述的loadpart:部分改成用于显示字符,本程序是完全可行的,但loadpart部分一使用段间跳转,即无法实现,偶把second_address放在loadpart:内部,但编译时是按本程序地址计算,放在loadpart:的双字变量,其偏移地址是并不正确的,JMP段间跳转要用的双字变量无法定位,所以,明知道要跳的地址是0000:7c00h就是怎么也做不到,怎么解决,还望高手指点

 
											





