当前位置: 首页 > news >正文

openjdk底层(hotspot)汇编指令调用(五)——内存访问

根据前面关于aarch64架构下的编码解释可知,在src\hotspot\cpu\架构文件夹下,

assembler_xx.hpp 
assembler_xx.cpp
register_xx.hpp
register_xx.cpp
register_definitions_xx.cpp

这些文件是有关寄存器定义以及汇编编码函数实现的文件。

对于前述的openjdk底层汇编指令调用,我们只涉及了单纯寄存器调用,对于计算机而言,还有一种调用方式是寄存器和内存之间的互相访问。即,数据从内存到寄存器,或者寄存器到内存

在这里插入图片描述

x86的访存模型

这里不再使用aarch64讲述访存,因为该方式下的访存模型比较复杂,有兴趣的朋友可以访问我以前有关AArch64指令的翻译 AArch64教程_阿达King哥的博客-CSDN博客 。

相比而言,x86的访存理解起来简单得多。回到x86架构下的内存访问方式,

在这里插入图片描述

下面以具体的例子说明上述表格的内容

假设rbp寄存器内保存的值是内存中的某个地址,且x86指令采用AT&T格式,即

opcode src, dst

opcode为操作码,src为源,dst为目的

movl %rdi, (%rbp)  //将rdi寄存器中的值放入rbp寄存器所值的内存地址中

这里的括号表示访问的是内存,而不是寄存器本身。当然,可以直接把括号内的名称直接换成内存地址

movl %rdi, (0x55)

可以加上偏移

movl	%rdi, -4(%rbp)   // 寄存器 -> 内存
movl	-8(%rbp), %rsi   // 内存 <- 寄存器

这里表示将rdi寄存器中的值放入指定的内存地址中,该地址为(rbp内的值减去4)

除此之外,还有一种方式为

mov %rax, (%rbx,%rcx)  //R[rax] -> M(R[rbx] + R[rcx])

上述指令的意思是将rax的值放入指定内存地址中,该地址是M(R[rbx] + R[rcx])

也可以结合偏移

mov %rax, -4(%rbx,%rcx)  //R[rax] -> M(R[rbx] + R[rcx]-4)

最后一种方式是乘以系数的方式

mov %rax, (%rbx,%rcx,8)  //R[rax] -> M(R[rbx] + R[rcx]*8 )
mov %rax, -4(%rbx,%rcx,8)  //R[rax] -> M(R[rbx] + R[rcx]*8 -4)

可以发现如果以最后一条指令说明,我们可以将访存格式的各个部分进行如下定义

mov Ra, Imm(Rb,Ri,S)

其中,Rb部分被称为基地址(base),Ri部分被称为变址或索引(index), S部分被称为比例因子(scale),其中比例因子被强制规定只可使用1,2,4,8

hotspot的x86访存模型

结合上述指令特点,在x86文件夹的assembler_x86.hpp文件中定义了Address类,该类用于物理内存访问时调用。

在这里插入图片描述

对照原始的汇编指令,我们可以看出Address类的各个属性都对应着操作数中的相应部分。以下面的例子说明

mov %eax, -4(%ebx,%ecx,8)
Address类属性汇编
_baserbx
_indexrcx
_scale8
_disp-4

hotspot访存指令编码

assembler_x86.hpp中定义上述指令

void movl(Address dst, Register src);

该函数的实现如下

void Assembler::movl(Register dst, Address src) {InstructionMark im(this);prefix(src, dst);emit_int8((unsigned char)0x8B);emit_operand(dst, src);
}

实现中将参数进行x86编码 并发送到内存。

http://www.dtcms.com/a/202333.html

相关文章:

  • 无人机报警器360°检测技术分析!
  • docker环境和dockerfile制作
  • Spring Boot 集成 Elasticsearch【实战】
  • KC 喝咖啡/书的复制/奶牛晒衣服/ 切绳子
  • JVM-运行时数据区
  • Prometheus
  • C++之fmt库介绍和使用(2)
  • [Harmony]获取设备参数
  • 新浪《经济新闻》丨珈和科技联合蒲江政府打造“数字茶园+智能工厂+文旅综合体“创新模式
  • 基于Spring Boot + Vue的教师工作量管理系统设计与实现
  • 理解 RESTful 风格:现代 Web 服务的基石
  • Maven 项目打包时添加本地 Jar 包
  • 【MySQL】第七弹——复习总结 视图
  • mysql的基础命令
  • CNN、RNN、Transformer对于长距离依赖的捕捉能力分析
  • Zookeeper 集群安装与脚本化管理详解
  • vue3中使用Element-Plus的几种方式
  • IVX:重构 AI 原生开发范式,让模型调用成为指尖艺术​
  • pom.xml中的runtime
  • spark任务的提交流程
  • 大数据Spark(五十九):Standalone集群部署
  • 【大模型】SpringBoot 整合Spring AI 对接主流大模型平台实战详解
  • 前端单点登录
  • 【Linux笔记】——线程同步信号量与环形队列生产者消费者模型的实现(PV操作)
  • BigemapPro蒙版使用技巧:精准导出地图范围
  • 2025年AI搜索引擎发展洞察:技术革新与市场变革
  • 代码随想录算法训练营 Day52 图论Ⅲ 岛屿问题Ⅱ 面积 孤岛 水流 造岛
  • 基于AutoDL市场下的Pycharm远程控制
  • window 显示驱动开发-GDI 硬件加速
  • 驱动开发硬核特训 · Day 31:理解 I2C 子系统的驱动模型与实例剖析