==============================

敬请关注:“固件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内核导读》如果没有内存,程序代码还能不能执行?相关推荐

  1. 《UEFI内核导读》全集,2023年更新

    ===================================================================== 固件C字营·版权所有·欢迎转载 敬请关注We-Chat:&q ...

  2. java中异常抛出后代码还会继续执行吗

    java中异常抛出后代码还会继续执行吗 参考文章: (1)java中异常抛出后代码还会继续执行吗 (2)https://www.cnblogs.com/xiaoshen666/p/10848827.h ...

  3. 《UEFI内核导读》UEFI是不是操作系统?

    ================================ 敬请关注微信公众号:"固件C字营" =============================== 最近一直在思考 ...

  4. 《UEFI内核导读》ACPI编程入门

    固件C字营·版权所有 敬请关注微信公众号:"固件C字营" ============================================================= ...

  5. ​《UEFI内核导读》UEFI中驱动的执行顺序

    ============================== 敬请关注:"固件C字营" ============================== UEFI中DXE驱动或PEIM ...

  6. 一文讲解,Linux内核——Memory Barrier(内存屏障)

    本文例子均在 Linux(g++)下验证通过,CPU 为 X86-64 处理器架构.所有罗列的 Linux 内核代码也均在(或只在)X86-64 下有效. 本文首先通过范例(以及内核代码)来解释 Me ...

  7. 【代码分享】TRL微波器件测量去嵌入校准–程序代码

    写在前面 由于研究需要,本人深入学习实践了基于微波测试的器件仿真建模技术,至今九年有余.回顾研究经历,从最简单的直通校准到严格的TRL校准,从普通的SAM焊接接头到精密的V波段免焊接接头,从0603封 ...

  8. JavaScript代码到底是怎么执行的?

    本文已收录于专栏 ⭐️ <JavaScript>⭐️ 学习指南: JavaScript执行原理 V8引擎的执行原理 V8执行JavaScript流程概述 AST 词法解析 语法分析 Ign ...

  9. ClownFish:比手写代码还快的通用数据访问层

    最近花了二个月的业余时间重写了我以前的通用数据访问层, 由于是重写,所以我给这个项目取了个新名字:ClownFish 如果需要了解ClownFish的使用方法,请点击ClownFish 使用说明 Cl ...

最新文章

  1. js递归函数使用介绍
  2. 30天python开发_30天解锁Python量化开发——初探交易接口
  3. quot;streambufquot; ambiguous symbol的问题如何解决
  4. RIPv1 与 RIPv2 基础配置
  5. 【转载】MySQL索引背后的数据结构及算法原理
  6. ie11java阻止_企业IT管理员IE11升级指南【10】—— 如何阻止IE11的安装
  7. g++编译c++11 thread报错问题 及c++多线程操作
  8. 【Step By Step】将Dotnet Core部署到Docker(中)
  9. 再谈网络字节顺序,大小端问题
  10. 近24小时以太坊上的DEX交易量超过150亿美元
  11. unix linux 安装mono,关于mono在linux连接unixodbc的问题
  12. 线程池的使用以及其工具类的封装
  13. CCF专区推荐重点SCI期刊征稿中~
  14. 驳《寒门再难出贵子》——谁说寒门大学生没有春天!
  15. easymock 图片_小程序——使用Easy Mock
  16. 德格:一个专门为中小型企业做定制化服务的SaaS平台
  17. java中math.ceil用法_[Java教程]关于Math类的round、floor、ceil三个方法
  18. mysql config.xml_generatorConfig-mysql.xml中连接数据库的正确书写方式。
  19. excel图片技巧:如何为报表配上节日祝福动画
  20. 阿里云域名配置过程记录

热门文章

  1. 说“快乐”还是“安康”?如何在不抬杠的情况下用AI搞定这问题
  2. VScode英文转中文版
  3. 主成分在spss中的操作应用
  4. yolov3学习笔记-labelImg数据标注工具安装
  5. JAVA 反射机制
  6. Microsoft Visual C++下载,VC++下载
  7. 关于Flappy bird中水管与小鸟的碰撞
  8. Python-Excel文件操作-Excel文件比对-GUI
  9. 通过TCP调试Modbus RTU
  10. Python基础训练100题(带答案),刷题一时爽,一直刷题一直爽