虚拟机指令集&栈与函数调用(下)

简介: 虚拟机指令集&栈与函数调用(下)

image.png

第一可以把代码的位置恢复到之前的状态

第二可以把栈的状态恢复到调用之前的状态

所以记录老的bp就是为了调用结束恢复用的

然后再给栈 增加一些空间

存局部变量 这里的局部变量只有一个ret

image.png

然后执行 ret = a+b

首先要把赋值的部分ret地址存下来

等赋值完成之后 有个地方去装这个结果

所以需要把这个地址拿出来

由于它是第一个局部变量 那么就是栈基减1的位置

所以通过LEA -1 把它的地址拿出来

存到了所谓的ax寄存器里了

即执行完了之后 ax寄存器就会是ret的地址

image.png

把这个地址存放到栈里面 所以会有一个push的操作

暂存到栈里面

假设是330330

image.png

这个时候ax就是空闲的 就可以用来计算了

add指令是把ax里面的内容和stack peek(栈顶)的内容相加 然后存回ax

并且把栈顶销毁

先把a拿出来

它在基于bp的上三格的位置


image.png

所以是LEA 3

image.png

拿到了这个地址 然后加载到ax中

然后加了一个整数LI

image.png

把ax数据加载到栈里

image.png

栈顶就变成了3

image.png

然后再把第二个参数 就是bp的上两位

image.png

拿到这个地址之后 就可以把数据加载到ax中

ax就等于4了

此时栈顶就是3 ax就是4

调用ADD方法 把栈顶销毁

并且把它加到4里面

ax就等于7了

网络异常,图片无法展示
|


这个时候加法就完成了 然后就是赋值语句

找到ret地址

因为栈顶已经已经销毁了 所以sp在这里

image.png

然后把ax数据存到sp对应的地址里面即SI(save integer)方法

save完了之后 存地址的栈也会销毁

然后把7写进去

image.png

然后return这个变量

就是第一个局部变量 bp-1的位置

然后把bp-1的位置继续加载进入ax

因为返回值在ax里面 所以还得lea bp-1

微信图片_20220502114114.png


ret的内容又回到了ax里面

然后再return

image.png

看看retuan干了什么

首先sp=bp

image.png

无论有多少个局部空间 这些空间都会被销毁

bp等于sp里面的地址

sp里面具体的值 也就是main bp

所以bp又回到了老bp的位置

sp+1了 所以新的bp也被销毁了

image.png

image.png

430428的位置

也就是调用call之后的位置

darg2(delete stack frame for args)

为参数做的这个空间 然这个空间delete掉

然后sp继续加加 430428被销毁

image.png

delete带的参数是2 就会会被3和4这两个参数delete掉

image.png

然后sp又回到了这个位置

像一切都未发生过一样


Native-Call


image.png

这里就是完全copy from c4


IO相关指令

OPEN/CLOS/READ/

为什么没有write因为c4设计Native-CALL主要是为了完成自举 c4的源码里面没有用到write方法

PRTF:将数据写到标准输出(fd=1)


动态内存相关指令

  • MALC
  • FREE
  • MSET
  • MCMP
  • EXIT 用于终结程序


相关文章
|
6月前
|
存储 Java 数据安全/隐私保护
【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
113 0
|
6月前
|
存储 安全 Java
【数据结构】栈的使用|模拟实现|应用|栈与虚拟机栈和栈帧的区别
【数据结构】栈的使用|模拟实现|应用|栈与虚拟机栈和栈帧的区别
65 0
|
3月前
|
Java
程序计数器和虚拟机栈
这篇文章介绍了Java虚拟机(JVM)的内存结构,特别解释了程序计数器(Program Counter Register)的作用,即用来记录下一条JVM指令的执行地址和行号。
程序计数器和虚拟机栈
|
3月前
|
存储 安全 Java
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别;什么是程序计数器,堆,虚拟机栈,栈内存溢出,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
|
4月前
|
云计算
云计算问题之线程请求的栈深度大于虚拟机所允许的深度如何解决
云计算问题之线程请求的栈深度大于虚拟机所允许的深度如何解决
31 1
|
3月前
|
安全 Java
虚拟机栈的五道面试题
这篇文章提供了关于Java虚拟机栈的五个面试问题,涉及栈溢出的情况、栈大小调整、栈内存的分配、垃圾回收与虚拟机栈的关系以及局部变量的线程安全性。
|
4月前
|
存储 Java 对象存储
Java虚拟机(JVM)中的栈(Stack)和堆(Heap)
在Java虚拟机(JVM)中,栈(Stack)和堆(Heap)是存储数据的两个关键区域。它们在内存管理中扮演着非常重要的角色,但各自的用途和特点有所不同。
54 0
|
5月前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
65 2
|
6月前
|
存储 监控 安全
JVM工作原理与实战(十六):运行时数据区-Java虚拟机栈
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了运行时数据区、Java虚拟机栈等内容。
47 0
|
6月前
|
存储 缓存 Java
JVM【带着问题去学习 02】数据结构栈+本地方法栈+虚拟机栈+JVM栈运行原理
JVM【带着问题去学习 02】数据结构栈+本地方法栈+虚拟机栈+JVM栈运行原理
86 0