当前位置: 首页 > 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编码 并发送到内存。

相关文章:

  • 无人机报警器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任务的提交流程
  • 三部门印发《2025年深入推进IPv6规模部署和应用工作要点》
  • 国家话剧院上海演出季7月重启,《大宅门》等5部大戏来沪
  • 海南乐城管理局原局长贾宁已赴省政协工作,曾从河南跨省任职
  • 媒体报道一民企投资400万运营出租车4年未获批,广西隆林县回应
  • 83岁山水花鸟画家、书法家吴静山离世,系岭南画派代表人物
  • 专利申请全球领先!去年我国卫星导航与位置服务产值超5700亿元