关于汇编转移命令jump的问题
书上说“jump short 标号”是在编译的时候由编译程序计算出相对地址位移保存到程序代码中,然后在程序执行时用当前IP加上相对地址位移计算出偏移移地址;那请问“jump far ptr 标号”是在什么时候由谁来确定段地址和偏移地址的?
[解决办法]
编译器通常生成一个可浮动的映像,对DOS .exe,是基于段0开始的,也就是程序的第一个段的段地址设定为0,后面的段顺序排,比如第一个段占用了256字节(16节),那么第二个段的段地址就是16,依此类推。程序执行之前,操作系统的加载器会对涉及绝对地址访问的指令进行重定位,比如mov ax,data这种指令,编译的时候生成的是浮动段值(如果data是第一个段,那就是mov ax,0),然后在文件头中标记这个位置是一个重定位项,加载器把这个位置加上.exe装入内存的起始段,比如1234h,就完成了重定位。
windows的PE格式类似,编译器一般生成的也是浮动地址,同时在文件头中标记一个加载起始地址(0x00401000之类),操作系统的加载器可以根据这些信息调整加载位置(对于PE,也可以剥离重定位信息,那程序只能加载到文件头标记的起始位置,不能调整了),只是PE的重定位与DOS .exe有所不同。