v8学习笔记(六) 汇编过程

v8汇编过程

根据抽象语法树FunctionLiteral创建Code对象(内含机器指令),返回JSFunction对象.

MakeCode():   

1.增加返回语句:  Rewriter::Process(FunctionLiteral) 向抽象语法树的语句数                                                                                                     Body_添加ReturnStatement(返回语句)

2.优化AST:              Rewriter::Optimize(FunctionLiteral)优化抽象语法树

 

3.产生机器码(机器指令)

1.创建代码产生器FullCodeGenerator(AstVisitor的子类 ):

                  内含汇编器MacroAssembler(根据硬件架构宏来选择相应的汇编器对象).

         v8目前支持4个硬件架构:   V8_TARGET_ARCH_IA32

                                                                 V8_TARGET_ARCH_X84

                                                                 V8_TARGET_ARCH_ARM

                                                                 V8_TARGET_ARCH_MIPS

2.调用FullCodeGenerator::Generate(CompilationInfo*,Mode)开始汇编

         (1)代码产生器访问AST ,根据语义调用汇编器(MacroAssembler)产生相应的机器指令并放入汇编器的缓冲区.

         共有5个步骤:

         ---- ModePRIMARY,  Allocate locals

                                                                 Allocate local context

                                                                 Allocate arguments object

         ----Declarations:汇编抽象语法树的Scope中变量和函数声明对象(ZoneList<Declaration*>)

         ---- Stack check:汇编栈检验语句

         ---- Body:汇编非声明语句(语句数组的所有语句)

         ---- return:汇编返回语句

         (2)创建一个CodeDesc对象描述产生的机器指令,再创建Code对象Factory::NewCode(….)

         struct CodeDesc {  byte* buffer;      //缓冲地址

                       int buffer_size;   //缓冲大小

                       int instr_size;    //指令总长度

                       int reloc_size;    //重定位信息长度

                       Assembler* origin; //汇编器

                       };

                        |<--------------- buffer_size ---------------->|

                        |<-- instr_size -->|        |<-- reloc_size -->|

                        +==================+========+==================+

     机器指令缓冲       |   instructions   |  free  |    reloc info    |

                        +==================+========+==================+

 

 

4.结尾操作

         根据 抽象语法树FunctionLiteral+Code+CompilationInfo创建SharedFunctionInfo ,

再创建JSFunction对象,Handle<JSFunction>转化为API Handle<Script>,返回

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ARM V8 是一种 64 位的 ARM 处理器架构,其汇编指令集包含了大量的指令,可以用于编写高效的汇编代码。下面是一些常见的 ARM V8 汇编指令及其功能: 1. MOV 指令:将数据从一个寄存器移动到另一个寄存器中。例如: ``` mov x1, x0 ``` 上面的代码将寄存器 x0 中的值移动到寄存器 x1 中。 2. ADD 指令:将两个寄存器中的值相加,并将结果存储到一个目标寄存器中。例如: ``` add x0, x1, x2 ``` 上面的代码将寄存器 x1 和 x2 中的值相加,结果存储到寄存器 x0 中。 3. SUB 指令:将两个寄存器中的值相减,并将结果存储到一个目标寄存器中。例如: ``` sub x0, x1, x2 ``` 上面的代码将寄存器 x1 中的值减去寄存器 x2 中的值,结果存储到寄存器 x0 中。 4. CMP 指令:比较两个寄存器中的值,并设置标志位。例如: ``` cmp x0, x1 ``` 上面的代码将比较寄存器 x0 和 x1 中的值,并设置标志位。 5. B 指令:无条件跳转到一个指定的地址。例如: ``` b label ``` 上面的代码将跳转到标签为 "label" 的地址处。 6. BEQ 指令:如果标志位为 "等于",则跳转到一个指定的地址。例如: ``` beq label ``` 上面的代码将在标志位为 "等于" 时跳转到标签为 "label" 的地址处。 7. LDR 指令:从内存中加载数据到一个寄存器中。例如: ``` ldr x0, [x1] ``` 上面的代码将从地址为 x1 的内存中加载数据到寄存器 x0 中。 8. STR 指令:将一个寄存器中的数据存储到内存中。例如: ``` str x0, [x1] ``` 上面的代码将寄存器 x0 中的数据存储到地址为 x1 的内存中。 以上是一些 ARM V8 汇编指令的示例,实际上还有很多其他的指令可以用于实现各种功能。需要注意的是,汇编指令的使用需要非常小心,因为这些指令对硬件的操作是直接的,不像高级语言那样具有一定的抽象层次和安全机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值