第一章基础知识
小结
- 汇编指令是机器指令的助记符,同机器指令一一对应。
- cpu可以直接使用的信息在存储器中存放。
- 在存储器中指令和数据没有任何区别,都是二进制信息。
- 存储单元从零开始变写信号。
- 每一个cpu芯片都有许多管脚,这些管脚和总线相连,也可以说这些管脚引出总线,一个cpu可以引出3种总线的宽度标志了这个cpu的不同方面的性能
- 地址总线的宽度决定了cpu的寻址能力
- 数据总线的宽度决定了cpu与其他器件进行数据传送时的一次数据传送量
- 控制总线的宽度决定了cpu对系统种其他器件的控制能力。
存储器的分类
- 随机存储器
- 装有BIOS的ROM(主板上的ROM种存储着主板的BIOS,显卡中的ROM中存储着显卡的BIOS,如果网卡中装有ROM那么可以存储网卡的BIOS)
- 接口卡上的RAM(显卡上的RAM,一般称为显存。用于对大批量输入输出的数据进行暂时存储,在其上装有RAM)
内存地址空间
上述存储器在物理上是独立器件,但是以下两点上相同
- 都和cpu总线相连
- cpu对他们进行读写时都通过控制线发出内存独写命令
也就是说cpu在操控它们的时候都把他们当作内存来对待,把它们总的看成若干存储单元组成的逻辑存储器。
将各类存储器看成一个逻辑存储器
8086cpu机内存地址空间分配
- 从地址0-9ffff的内存单元中读取数据,实际就是在读取主随机存储器中的数据
- 向地址A0000-BFFFF的内存单元中写数据,就是向显存中写入数据,这些数据会被显示卡输出到显示器上
- 向地址C0000-FFFFF的内存单元写数据是无效的,因为只读存储器的内容无法被修改
第二章寄存器
知识小结
- 8086cpu的所有寄存器都是16位的,可以存放2个字节。
- 其中有四个寄存器通常用来存放一般性的数据,称为通用寄存器。AX,BX,CX,DX。又因为8086cpu上一代的寄存器都是8位的,为了保证兼容,8086cpu的通用寄存器可以分为两个独立的寄存器来使用,例如AX可以分成AH,AL。
- 一个字可以存储在一个16位的寄存器中,这个字的高位字节和低位字节分别存储在寄存器的高8位寄存器和低8位寄存器。
- 16位cpu具有下面几个方面的结构特性。
1).运算器最多可以处理16位的数据。
2)寄存器的最大宽度为16位。
3)寄存器和运算器之间的通路为16位。 - 8086cpu有20位地址总线,达到1MB的寻址能力,而8086cpu是16位结构,一次只能暂时存储的地址为16位为此采用“段地址*16+偏移地址=物理地址”的寻址方法。
- 当8086cpu要独写内存时
1)cpu中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址。
2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件。
3)地址加法器将两个16位地址合成为一个20位的物理地址。
4)地址加法器通过内部总线将20位物理地址送入输入输出控制电路
5)输入输出控制电路将20位物理地址送上地址总线
6)20位物理地址被地址总线传送到存储器。 - cpu可以用不同的段地址和偏移地址形成同一个物理地址
- 偏移地址16位,变化范围为0-FFFFH,仅用偏移地址寻址最多可寻64KB内存单元
- 根据需要可以将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。
- 10.8086cpu有4个段寄存:CS、DS、SS、ES
- cs用来存放指令的段地址,ip用来存放指令的偏移地址.8086机种,任何时刻cpu将cs:ip指向的内容当作指令执行。
- 可以使用“jmp段地址:偏移地址”来同时修改cs、ip的内容。使用“jmp 某一合法寄存器”来修改ip的内容
- 8086cpu工作过程
1)从cs:ip指向的内存单元读取指令,读取的指令进入指令缓冲器
2)ip指向下一条指令
3)指向指令,跳到步骤1,重复这个过程。
实验小结
- R命令:
1)可以使用“r”用来查看cpu寄存器的内容。
2)输入“r ax”后按下enter键,将出现”:“再输出数据后按enter键既可完成对ax的内容修改。其他寄存器也同理 - D命令:
1)”d 段地址:偏移地址”查看内存的内容
2)“d 段地址:起始偏移地址 结尾偏移地址” 指定查看范围 - E命令:
1)“e 起始地址 数据 数据…"用来改写内存中的内容
2)也可以逐个修改。(如图) - U命令:
1)“u 段地址:偏移地址”将内存中的机器码翻译成汇编指令 - T命令:
1)使用“t”回车,cpu将执行cs:ip对应内存的指令 - A命令:
1)使用“a 段地址:偏移地址”以汇编语言从对应物理地址开始的内存单元中写入指令
第三章寄存器(内存访问)
知识小结
- 字在内存中用两个字节单元存储,其中低字节为字地址,同时字的高位存储到高字节单元,低位存储到字的低字节单元。
- 8086cpu中有一个DS寄存器,通常用来存放要访问数据的段地址,比如取1000:0单元的内容,可以使用
mov dx 1000
mov ds,bx
mov al,[0] - 用mov访存时,可以在mov指令中只给出偏移地址,段地址默认在ds寄存器
- mov,sub,add都具有两个操作对象,jmp有一个操作对象
- 8086cpu提供了栈操作机制,其中ss和sp存放了栈顶的段地址和偏移地址
- push,pop后面的操作对象可以是
寄存器: pop ax
段寄存器: pop ds
内存单元: push [0] - push指令的执行步骤
1) sp = sp-2
2) 向ss:sp指向的字单元中送入数据 - pop指令的执行步骤
1) 从ss:sp指向的字节单元读取数据
2) sp = sp+2 - pop.push实际上是一种内存传送指令
- 我们将一段内存定义为一个段,具体是数据段,内存段还是栈段是由我们自己安排的。若要cpu按照我们的安排访问这些段就要:
1)对于数据段中,它的段地址在DS中,可以用mov,add,sub等访问内存单元指令时,cpu就将数据段中的内容当作数据来访问
2)对于代码段,它的段地址在CS中,段中的第一条指令的偏移地址存放在IP中,cpu就将执行我们定义代码段中的指令,可以用jmp来改变ip的值
3)对于栈段,它的段地址在ss中,栈顶单元的偏移地址存放在SP中,cpu在进行栈操作的时候通过执行push,pop指令将我们定义的栈段当作栈空间来使用。 - 一段内存可以即是代码段的存储空间又是数据的存储空间话可以是栈空间也可以什么都不是。关键是cpu中寄存器的设置,即CS、IP、SS、SP、DS的指向。
实验小结
- 在使用d命令的时候,cpu通过段寄存器ds中获得d命令后面对于的段地址。
- “d 段寄存器:偏移地址”可以快速访问其他内存单元
- 在E、A、U中同样可以使用段寄存器
r ds
:1000 表示将1000写入ds中 - debug的T命令在执行修改寄存器ss的指令时,下一条指令也会紧接着被执行,原理为中断机制后面学习会解释。