寄存器

8086CPU 的寄存器都是16 位的。通用寄存器包括:AX、BX、CX、DX、SI、DI、BP、SP,他们可以存放一般性的数据。其中 AX、BX、CX、DX 这 4 个寄存器可以拆成两个 8 位寄存器。比如:AX 可分为 AH 和 AL。

字:记为 word,一个字由两字节组成。

8086 的物理地址计算方法

8086 是 16 位 CPU,也就是说,在 8086 内部,能够一次性处理、传输、暂时存储的信息的最大长度是 16 位的。

8086 CPU 有 20 位地址总线,可以传送 20 位地址,达到 1MB 的寻址能力。但是 8086 CPU 又是 16 位结构,因此 8086CPU 采用一种在内部用两个 16 位地址合成的方法来形成一个 20 位的物理地址。如下:

1
物理地址 = 段地址 * 16 + 偏移地址

查看更多

8086 处理器

如下是 8086 处理器的内部组成框图

s

在进行数据传送或者算术逻辑运算的时候,使用算术逻辑部件(ALU)。比如,将AX的内容和CX的内容相加,结果仍在AX中,那么,在相加的结果返回到AX之前,需要通过一个叫数据暂存器的寄存器中转。

处理器能够自动运行,这是控制器的功劳。为了加快指令执行速度,8086内部有一个6字节的指令预取队列,在处理器忙着执行那些不需要访问内存的指令时,指令预取部件可以趁机访问内存预取指令。这时,多达6个字节的指令流可以排队等待解码和执行

查看更多

python代码打包成二进制

python代码打包成二进制

本文是通过 pyinstaller 来实现将 python 代码打包成二进制

一、使用 pyinstaller

安装:pip install pyinstaller

使用:

1
2
3
4
pyinstaller -F -w -i xxx.ico xxx.py
-w: 表示程序启动时不会打开命令行,也就是不会有控制台窗口。GUI 界面用此参数很有效果
-F:代表制作独立的可执行程序
-i:表示设置自己的图标图案

查看更多

虚继承和虚基类

C++ 中多继承很容易产生命名冲突,也就是说基类和继承类中如果有同名变量,编译器不知道选用哪一个,就会产生歧义。

而且继承类对象还保留了基类的成员,但大多数情况下,这些成员是多余的,很容易造成数据冗余

而且还会造成菱形继承中问题。

1
2
3
4
class A { int m_a; };
class B : public A { int m_b; }
class C : public A { int m_c; }
class D : public B, public C { int m_d; }

查看更多

宏 __COUNTER__ 使用

__COUNTER__ 使用

我曾经写过如下的代码,在此记录下对于宏 __COUNTER__ 的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 实际的插件注册动作,通过定义类对象,到达调用构造函数的目的
#define RESMON_V2_REGISTER_CLASS_PLUGIN(Derived, Base, UniqueID) \
namespace { \
struct ProxyExec##UniqueID { \
typedef Derived _Derived; \
typedef Base _Base; \
ProxyExec##UniqueID() { \
register_plugin<_Derived, _Base>(#Derived, #Base); \
} \
}; \
static ProxyExec##UniqueID g_register_plugin_##UniqueID; \
}

// 实际的注册插件动作的中转层,为了保证 __COUNTER__ 可用
#define RESMON_V2_REGISTER_CLASS(Derived, Base, UniqueID) \
RESMON_V2_REGISTER_CLASS_PLUGIN(Derived, Base, UniqueID)

// 提供给外部插件的宏,用于插件注册
#define RESMON_V2_REGISTER_MONITOR_ITEM(Derived) \
RESMON_V2_REGISTER_CLASS(Derived, baidu::pavaro::resmon_v2::MonitorItemBase, __COUNTER__)

这段代码的作用就是借助静态的全局变量会自动初始化的特点,自动调用构造函数,而在构造函数中实现一些业务逻辑,以达到程序员的目的。使用宏定义在编译时就生成这些代码,需要生成不同的全局变量。因此我们借助宏 __COUNTER__

1
2
3
4
This macro expands to sequential integral values starting from 0\. 
In conjunction with the ## operator, this provides a convenient means to generate unique identifiers.
Care must be taken to ensure that __COUNTER__ is not expanded prior to inclusion of precompiled headers which use it.
Otherwise, the precompiled headers will not be used.

查看更多