《UEFI内核导读》如果没有内存,程序代码还能不能执行?
==============================
敬请关注:“固件C字营
==============================
首先思考一个问题,冯洛伊曼架构的计算机如果没有内存,代码能被否正常执行?过程(函数)能不能被相互调用?答案是肯定的,其中的一个实现方法如下。这里只介绍汇编语言的相互调用,如果要用高级语言比如C语言,需要自己实现编译器和ABI才行。
IA-32支持Intel Streaming SIMD Extensions (Intel SSE),不同版本的SSE支持不同的编程模型和指令。SSE支持8个128bit的XMM寄存器,8个64bit MMX寄存器可以在UEFI环境下使用特定的pinsrd/ pinsrw/ pshufd/movd指令在通用寄存器之间传递数据,进而可以把XMM、MMX寄存器当做普通32bit数据暂存器来使用。如此,我们就可以在堆栈没有准备好的情况下使用JMP跳转指令来模拟一般的call/ret方式调用子过程。
128bit的XMM寄存器可以被拆分成4个slot,分别与通用寄存器(如:EAX)进行数据传递,参考实现如下。
XMM7:EBP - slot 0, EBX - slot 1, ESI - slot 2, EDI - slot 3
XMM6:ESP - slot 0, EAX - slot 1, EDX - slot 2, ECX - slot 3
XMM5:slot 0 for calling stack,slot 1 for uCode status
MM0: BIST State
MM5: Save time-stamp counter value high32bit
MM6: Save time-stamp counter value low32bit.
MM7: calling stack
例1:
子过程Function是需要被调用的过程,在堆栈还没有准备好的情况下,可以使用如下代码来实现,只要在Function内部保持通用寄存器不被修改(具体方法是把通用寄存器保存在MMX和XMM寄存器当中)就可以保证Function的调用不会破坏执行环境。
CALL_MMX Function ;调用子过程,返回地址保存在MM7寄存器
RET_ESI ;返回到主过程
例2:
其中SXMMN和LXMMN宏分别为存储和读取ReturnAddress即调用CALL_XMM指令之后的下一条指令的地址。
CALL_XMM Function ;调用子过程,返回地址保存在XMM5-Slot0寄存器
RET_XMM ;返回到主过程
例3:同理我们也可以使用ebp暂存过程返回地址。
更多导读,尽情期待!
==============================
敬请猛戳下面链接,关注&转发
敬请关注we-hat“:“固件C字营”
点击左下角“分享”,快乐更多人
==============================
we-chat“固件C字营”
《UEFI内核导读》如果没有内存,程序代码还能不能执行?相关推荐
- 《UEFI内核导读》全集,2023年更新
===================================================================== 固件C字营·版权所有·欢迎转载 敬请关注We-Chat:&q ...
- java中异常抛出后代码还会继续执行吗
java中异常抛出后代码还会继续执行吗 参考文章: (1)java中异常抛出后代码还会继续执行吗 (2)https://www.cnblogs.com/xiaoshen666/p/10848827.h ...
- 《UEFI内核导读》UEFI是不是操作系统?
================================ 敬请关注微信公众号:"固件C字营" =============================== 最近一直在思考 ...
- 《UEFI内核导读》ACPI编程入门
固件C字营·版权所有 敬请关注微信公众号:"固件C字营" ============================================================= ...
- 《UEFI内核导读》UEFI中驱动的执行顺序
============================== 敬请关注:"固件C字营" ============================== UEFI中DXE驱动或PEIM ...
- 一文讲解,Linux内核——Memory Barrier(内存屏障)
本文例子均在 Linux(g++)下验证通过,CPU 为 X86-64 处理器架构.所有罗列的 Linux 内核代码也均在(或只在)X86-64 下有效. 本文首先通过范例(以及内核代码)来解释 Me ...
- 【代码分享】TRL微波器件测量去嵌入校准–程序代码
写在前面 由于研究需要,本人深入学习实践了基于微波测试的器件仿真建模技术,至今九年有余.回顾研究经历,从最简单的直通校准到严格的TRL校准,从普通的SAM焊接接头到精密的V波段免焊接接头,从0603封 ...
- JavaScript代码到底是怎么执行的?
本文已收录于专栏 ⭐️ <JavaScript>⭐️ 学习指南: JavaScript执行原理 V8引擎的执行原理 V8执行JavaScript流程概述 AST 词法解析 语法分析 Ign ...
- ClownFish:比手写代码还快的通用数据访问层
最近花了二个月的业余时间重写了我以前的通用数据访问层, 由于是重写,所以我给这个项目取了个新名字:ClownFish 如果需要了解ClownFish的使用方法,请点击ClownFish 使用说明 Cl ...
最新文章
- js递归函数使用介绍
- 30天python开发_30天解锁Python量化开发——初探交易接口
- quot;streambufquot; ambiguous symbol的问题如何解决
- RIPv1 与 RIPv2 基础配置
- 【转载】MySQL索引背后的数据结构及算法原理
- ie11java阻止_企业IT管理员IE11升级指南【10】—— 如何阻止IE11的安装
- g++编译c++11 thread报错问题 及c++多线程操作
- 【Step By Step】将Dotnet Core部署到Docker(中)
- 再谈网络字节顺序,大小端问题
- 近24小时以太坊上的DEX交易量超过150亿美元
- unix linux 安装mono,关于mono在linux连接unixodbc的问题
- 线程池的使用以及其工具类的封装
- CCF专区推荐重点SCI期刊征稿中~
- 驳《寒门再难出贵子》——谁说寒门大学生没有春天!
- easymock 图片_小程序——使用Easy Mock
- 德格:一个专门为中小型企业做定制化服务的SaaS平台
- java中math.ceil用法_[Java教程]关于Math类的round、floor、ceil三个方法
- mysql config.xml_generatorConfig-mysql.xml中连接数据库的正确书写方式。
- excel图片技巧:如何为报表配上节日祝福动画
- 阿里云域名配置过程记录