Site Overlay

X86 汇编笔记:第 2 章 处理器、内存和指令

什么是寄存器、内存和外存

如果把被储存的东西比作能量:

  1. 寄存器就是 ATP,可以随时拿来用,性能高,但数量有限;
  2. 内存就是葡萄糖,性能一般,但是存量可以比较多;
  3. 外存(比如硬盘)就是脂肪,容量可以非常大,性能很差,要先转化为葡萄糖(存进内存),然后转化为 ATP(放到寄存器)才能直接利用(存取)。

寄存器怎么存东西?存的是什么东西?

处理器有内部线路,称为内部总线(Internal Bus),内部线路计算之后输出的是高低电压(电压的比值取对数叫电平),寄存器连在内部总线上,把高低电压的状态保持起来,就完成了储存。这种高低电平就是二进制数据的一种物理形式。因此,寄存器存的二进制数据。不过具体来讲,可以存指令、数据和地址[^1]。

2019-06-22T13:41:29.png

RA, RB 是什么鬼?

它们的第一个字母 R 就是寄存器(Register)的意思。A,B 的先当做个代号,不用管意思。

处理器是怎么计算的?

寄存器是双向元件(就像个水泵,能进水也能出水)。接受输入并储存后,会保持不变,然后输出之前所输入的值。如图,RA, RB 的输出连到了算数逻辑单元上,这个东西一算^2,就得到了结果(高低电平),存到 RC(又一个寄存器) 中。

8 位,16 位,32 位,64 位是什么意思?

就是寄存器的容量。8 位寄存器可以容纳 8 位二进制,也叫一个字节。这个似乎还等于数据线宽度(存疑)。

什么是字、双字?

字(word)是一个数据单位。现在一般 $1 word = 2 bytes = 16 bits$,不过并不一定。双字就是字面意思,2 words。

什么是内存?有什么用?

各位都是装⚨机大神还要我废话吗 (=・ω・=),各位只要知道它还叫内储存器就行了。

处理器如何访问内存?

内存和内存访问示意图

如图,图左边有条内存。内存的左边是地址,下边是改地址的字节内容。处理器要访问内存,就像我们去菜市场买卖东西,要提供以下信息:

  1. 地址;
  2. 字长(读写的位数);
  3. 方式(读还是写);

这里的访问就是指读写行为

什么是指令、操作码、操作数?

指令(Instruction)就是对计算机的行为的指示。指令包括操作码和操作数。可以认为指令就是一个语句,操作码就是语句的函数,操作数就是函数的自变量。

比如发送一条指令,操作码:B8,操作数:寄存器和立即数。那么执行之后,计算机认得这个指令,就把立即数放到寄存器中。

立即数是什么鬼?

立即数就是写在指令里的常数。还是用函数举例子,函数语句 y = f(x,12),那么这个 12 就在函数语句里,相当于指令里的立即数。

数据如何在内存存放?

我们要引入 LE 和 BE 的概念。

LE 和 BE^3

对于数据0x01020304,在内存中存为:01020304,和我们的书写顺序一致,这就叫做大端序(Big-Endian)。

对于数据0x01020304,在内存中存为:04030201,和我们的书写顺序相反,这就叫做小端序(Big-Endian)。

要是记不住,就叫你个口诀:“六六大顺”,意思是大端方式符合书写顺序。不要笑我,我自己编的(滑稽。

数据或指令在内存中虽然有大端序和小端序的存放方式区别,但是都是以二进制方式存放的。而且分为多个区:

  1. 数据区。存放数据。
  2. 代码区。存放指令。

当然还有其它的分法,这里只是其中一种。

什么是指令集?

某种处理器支持的指令的集合。

8086 的通用寄存器

有八个,每个容量为 16 位,且 AX, BX, CX, DX 每个又可均分为两个。具体如下:

8086 的通用寄存器

这里的 H 和 L 其实就是 High 和 Low,表示高位和低位。

控制器是什么,有什么用?

控制器的组分:(这里三个存疑,有说五个)

  1. 指令寄存器 (Instruction Register, IR):保存当前执行或即将执行的指令;
  2. 程序计数器 (Program Counter, PC):存放下一条指令所在单元的地址^4。又叫指令指针(Instruction Pointer, IP);
  3. 操作控制器 (Operation Controller, OC):根据指令操作码和时序信号,产生各种操作控制信号,以便正确地建立数据通路,从而完成取指令和执行指令的控制。

段寄存器

C, D, E, F 四个。我不 BB 了,直接上网址:https://zh.wikipedia.org/wiki/Intel_8086#%E5%AF%84%E5%AD%98%E5%99%A8%E4%B8%8E%E6%8C%87%E4%BB%A4

如何从逻辑地址得到物理地址?

对于逻辑地址 F000H:052DH,处理器在形成物理地址时,将段地址 F000H (段地址)左移 4 位,变成 F0000H,加上偏移地址 052DH,就形成了 20 位的物理地址 F052DH。

这里相当于函数 f(x,y)= Ax+y (注意,这里是十六进制函数),也就是一个平面。通过这个操作可以用少量的两个变量表示巨大的内存范围,至于为什么,看图:

z轴就是 f 的范围

此致。

[^1]: 寄存器 维基百科:https://zh.wikipedia.org/zh/%E5%AF%84%E5%AD%98%E5%99%A8

发表评论

电子邮件地址不会被公开。 必填项已用*标注