汇编 | AT&T和Intel规范的区别
概述
常见的指令集以及汇编语言规范: x86(IA-32)、x86-64指令集(常见于PC端),对应有2家公司发布的不同汇编语言规范:
- intel公司发布的汇编语言规范,称
intel 汇编:Windows派系(Microsoft),比较著名的汇编器有微软的masm和开源的nasm。 - AT&T公司发布的汇编语言规范,称
AT&T 汇编:Unix派系(或者说GNU),比如g++编译器等。
AT&T格式 和 Intel格式的区别
表格如下:
……常见的指令集以及汇编语言规范: x86(IA-32)、x86-64指令集(常见于PC端),对应有2家公司发布的不同汇编语言规范:
intel 汇编:Windows派系(Microsoft),比较著名的汇编器有微软的masm和开源的nasm。AT&T 汇编:Unix派系(或者说GNU),比如g++编译器等。表格如下:
……在最新的skynet中我使用的是云风的pbc库来解析protobuf,该项目中的一个文件protobuf.lua 使用了module语法在lua5.1版本中已经删除,最新的skynet是lua5.4版本,于是我找到了解析protobuf的lua库–lua-protobuf。在最新的skynet中,集成lua-protobuf
……google protobuf已经提供了空参数
//empty.proto
message Empty {<!-- -->}
使用方法,在proto文件中导入empty.proto, 定义一个请求参数和返回值为空的函数emptyfunction, 函数名字可以自定义。
//server.proto
import "google/protobuf/empty.proto";
service pbservice{
rpc emptyfunction(google.protobuf.Empty) return{google.protobuf.Empty}
}
以golang语言为例子,在go中对应的函数为:
……最近在巩固cgo的基础知识,在网上看到一篇Go和C之间 字符串数组、切片类型转换的文章,让我想到我之前写的一篇在go中遍历C结构体数组的文章,让我有新的方法来解决之前的问题,把C的数组转化为Go的切片,对于文章的方法我直接”拿来主义“。
我们将一段特定长度的内存统称为数组。C语言的字符串是一个char类型的数组,字符串的长度需要根据表示结尾的NULL字符的位置确定。C语言中没有切片类型。
在Go语言中,数组是一种值类型,而且数组的长度是数组类型的一个部分。Go语言字符串对应一段长度确定的只读byte类型的内存。Go语言的切片则是一个简化版的动态数组。
Go语言和C语言的数组、字符串和切片之间的相互转换可以简化为Go语言的切片和C语言中指向一定长度内存的指针之间的转换。
引用云风博客的话:“skynet 是一个为网络游戏服务器设计的轻量框架。但它本身并没有任何为网络游戏业务而特别设计的部分,所以尽可以把它用于其它领域。skynet 并不是一个开箱即用的引擎,使用它需要先对框架本身的结构有所了解,理解框架到底帮助开发者解决怎样的问题。如果你希望使用这个框架来开发网络游戏服务器,你将发现,skynet 并不会引导你把服务器搭建起来。它更像是一套工具,只有你知道你想做什么,它才会帮助你更有效率的完成。”
详情请参考:https://github.com/cloudwu/skynet/wiki/GettingStarted
Redis中的List是一个有序(按加入的时序排序)的数据结构,一般有序我们会采用数组或者是双向链表,其中双向链表由于有前后指针实际上会很浪费内存。3.2版本之前采用两种数据结构作为底层实现:
ziplist的数据结构及解释如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3sqBo573-1610531492142)(https://s3.ax1x.com/2021/01/10/s18atJ.png)]ziplist的节点信息如下:
下载6.2版本. 我使用的是国内github镜像地址:github.com.cnpmjs.org,速度比较快。
$ git clone https://github.com.cnpmjs.org/redis/redis.git redis
$ git checkout -b 6.2 remotes/origin/6.2
使用插件:
cd redis && make -j4
打开redis目录后直接按F5,会出现选择启动调试。选择c++(GDB/LLDB)
选择之后在左边的.vscode目录下会出现launch.json文件,将program修改为${workspaceFolder}/src/redis-server
使用VScode的时候,断点看到指针显示的是一串地址,而不是指针指向的对象的值。上网找了一圈,没看到vscode有对应的插件来解决这个问题。vscode有对应的语法来解决这个问题。
网上几乎都在说在监视栏添加下面的表达式可以解决问题, 可以查看int arr_name[10]的值:
现在有个应用场景,我们要在go中获取C结构体数组中的值。在C语言中,对于结构体数组,我们可以利用指针的偏移量来获取我们想要的值的位置。在go中我们怎么使用C指针和偏移量进行运算呢?下面的文字中C指的是C语言
SDS头文件及作用sds.h中有这样一行代码typedef char *sds;
很清晰、明了,sds其实就是char*。
最新的6.2分支的代码:
struct __attribute__ ((__packed__)) sdshdr5 {<!-- -->
unsigned char flags; /* 3 lsb of type, and 5 msb of string length */
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr8 {<!-- -->
uint8_t len; /* used */
uint8_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr16 {<!-- -->
uint16_t len; /* used */
uint16_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr32 {<!-- -->
uint32_t len; /* used */
uint32_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr64 {<!-- -->
uint64_t len; /* used */
uint64_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
};
__attribute__ ((__packed__))的设置是告诉编译器取消字节对齐,则结构体的大小就是按照结构体成员实际大小相加得到的。
Redis是在3.2版本(包括3.2)之后把sdshdr改为现在这样的。