1、背景
仅针对JVM的模板解释器:
如何根据opcode和寻址模式,将bytecode生成汇编码。
本文的示例中所使用的字节码和汇编码,请参见上篇博文:按值传递还是按引用?
2、寻址模式
本文不打算深入展开寻址模式的阐述,我们聚焦Intel的IA32-64架构的指令格式:
简要说明下,更多的请参考intel的手册:
– Prefixes : 用于修饰操作码Opcode,赋予其lock、repeat等的语义.
– REX Prefix:
—- Specify GPRs and SSE registers.
—- Specify 64-bit operand size.
—- Specify extended control registers.
–Opcode:操作码,如mov、push.
–Mod R/M:寻址相关,具体见手册。
–SIB:和Mod R/M结合起来指定寻址。
–Displacement:配合Mod R/M和SIB指定寻址。
–Immediate:立即数。
对上面的Opcode、Mod R/W、SIB、disp、imm如果不明白,看句汇编有个概念:
%mov %eax , %rax,-0x18(%rcx,%rbx,4)
如果这句汇编也不太明白,那么配合下面的:
– Base + (Index ∗ Scale) + Displacement – Using all the addressing components together allows efficient
indexing of a two-dimensional array when the elements of the array are 2, 4, or 8 bytes in size.
3、合法的值(64位)
关注下这4个参数的合法取值:
• Displacement — An 8-bit, 16-bit, or 32-bit value.
• Base — The value in a 64-bit general-purpose register.
• Index — The value