绪论
机器语言与机器指令
汇编语言与汇编指令
汇编语言的主体是汇编指令。
指令和数据的表示
计算机的数据和指令,存储在内存和磁盘上
数据和指令,都是二进制信息
计算机中的存储单元
存储器被划分为若干个存储单元,每个存储单元从0开始顺序编号
8086有20根数据线,寻址空间为2^20 1MB
计算机中总线
计算中专门连接cpu和其他芯片的导线,就是总线
逻辑上划分为:数据总线、地址总线、控制总线
cpu是通过地址总线来指定存储单元的。
地址总线的宽度,决定了可寻址的存储单元大小。N根地址对应寻址空间2^N。
cpu与内存或其他器件之间的数据传送是通过数据总线来进行的。
数据总线的宽度决定了cpu和外界的数据传送速度。
8086是16根数据总线,一次可以传送2字节的数据。
cpu通过控制总线对外部器件进行控制。控制总线是一些不同控制线的集合,控制总线的宽度决定了对外部器件的控制能力。
cpu对内存的读写
cpu要想进行数据的读写,必须和外部器件进行三类信息的交互:
存储单元的地址:cpu要到哪个地址去读写数据
器件的选择,读或写的名字:读后数据保存到哪个器件(比如寄存器),或者要把某个寄存器的内容写到内存。
读写的数据:内存的数据
内存地址空间
cpu地址总线宽度为N,寻址空间为2^NB
将各类存储器看做一个逻辑存储器————统一编址
所有的物理存储器被看做一个有若干个存储器单元组成的逻辑存储器
每个物理存储器在这个逻辑存储器中占有一个地址段。
环境搭建
安装DosBox
挂载目录
寄存器和内存
寄存器是cpu内部信息存储单元
8086cpu有14个寄存器:
通用寄存器:AX BX CX DX
变址寄存器:SI DI
指针寄存器:SP、BP
指令指针寄存器:IP
段寄存器:CS SS DS ES
标志寄存器:PSW
共性:8086cpu所有的寄存器都是16位,可以存放两个字节
物理地址
cpu访问内存单元时要给出内存单元的地址。
所有的内存地址单元构成的存储空间是一个一维线性空间。
每个内存单元在这个空间中都有唯一的值,这个唯一的地址成为物理地址。
8086有20位地址总线,可传送20位地址,寻址能力为1M。
8086是16位结构的cpu,运算器一次最多可以处理16位的数据,寄存器的最大宽度是16位。
在8086内存处理的、传输、暂存的地址也是16位,寻址能力也只有64KB。这里就产生矛盾了!
解决方法:
用两个16位地址(段地址、偏移地址)合成一个20位物理地址。
物理地址=段地址X16+偏移地址。
内存并没有分段,段的划分来自于CPU.
偏移地址16位,变化范围为0~FFFFH,用偏移地址最多寻址64KB
段寄存器:cs 代码段寄存器,DS数据段寄存器 SS栈段寄存器 ES附加段寄存器
DEBUG
R:查看、改变cpu寄存器的内容
D:查看内存中的内容
E:改变内存中的内容
U:将内存中的机器指令翻译成汇编指令
A:以汇编指令直接写入代码
目录
指令
T:执行机器指令
段寄存器
CS 代码段寄存器(code) DS 数据段寄存器
SS 栈段寄存器(stack)ES 附加段寄存器
8086中不提供在代码中直接对CS和IP的修改。
jmp bx 代表直接将bx值赋值给ip
内存中字的存储
8086中,16位作为一个字。
低位字节存在低地址单元,高位字节存在高地址单元。
CPU从内存单元中读取数据
8086中,内存地址由段地址和偏移地址组成。DS+[ 偏移地址]
mov ax,0010
mov ds,ax ;8086中不能直接将值赋值给ds,需要先将值给一个通用寄存器
mov al,[0]
栈
栈是一种只能在一段进行插入或删除操作的数据结构。
入栈:将一个新的元素放到栈顶 ,push ax
出栈:将栈顶元素取出 pop ax
栈的超界问题,需要程序员自己注意