在阅读Golang源码时,经常看到下面一段汇编代码,如下:
0x00000000004310c8 <+24>: xorps %xmm0,%xmm0
0x00000000004310cb <+27>: movups %xmm0,0x8(%rsp)
0x00000000004310d0 <+32>: movups %xmm0,0x18(%rsp)
0x00000000004310d5 <+37>: movups %xmm0,0x28(%rsp)
xmm0是128位寄存器,一般用于浮点数运算,但程序中没有看到任何浮点数变量,那这段代码是什么意思?
其实很简单,就是将内存置0。如上面这段代码,是将0x8(%rsp)
到0x38(%rsp)
之间的内存置0。为什么要这样置0?因为用的指令更少,xmm0是128位寄存器,每个指令可以清空16byte大小的内存,而如果用MOVQ AX, 0x8
指令,一次只能清空8byte,需要花两倍指令才能达到相同目的。
xorps
异或指令,异或同一个变量结果一定为0,通过xorps %xmm0,%xmm0
就是将xmm0寄存器置0。
在阅读Golang源码时,经常看到下面一段汇编代码,如下: 0x00000000004310c8 <+24>: xorps %xmm0,%xmm0 0x00000000004310cb <+27>: movups %xmm0,0x8(%rsp) 0x00000000004310d0 <+32>: movups %xmm0,0x18(%rsp) 0x00000000004310d5 <+37>: movups %
C语言在访问数组时既可以使用如a[i]这样的下标方式,也可以使用*(a+i)这样的指针方式,理论上完全等价。但是在编译器对循环作优化时,对于指针方式的索引很有可能分析不彻底,因此相比数组索引耗时有所增加
数组索引耗时
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
unsigned long get_start_ms() {
struct timespec ts;
clock_gett.
在上篇《如何选择纠删码编码引擎》中,我们简单了解了 Reed-Solomon Codes(RS 码)的编/解码过程,以及编码引擎的评判标准。但并没有就具体实现进行展开,本篇作为《纠删码技术详解》的下篇,我们将主要探讨工程实现的问题。
这里先简单提炼一下实现高性能纠删码引擎的要点:首先,根据编码理论将矩阵以及有限域的运算工程化,接下来主要通过 SIM.
汇编语言cs:是代码段寄存器,ds是数据段寄存器。
段代码CS:存放当前正在运行的程序代码所在段的段基值,表示当前使用的指令代码可以从该段寄存器指定的存储器段中取得
IP:相应的偏移值。 CS+IP
1. call word ptr + 内存单元地址
这个指令的是先将call指令的下一条指令的IP入栈,然后跳到以内存单元地址为IP的代码处
2.call dword ptr + 内存单元地址
call是汇编指令,用来调用子过程。后面的Dword ptr[40105c]是一个内存地址,就是要调用的子过