GCC Inline ASM

GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作GCC Inline ASM——GCC内联汇编。这是一个非常有用的功能,有利于我们将一些C/C++语法无法表达指令直接潜入C/C++代码中,另外也允许我们直接写 C/C++代码中使用汇编编写简洁高效的代码。 1.基本内联汇编 GCC中基本的内联汇编非常易懂,我们先来看两个简单的例子: __asm__("movl %esp,%eax"); // 看起来很熟悉吧! 或者是 __asm__("movl $1,%eax // SYS_exitxor %ebx,%ebxint $0x80"); 或 __asm__("movl $1,%eax/r/t" /"xor %ebx,%ebx/r/t" /"int $0x80" /); 2.基本内联汇编的格式 __asm__ __volatile__("Instruction List"); 1、asm __asm__是GCC关键字asm的宏定义: #define __asm__ asm __asm__或asm用来声明一个内联汇编表达式,所以任何一个内联汇编表达式都是以它开头的,是必不可少的。 2、Instruction List Instruction List是汇编指令序列。它可以是空的,比如:__asm__ __volatile__(""); 或 __asm__ (""); 都是完全合法的内联汇编表达式,只不过这两条语句没有什么意义。 但并非所有Instruction List为空的内联汇编表达式都是没有意义的,比如: __asm__ ("":::"memory"); 就非常有意义,它向GCC声明:“我对内存作了改动”,GCC在编译的时候,会将此因素考虑进去。 我们看一看下面这个例子: $ cat example1.c int main(int __argc, char* __argv[]) { int* __p = (int*)__argc; (*__p) = 9999; //__asm__("":::"memory"); if ((*__p) == 9999) { return 5; } return (*__p); } 在这段代码中,那条内联汇编是被注释掉的。在这条内联汇编之前,内存指针__p所指向的内存被赋值为9999,随即在内联汇编之后,一条if语句判断__p 所指向的内存与9999是否相等。很明显,它们是相等的。GCC在优化编译的时候能够很聪明的发现这一点。我们使用下面的命令行对其进行编译:……

阅读全文

Tensorflow2.0 笔记(2)

六步法 import train, test 网络结构 model=tf.keras.models.Sequential # 搭建网络结构 class MyModel(Model) model = MyModel model.compile # 配置训练优化器,损失函数 model.fit # 输入特征,batch, epoch model.summary 网络结构 拉直层 tf.keras.layers.Flatten() 全连接层 tf.keras.layers.Dense(神经元个数, activation="激活函数", kernel_regularizer="正则化") 卷积层 tf.keras.layers.Conv2D(filters=卷积核个数, kernel_size=卷积核尺寸, strides=卷积步长, padding="valid" or "same") LSTM层 tf.keras.layers.LSTM() 训练方法 model.compile(optimizer=优化器, loss=损失函数, metrics=["准确率"]) Optimizer sgd adagrad adadelta adam loss Metrics 训练过程 model.fit(训练集的输入特征, 训练集的标签, batch_size=, epochs=, validation_data=(测试集的输入特征, 测试集的标签), validation_split=从训练集划分多少比例分给测试集, validation_freq=多少次epoch测试一次) ……

阅读全文

Tensorflow2.0 笔记(3)

CNN 输入特征图的深度(channel数),决定了当前层卷积核的深度; 当前层卷积核的个数,决定了当前层输出特征图的深度; tf.keras.layers.Conv2D( kernel_size=卷积核尺寸, strides=滑动补偿, padding="same" or "valid", activation="relu" or "sigmoid" or "tanh" or "softmax", input_shape=(高, 宽, 通道数) ) 批标准化(Batch Normalization, BN) 池化 池化用于减少特征数据量,最大值池化可提取图片纹理,均值池化可保留背景特征。 舍弃 Dropout 训练时,一定概率随机舍弃神经元。网络使用时,恢复神经元。 卷积神经网络结构 卷积:特征提取器,CBAPD(Convolutinoal, BN, Activation, Pooling, Dropout)……

阅读全文

mediapipe

Google推出的将机器学习/深度学习进行产品化的框架,主要是其中类似tensorflow中图编辑模式。但我们只是看中了人家训练好的手部跟踪的demo。 使用bazel编译系统,但bazel这坑货又不支持proxy。那就需要搞明白所有的编译规则,然后把包挨个离线下下来,然后使用local_repo的方式进行编译。……

阅读全文

x86寄存器汇总

x86寄存器分类 8个通用寄存器 均为32位。 EAX 累加寄存器(Accumulator Register)。 EBX 基地址寄存器(Base Register)。 ECX 计数寄存器(Count Register)。 EDX 数据寄存器(Data Register)。 ESI EDI 源/目标索引寄存器(Source/Destination Index Register) ESP 基指针寄存器(Base Pointer Register) EBP 堆栈指针寄存器(Stack Pointer Register) 6个段寄存器 段寄存器均为16位。 CS 指向代码段的段选择符,与EIP寄存器联合构成指令地址。 DS ES FS GS 指向数据段。 SS 指向栈段的段选择符。 5个控制寄存器 均为32位。……

阅读全文