第一章
寄存器
CPU中可以存储数据的器件,一个CPU中包含多个寄存器。
MOV AX,BX
AX 是其中一个寄存器代号
BX 是其中另一个寄存器代号
它们有不同的作用,存放的东西也不同,有些存放数据,有些存放指令
汇编语言的组成
- 汇编指令(机器码的助记符)
- 伪指令(由编译器执行)
- 其他符号(由编译器识别)
编译器将伪指令转换成逻辑运算由CPU执行,如+会转换成&|存储器
CPU是计算机的核心部件,它控制整个计算机的运作并进行运算,要想让一个CPU工作,就必须向他提供指令和数据。
指令和数据在寄存器中存放,也就是平时所说的内存- 存储单元
每个存储器被划分为若干个存储单元,存储单元从0开始顺序编号
如:
一个存储器有128个存储单元,
编号从0~127. - CPU要想进行数据读写,必须和外部芯片进行三类信息交互:
- 存储单元的地址(地址信息)
- 芯片的选择、读或写命令(控制信息)
- 读或写的数据(数据信息)
- CPU通过地址总线来指定存储单元
一个CPU有N根地址总线,则可以说这个CPU的地址总线宽度为N。
这样的CPU最多可以寻找2的N次方个内存单元 - 数据总线:CPU与内存或其他器件之间的数据传送是通过数据总线来进行的
数据总线的宽度决定了CPU与外界的数据传送速度 - 控制总线 CPU对外部器件的控制是通控制总线来进行的。
有多少跟控制总线,就意味着CPU提供了多少种对外部器件的控制
内存读写控制总线控制:
其中一根名为读信号输出总线负责由CPU向外传送读信号,CPU向该控制线输出低电平表示要读取信息
有一根名为写信号输出控制线负责由CPU向外发送写信号
地址总线决定了CPU的寻址能力
数据总线决定了CPU与其他器件进行数据传输时一次传送量
控制总线决定了CPU对系统其他器件的控制能力内存地址空间
一个CPU的地址总线宽度是10,那么可以寻址2^10个内存单元,这1024个可寻到的内存单元就构成这个CPU的内存地址空间
- 存储单元
- RAM 随机存储器
- ROM 只读存储器
第二章 寄存器(CPU内部工作原理)
一个典型的CPU包括 运算器 、 控制器 、寄存器,他们通过CPU内部总线相连(区别于外部总线)
8086CPU由14个寄存器:AX BX CX DX SI DI SP BP IP CS SS DS ES PSW
8086CPU所有寄存器都是16位,可以存放2个字节
AX BX CX DX 通常用来存放一般性的数据,被称为通用寄存器
2^4 汇编指令
mov al,0002H
add al,al
add al,al
add al,al
8086CPU有4个段寄存器:
CS DS SS ES
当要访问内存时,由这4个段寄存器提供内存单元的段地址
物理地址=段地址 * 16 + 偏移地址
CS 存放指令的段地址
IP 存放指令偏移地址
8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行
jmp 2AE3:3 访问2AE30+0003 = 2AE33 的内存地址
仅修改IP:
jmp ax (类似mov IP,ax)会将ax内容放入IP中
寄存器(内存)
执行后的值寄存器ax,bx,cx的值
内存数据
| 10000H | 23 |
| 10001H | 11 |
| 10002H | 22 |
| 10003H | 66 |
mov ax,1000H ax=1000
mov ds,ax ds=1000
mov ax,[0] ax=1123
mov bx,[2] bx=6622
mov cx,[1] cx=2211
add bx,[1] bx=6622+2211 = 8833
add cx,[2] cx=2211+6622 = 8833
执行后的值寄存器ax,bx,cx的值
| 10000H | 23 |
| 10001H | 11 |
| 10002H | 22 |
| 10003H | 11 |
mov ax,1000H ax=1000
mov ds,ax ds=1000
mov ax,11316 ax=2C34
mov [0],ax
mov bx,[0] bx=2C34
sub bx,[2] bx=2C34-1122 = 1B12
mov [2],bx
将10000H~1000FH这段空间当作栈,初始状态为空,将AX BX DS的数据入栈
mov ax,1000
mov ss,ax
mov sp,0010(000F + 1)
push ax
push bx
push ds
将10000H~1000FH这段空间当作栈,初始状态为空,设置ax=001AH,bx=001BH
将ax,bx入栈,然后将ax,bx清零
从栈中恢复ax,bx
mov ax,1000
mov ss,ax
mov sp,0010
mov ax,001A
mov BX,001B
push ax
push bx
sub ax,ax
sub bx,bx
pop bx
pop ax
当前栈顶试bx,要交换ax,bx可以pop ax pop bx