以下一代码
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就是怎么也做不到,怎么解决,还望高手指点