这本书很不错,拣几个我认为关键的章节翻译一下,一方面加深自己理解,一方面方便大家安虹老师已经翻译了这本书,chinapub应该有卖
在预解码(Predecoding)过程中, 所有同类型的源指令都被相同的目标平台解释函数执行,例如 所有的 load word and zero 指令 不管其所操作的寄存器是什么,都将被图2.9中的代码段解释执行(注:指一个解释函数专门用来解释执行 lwaz指令)。如果将每个源二进制指令映射到其专属的目标二进制指令,性能将得到大幅提升。这个过程被称为是二进制翻译(注:分静态,动态2种 性能提升的原因第一章已经解释)
例如IA-32 的的寄存器组状态被保存在一个源寄存器上下文数据结构中,并且地址被读入到目标平台的寄存器中。 一些目标平台的寄存器将被永久指定用来保存一些常用的和重要的源平台资源。例如 r1 用来保存源寄存器组映像, r2指向源平台的内存映像,r3保存源平台的pc指针
- 翻译后的PowerPC指令
- 翻译后的addl
- lwz r4,0(rl) ;从源寄存器组数据结构中首先取出eax,r1--> 源寄存器组映像
- addi r5,r4,4 ;加上偏移量4
- lwzx r5, r2, r5 ;从源平台内存的映像地址+r5的偏移取出其中内容 r2--> 指向源平台的内存映像
- lwz r4,12 (rl) ;再从源寄存器组数据结构中取出edx, edx需从r1起偏移12, eax,ebx,ecx,
- add r5,r4,r5 ;执行加法
- stw r5,12(r1) ;结果保存至edx
- addi r3,r3,3 ;pc 指针前进3 r3-->源平台的pc指针 (注:感觉应该是前进4位)
- 翻译后的movl4
- lwz r 4 , 0 ( r l ) ;取 eax
- addi r5,r4,4 ;eax + 4
- lwz r4,12 ( r l ) ;取 edx
- stwx r4, r2, r5 ;向r2始偏移eax+4的地址保存edx
- addi r3,r3,3 ;pc 指针前进3
- 翻译后的add
- lwz r 4 , 0 ( r l ) ;取eax
- addi r4, r4,4 ;eax+4
- stw r4,0(r1) ;保存至eax
- addi r3,r3,3 ;pc 跳3
预解码与二进制翻译的比较
预解码始终要用到解释函数,二进制翻译直接映射至可以执行的代码二进制翻译将寄存器尽可能直接映射,免去保存中间状态的问题。 在翻译过程中 目标寄存器可以直接映射一些源寄存器,翻译结束后目标寄存器将恢复到翻译前的状态,以便继续执行模拟器代码 (详细过程见2.19, 2.8.1, 4) 纯粹的静态二进制翻译将会带来很多的问题,为了克服这些困难,引入动态二进制翻译
[待续]