简单虚拟机
时间:2021-08-12
本文章向大家介绍简单虚拟机,主要包括简单虚拟机使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
大概就是把指令集翻译成汇编形式。
数值操作指令直接对应就好。
主要是转换流程控制语句,for循环这些
for--
循环本身流程 code_c
lx1: do something
lx2 : jmp lx1
这样就没法停下来。
在循环流程前加一个跳转开关。
jmp lx2+1
然后加上条件跳转
lx1:icmp i,c_count
[feq] jmp lx2+1
do something
add i,1
lx2: jmp lx1
if else--
本身流程
lx1:do something1
lx2: do something2
条件跳转开关
icmp c1,value
[feq] jmp lx2
lx1:do something1
lx2:do something2
跳转开关和上层语言写起来逻辑有点相反。关心的目标是后面的指令地址。
函数实现
流程控制
指令寄存器 eip
参数传递
有说是传给寄存器,
有说是传到栈,
返回值
看着都是通过寄存器传递,如果返回值是数组之类较大的,就返回地址。
函数内部
寄存器的使用。
公用寄存器 天然就能传递数据。
在内部函数中又要求不受干扰,像内部变量。需要保存寄存器的前值,并在使用后复原。
需要一个存储池来维持寄存器。--栈
执行配套的动作。
用之前把寄存器压栈。返回前把寄存器出栈。
空间来换取流程。
递归--
fibo(int eax)
cmp eax, 1
je _get_out
cmp eax, 2
je _get_out
move edx eax --保存传入参数
sub eax ,1 --(n-1)
call fibo(eax) --递归调用
move ebx eax --保存返回值
sub eax ,2 --(n-2)
call fibo(eax) --递归调用
move ecx eax --保存返回值
move eax,ebx
add eax,ecx //返回值相加
ret
寄存器状态。
1.程序外的值。。 eax=4
push ....
edx =eax
1.1 eax =3
push...
edx=eax
1.1.1 eax 2
ret 1
1.1 ebx=1
1.1.2 eax=1
ret 1
1.1 ecx=1
一切都是操作寄存器的感觉。
数据复制也是先读到寄存器,再写到内存。
原文地址:https://www.cnblogs.com/halfwake/p/15131896.html
- .NET Core采用的全新配置系统[4]: “Options模式”下各种类型的Options对象是如何绑定的?
- js运算符优先级笔记
- 通过协同绘制用GAN合成高分辨率无尽道路
- ASP.NET MVC的Model元数据与Model模板:预定义模板
- 为您的组织选择正确的企业云解决方案
- 搞定这些疑难杂症,向css3动画说yes
- 前十一个网络游戏业务收入1341亿 同比增22.1%
- ASP.NET MVC Model元数据及其定制:一个重要的接口IMetadataAware
- 使用Docker 1.12.x构建多容器Web应用程序
- 基于 vue2 + vuex 构建一个具有 45 个页面的大型单页面应用
- 深度解剖dubbo源码
- .NET Core采用的全新配置系统[6]: 深入了解三种针对文件(JSON、XML与INI)的配置源
- 基于 vue2 构建和后台真实交互的 管理系统
- ASP.NET MVC的Model元数据与Model模板:模板的获取与执行策略
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- kubernetes(二)之Docker容器及镜像
- 反向传播算法:定义,概念,可视化
- Go语言(二十一) 常见的模块使用
- kubernetes(一)之Docker基础入门
- Go语言(二十)日志采集项目(二)Etcd的使用
- prometheus入门(一)
- Go语言(十九)日志采集项目之logagent开发(一)
- Go语言(十 八)context&日志项目
- 使用梯度上升欺骗神经网络,让网络进行错误的分类
- Go语言(十七) 配置文件库项目
- Python 相对路径问题:“No such file or directory“
- 基于etcd服务发现的overlay跨多宿主机容器网络
- Go语言(十六) 日志项目升级
- PyQt5 技术篇-设置窗口相对桌面位置,按屏幕比例
- Go语言(十五) 反射