![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
assembler
文章平均质量分 82
来碗阳春面吧
爱健身,爱代码
展开
-
Android:assembler_test.cc是如何进行测试的
上一篇条件跳转的范围不够了怎么办?扩容!讲述了跳转在汇编层面跳转指令是如何生成机器码的,以及当条件跳转的13位跳转空间不够的时候,是如何依托auipc和jalr来实现32位的条件跳转的。接下来我们来分析一下安卓中如何使用test.cc对编写的assembler进行测试。此处仅对扩容跳转进行测试。测试源码TEST_F(AssemblerRiscv64Test, LongBeq) { riscv64::Riscv64Label label; __ Beq(riscv64::A0, riscv64::原创 2021-05-31 10:29:09 · 238 阅读 · 0 评论 -
条件跳转的范围不够了怎么办?扩容!
1. beq的跳转范围只有1 << 12在之前的开发中遇到了beq跳转到外部的引用时出错的情况,当时跳转惊叹居然还有跳转范围这个说法,只晓得j的跳转范围比beq大,但为什么会有跳转范围这个说法,如何解决的,如果跳转的范围连j都无法满足了怎么办?本篇文章将基于android中assembler的处理方式,来看看如何处理的。上图展示了beq的跳转范围,取1~12位,跳转的有效范围最大为4096字节,也就是1024条指令。超过1024条指令的跳转,beq就无法满足了。在工具链编译的过程中还不支持原创 2021-05-24 16:14:43 · 1508 阅读 · 0 评论 -
Assembler如何把跳转汇编变成机器码的(四)
步骤三:计算向前跳转的targetbeq5为向前跳转,此时label1->pos为-8-8,其中-8位Bind(label1)到beq4结束为止的偏移量。这个时候beq5调用Bcond的时候,uint32_t target = label->IsBound() ? GetLabelLocation(label) : Branch::kUnresolved;pos为负数,调用GetLabelLocation,其源码如下:uint32_t Riscv64Assembler::GetLabelL原创 2021-05-21 15:30:32 · 454 阅读 · 0 评论 -
Assembler如何把跳转汇编变成机器码的(三)
#步骤2: 计算target1.Bind(Label1)计算出属于label1跳转的targetBind函数完成了两个工作,第一个计算出Bind之前,该label的所有跳转的target,第二个是记录此时Bind(label)的地址,在接下来跳转到该label的时候可以直接计算出target。来看源码:void Riscv64Assembler::Bind(Riscv64Label* label) { CHECK(!label->IsBound()); uint32_t bound_原创 2021-05-21 15:29:51 · 133 阅读 · 0 评论 -
Assembler如何把跳转汇编变成机器码的(二)
步骤一:对跳转指令进行占位##1. 跳转指令是没有办法直接生成机器码的beq a0 a1 1f该指令的意思是如果a0寄存器的值等于a1寄存器,那么就跳转到向下1:处的地址。对于机器来说,机器暂时还不知道1f在哪,因为尚未执行到1f,这是一个未知的地址。在这种情况下,beq暂时还没办法生成机器码。那么如何处理呢?先做标记,然后占位。由于并不知道要跳往哪里,先把变量目的地址target设置为一个极大值,然后标记,标记是指记录下此时beq的地址,位于buffer的哪里,并且占据beq所需要的长度。对于b原创 2021-05-21 15:29:04 · 310 阅读 · 0 评论 -
Assembler如何把跳转汇编变成机器码的(一)
#1. java是如何变成机器码的?在dex2oat阶段,java生成的dex字节码经过trycompile阶段,调用code_generator_riscv64.cc,通过字节码对应的函数调用相应的汇编,汇编代码通过assembler来实现了机器码的生成。在dex2oat阶段并不是所有的dex字节码都可以编译成机器码,有些字节码只可以做到优化,只能放在解释执行中取执行。现在的操作系统为了优化开机时间和打开时间,也不会过分地将字节码变成机器码,而是留到解释执行中进行runtime处理。解释原创 2021-05-21 15:26:31 · 758 阅读 · 2 评论