自己动手发明编程语言
❯
教程介绍📘
❯
在线体验编译器🚀
❯
为什么要发明一个新的编程语言?☕
❯
开始🔛
❯
开发编译器的流程 🚀
❯
基础理论和原理 ⚛️
❯
计算机指令基础 (CPU)🖥️
❯
自定义虚拟机指令(VM) 🕹️
❯
C语言崩溃栈信息🐞
❯
设计强化虚拟机指令(VM) 🕹️
❯
手搓编写词法分析(Lexer)📜
❯
手搓表达式编译 🔥
❯
手搓 if-else 语法编译 ⚙️🔗
❯
手搓 for 语法编译 ⚙️🔗
❯
手搓 while 语法编译 ⚙️🔗
❯
手搓 函数调用 语法编译 ⚙️🔗
❯
虚拟机高性能优化 🚀
❯
try catch异常捕获简单实现🐞
❯
手搓即时编译(JIT)入门 ⚡️
❯
包管理器开发入门 📦📦
❯
开发故事
# 计算机指令基础 (CPU)🖥️ 上一节中我们提到: >在计算器 CPU 中通常有很多寄存器,因为在CPU内部,所以CPU访问这些寄存器要比内存快多了。所以计算机指令或者说CPU指令通常是在操作寄存器。 > >这里我们需要用到两个指令 mov 和 add : > - mov 在内存和寄存器之间做数据移动 > - add 加法指令 ## 寄存器 在 x86-64 CPU中,通用寄存器有16个:RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, R8 到 R15 。 这些64位寄存器,实际上是从 32位寄存器发展而来。比如 RAX的低32位是 EAX 。 32位寄存器又是从16位 或 8位寄存器发展而来,比如 EAX的低16位是 AX ,AX的低8位是 AL ,AX的高8位是AH 。 除了通用寄存器,还有一些特殊的寄存器,比如 RIP 指令指针寄存器,保存当前指令的地址,32位CPU中是EIP 。比如浮点寄存器,控制寄存器等。 寄存器在CPU内部,访问起来非常快,比内存快多了,但是寄存器数量有限,尽可能使用寄存器可以提高程序的运行速度。 ## 基础指令 一般格式为 ```` 指令名字 ,目标操作数, 源操作数 ```` ### ADD 加法 ADD destination , source ; 例子 add edi,esi 将 esi 中的数值加到 edi寄存器上,结果保存在 edi 中。 ### SUB 减法 格式:SUB destination, source; 例子 add edi,esi 将 edi 值减去 esi寄存器上,结果保存在 edi 中。 ### IMUL 乘法 格式:IMUL destiontiion, source; 例子 imul edi,esi 将 edi*esi的结果存回 edi 中。 ### DIV 除法 无符号除法,DIV EBX 使用EDX:EAX作为被除数,除以EBX,商存于EAX,余数存于EDX。 ### IDIV 除法 有符号除法。其它与DIV相似。 实际上这些指令在 x86的 16/32/64位环境,和不同的字节操作数下使用具体寄存器都有所差异,需要查CPU手册确认。 ### 浮点数 以上还只是整数的加减乘除运算,浮点数则需要使用 ADDSS(单精度浮点数加法)或 ADDSD(双精度浮点数)指令。 使用的寄存器也是不同的,通常使用 xmm0、xmm1 等浮点数寄存器来参与运算和保存结果。 为了使用这些浮点数寄存器,引入了 MOVSS、MOVSD等浮点数加载指令。这些指令均属于SSE指令集,相关的还有AVX指令集。 这里回顾一下历史,Intel 在1997年发布了 MMX (MultiMedia eXtension)多媒体指令扩展,1999年发布了SSE(Streaming SIMD Extensions),2011年发布了AVX(Advanced Vector Extenions),2013年 AVX2 ,2016年 AVX-512 。 ### SIMD SIMD 也就是 Single Instruction Multiple Data ,允许单条指令同时对多个数据点进行操作,这样可以非常高效的处理数据,对现代大规模数据处理和运算非常重要。 例子,有两个包含4个浮点数的数组 a 和 b,通过SIMD指令 addps 将这两个数组中的对应元素相加,结果保存到新数组 c 中。 需要指出的是SSE、SIMD 等指令是非常依赖具体CPU型号的。这些存在于 x86 的指令,并不兼容ARM平台。
Hello!请先完成登录验证
微信公众号
哈希空间
扫码进入公众号回复 9 即可完成验证,实现自动登录网站。
关注就是支持,更好的服务提供给粉丝