https://dman95.github.io/SASM/english.html

信息

信息是不确定性的度量
凡是在能减少不确定性的任何事物都叫信息
熵(entropy)就是信息

信息的最小单元即是: 0-1; 信息的基本操作是取反: ~ 0:0-1V 1:2-5V

常见硬件

  • DRAM
    Dynamic Random Access Memory
    每个位的存储对应对一个电容的充电,电容的电荷会漏电.所以DRAM要不断的刷新这种存储器.(一般用在内存、CCD上)
    SDRAM: Synchronous DRAM
    DDR: Double Data-rate Synchronous DRAM
    DDR2,DDR3..(DDR2-400: 400表示有效频率,核心工作频率是100(MHZ))
  • SRAM
    Static Random Access Memory
    只要有电,SRAM存储内容就会保持不变,并且不需要不停的刷新.存取比DRAM块,不易受到光电干扰.更贵,一般用在寄存器上.
  • 元器件
    反转器: 基本构成是一个三极管
    对信息取反的基本元器件是 “反转器”,不过反转器实现反转是需要时间的,大概 几个纳秒
  • 与非门
    使用两个三极管(串联) + 反转器 = 与门
    {与门} + {非门} = 芯片
  • Hard Disk Drive
    track(磁道与磁道之间存在隔离带,它包含扇区)
    sector(扇区之间也存在隔离带,相邻的扇区合在一起成为"簇")
    sector **=** 前导区(磁头同步) **+** 数据区(85%) **+** 纠错码(Error Correctting Code)
    cylinder(柱面) = 多个磁道纵向排列
  • LVM
    Logical Volume Manager
    新加入的硬盘不会改变上层的逻辑卷,动态调整逻辑卷的大小!
    磁盘被划分为一个个小的PE(PhysicalExtend,每一个大概4MB),该过程称磁盘被格式化为PV(Physical Volume);
    不同的磁盘所对应的PV组成一个VG(Volume Group),相当于一个池子,里面全是小的来自不同磁盘的PE.
    VG被逻辑的分割为一个个LV(Logical Volume),这些LV是呈献给使用者的最终抽象.
  • MBR
    Main Boot Record bootloader(0x0,192K) -> boot parameters -> Kernel(0x30000,1.856M) -> RootFs(0x200000,30M) -> OtherFs(0x2000000,32M)
    开机管理程序.位于磁盘的 0扇区-0磁道, 结束标志是 55AAH, 446B(OS安装时向其写入数据,故可识别FS并载入kernel)
    这里面写入的数据可能是BootLoader-stage1.其作用就是提供选单、载入kernel!
    PartionTable: 记录硬盘分割状态. 64B. 四个分割槽,最小单位为cylinder
    MbrFix  卸载GRUB或修复windows_boot_loader
    mbrfix /drive 0 fixmbr /yes

计算机体系结构

     +--------------------------+
L5   |          C   Go          |
     +------------+-------------+
                  |
                  |
     +------------+-------------+
L4   |         Assembly         |
     +------------+-------------+
                  |
     +------------+-------------+
L2   |           ISA            | 指令系统层(CPU的接口,不同的CPU不同,目前多指x86)
     +------------+-------------+
                  |
     +------------+-------------+
L1   |           MAL            | 微体系结构层(CPU的实现)
     +------------+-------------+
                  | 微指令(由微程序控制,1条微指令对应了一条机器码)操作门电路,是多级流水线划分的基础!
                  |
                  | 微指令在1个周期(取、执行指令)内完成,多条微指令表现为一条汇编指令.CPU以微指令为执行单元;
     +------------+--------------+
L0   |        数字逻辑层         |
     +------------+--------------+
                  |
     +------------+--------------+
     |         物理硬件          |
     +---------------------------+

在最初的计算机设计中,微体系结构层(microarchitecture)并不存在.但是此时的计算机非常复杂(ISA的指令非常复杂多变),下层难以设计.

1951年剑桥大学的研究员设计出了三层模型—在ISA与数字逻辑层之间加入微程序,来解释ISA层的指令.实际上这个过程就是精简了ISA层的指令,是对ISA层的指令一个去粗取精的过程,这减轻了数字逻辑层的设计难度.隔离了复杂问题的硬件设计,转而使用软件来实现.

1960年之前,计算机也就停留在三层—ISA层 + 微体系结构层 + 数字逻辑层;此时的程序员必须使用卡片操作计算机:

1642 法国数学家、物理学家—帕斯卡(1623-1662,39) 制造了世界山第一台计算机.这台计算机只能做加减法操作.它是利用齿轮传动原理制成的机械式计算机.这台计算机通过手摇方式操作运算. 此人在无穷小分析上有诸多先驱性的研究,对后来的莱布尼兹建立"实积分"有很大启发.笛卡尔对其写作的«论圆锥曲线»非常赞赏,但是不敢相信出自16岁少年之手.

1655 帕斯卡进入神学院,他从怀疑论出发,认为感性和理性知识都不可靠,从而得出"信仰高于一切"的结论. 他的«算术三角形»论文称为概率论的基础.他最早引入了椭圆积分.

1674 德国数学家、物理学家—莱布尼兹(1646-1716,70) 发明了可进行四则运算的机械计算机.此人独立发明了微积分(从几何角度出发,严密性要强于牛顿),首先引入了行列式的概念,他还率先提出了二进制数运算法则. 莱布尼兹晚年患有胆结石,卧床一周后去世.

1834 英国数学家—巴贝奇(1792-1871,79)发明了分析机.这台机器太过先进,超出了当时的制造工艺100年.

1936 英国数学家—图灵(Turing,1912-1954,42) 提出了"图灵机"模型.16岁便通读爱因斯坦著作.由于咬了一口含有氰化物的苹果而死,后人传言"苹果公司"的标识便来源于此.

CPU

机器码: 二进制代码,用于驱动CPU工作,人类一般无法区分机器码中的指令和数据!

地址总线: CPU有N根地址总线,则CPU地址总线宽度为N;CPU可以寻找2^N个内存单元!

数据总线: CPU有N根数据总线,则CPU一次可以传送N位数据!

控制总线: CPU有N根控制总线,则CPU对外部器件有N种控制能力!

内存地址空间: 主板上的各种扩展卡通过总线与CPU相连,被CPU直接控制;

CPU把内存、显存、网卡ROM、系统ROM都映射到内存地址空间,当然内存地址空间的寻址能力,受到地址总线的限制.

所有的CPU通常都会从某个由CPU制造商预先设定的地址上取指令(0xFFFFH:BIOS地址)

  • 从本质上来说,大脑需要包含记忆,所以内存可以包含于CPU,但是价格、散热、可扩展性等因素制约了这种可能性
  • 如果所有的外设与CPU共用一条总线(如ISA)则CPU必须与最慢的一个设备保持同步;
  • CPU 通过外部总线、北桥芯片与内存交流;
  • CPU 通过管脚与外界通信,管脚是外部总线与内部总线的桥梁:
  • CPU 为了量化处理事件,需要一个周期特性;
  • CPU 执行指令分为四个级别,Windows使用了其中的两个:Ring0,Ring3,前者表示系统级别

CPU3种模式

实时模式: 段地址 + 偏移地址 = 物理地址

保护模式: 进程地址空间独立,进程2GB地址空间+2GB系统使用的地址空间

系统管理模式: firmware,BIOS

MMU: Memory Management Unit,虚拟地址到物理地址的映射!

register

CPU共有24个逻辑的寄存器(8个32位:E + 8个16位:X + 8个8位:L,H)和一个32位EFlags寄存器,实际上,这几个寄存器是重叠的.

通用寄存器

一般放在地址偏移中: [si] [di]. ESI/SI: Source Index Register源变址寄存器(指令中源操作数的指针) EDI/DI: Destination Index Register目的变址寄存器(指令中目的操作数的指针)

指针寄存器

EBP/BP: Base Pointer基指针寄存器(存取堆栈中的数据).一般[bp]存放这SS偏移地址. ESP/SP: Stack Pointer堆栈指针寄存器(相对于栈顶段地址的偏移量,push时,SP-2,pop时+2) EIP/IP: Instruction Pointer Register(下次要执行指令在代码段的偏移量,加电启动时IP=0000H)

段寄存器

CPU对内存的分段管理,并不支持将数值直接放入段寄存器 CS: Code Segment Register(CPU配合IP在CS中读取指令执行,加电启动时CS=ffffH) DS: Data Segment Register(存放要访问的数据段地址) SS: Stack Segment Register(存放栈顶的段地址) ES: Extra Segment Register

demo

80x86指令集不允许两个操作数都为内存变量.伪指令不被CPU执行!由编译器执行!1个有意义的汇编程序至少有个代码段.

括号表示其内容,如(ax)=0001h表ax中的内容为0001h;只有bx,bp,si,di可以用在偏移量[]中,并且bx,bp与si,di不能够同时出现!

; 操作数必须具有相同的位数,vc编译器把dst放在前面(Intel格式)!; AT&T格式汇编,寄存器前面要加上%作为前缀,如 push %eax.; AT&T格式汇编,立即数前面需有$前缀,如 push $1.
mov(src_operand,dst_operand) ; src_operand = dst_operand;
add(src_operand,dst_operand) ; dst_operand+= src_operand;
sub(src_operand,dst_operand) ; dst_operand-= src_operand;

mov ax,bx ;拷贝寄存器bx中的值到ax中
add ax,bx ;将寄存器ax,bx中的值相加,结果存放到ax中,等价于: (ax) = (ax) + 2
sub ax,ax ;将ax清零,== mov ax,0
jmp ax,ip ;ax内值不变,CS不变,IP内的值变为ax内的值;虽然类似于mov IP,ax 但是不能这样使用
inc bx    ;(bx)加1

and bx    ;按位与
or  bx    ;按位或
pop ax    ;从栈顶取数据,放入ax中.SP+2.
push ax   ;将寄存器ax中的数值放入程序栈中.SP-2.
dw  define-word,2B
db  define-byte,1B
dd  double-word,4B

mov bx,1000H
mov ds,bx  ;8086CPU不支持直接将值赋给段寄存器
mov al,[0] ;等价于: mov al,ds:[0]
mov al,[bx+2] ;偏移量为:(bx)+2
mov [0],al ;将al内的内容拷贝到地址空间中该地址:1000H:0
mov cx,11  ;做11次循环:(ax)^11 

; s:标号,表示了一个地址
s: add ax,ax
   loop s