方法多多益善。
------解决方案--------------------------------------------------------
jmp far
------解决方案--------------------------------------------------------
1、
jmp segment:offset
如果编译器不支持,可以直接用机器码:
DB 0EAH
DW offset
DW segment
2、
push segment
push offset
retf
3、
jmp DWORD PTR 各种内存寻址方式访问远指针变量
------解决方案--------------------------------------------------------
mov word ptr [bx],0
mov word ptr [bx+2],1500h
JMP far ptr [bx] ;转移至1500h:0
段间间接转移指令,用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个字单元中的,其中低位字送IP寄存器,高位字送CS寄存器。
------解决方案--------------------------------------------------------
1、使用LJMP,AT&T和INTEL都支持,比如AT&T的
ljmpl $段基址或者选择符, $段内偏移
2、使用LCALL,进行远程调用
lcall 段基址(这个要存在4个段寄存器里面):(段内偏移)
3、使用PUSHL,把地址存在CALL调用后返回后自动装载EIP里,就是2楼的第二种方法,比如LINUX的HEAD.s有这样的例子:
after_page_tables:
pushl $0
pushl $0
pushl $0
pushl $L6
pushl $main
jmp setup_paging
4、似乎linux里面的系统调用算的上是一种段间调用吧
5、2楼的第一种方法