模拟器开发--地址转换(1)

地址转换做的事就是将目标机器(被模拟的对象)上的地址空间映射到本机上。对于采用动态编译技术的模拟器来说,多数情况下这一过程可以在编译阶段完成。即执行时,直接使用本机地址空间寻址。 首先看一下什么情况要地址转换。简单的说,访问内存时就要用到地址转换。拿arm系cpu来举例,访存指令有ldr/str,且均为寄存器间接寻址。内存地址保存在寄存器中,例如 ldr r0, [r1] 对于r1中保存的地址值,就需要进行地址转换。 要在编译阶段完成地址转换,就必须在编译时已知r1寄存器的值。所以有必要在编译时跟踪寄存器值的变化。 寄存器值的来源有以下几种: *1、立即数,mov r0, #123 *2、内存,ldr r0, [r1] 3、其它寄存器,mov r0, r1 4、运算结果,add r0, r1, r2 *5、程序计数器,(pc,arm中的r15) (*1、2、5是最初来源,3和4可以追溯到1、2、5) 对于来源于1和5的寄存器来说,其值均可在编译时确定,就可直接对其进行转换。而情况2可能就要等到执行时才知道。所以,对于来源于2的寄存器来说,需在编译时生成地址转换的代码,在执行时进行地址转换。