8086CPU的结构
8086/8088CPU包括16条数据线,20条地址线。可选址的地址空间1MB =
通用寄存器
4 个 16 位寄存器,主要用于存放算术或逻辑运算的操作数
指针与变址寄存器组
指针和变址寄存器组主要用于存放段内偏移地址
段寄存器与指令指针寄存器
CPU 内有 4 个 16 位的段寄存器,用于设置段的起始地址。段寄存器内容+有效的地址偏移量=内存单元的地址
CS:代码段寄存器
DS:数据段寄存器
SS:堆栈段寄存器
ES:附加段寄存器
PS附注:
-
DS、SS 和 ES 寄存器的内容可由程序设置,CS寄存器的内容不能用程序设置。
-
CS 规定了存放程序的存储区的起始地址 + IP是指令指针寄存器 = 当前要执行的指令
标志寄存器(16位)
8086CPU的内存编址
在存储器中是以字节为单位存储信息的。8086/8088系统有20根地址线,可以寻址1MB的地址空间,即对存储器寻址要20位物理地址,而8086是16位的CPU,内部寄存器只有16位,可寻址.因此,8086系统把整个存储空间分成16个逻辑段,每段是64KB。
物理地址
段基址是每段的起始位置,它必须是每小段的首地址,其低4位一定为0,所以在实际的工作中,是从段寄存器中取出段基址,将其左移4位,再与16位的偏移地址相加,就得到实际的物理地址。
ps:IBM PC机对段的首地址有限制,规定必须从每小段的首地址开始,每16字节为一小段,所以段起始地址必须被16整除才行。
逻辑地址
由于访问存储器的的操作类型不同,总线控制器(负责取指令)所使用的逻辑地址来源也不同。
- 取指令:CS作为段基址,偏移地址由IP来指定
- 堆栈操作:SS作为段基址,偏移地址由SP指定
- 读写存储器:DS/ES作为段基址,偏移地址由指令的寻址方式决定。ps:BP作为基址时候,段基址为SS,偏移地址为BP。
8086CPU的寻址方式
1.立即寻址
MOV AL, 26H; 把26H数字送到累加器的低八位
MOV AX, 0FF00H; 把立即数送到AX寄存器(16位),A~F开头的立即数要在前面加0
2. 寄存器寻址
MOV DX, AX; 把AX寄存器的内容送到DX中
MOV CL,AH; 把AX的高8位送到CX的低八位中
3. 直接寻址(以下指令的操作数都在存储器中)
// 操作数的偏移地址,相对段地址的偏移直接在指定中出现
MOV AX,[2000H]; 取数据,段地址为DS,把DSX16+2000H内存单元的连续两个字节的数据装入到AX(16位)
4. 寄存器间接寻址
// 寄存器中的数据是偏移地址
MOV BX, [SI];
PS注释: 0. 基址寄存器BX、BP; 变址寄存器SI、DI;
- 如果寄存器是BX、SI、DI,默认的段寄存器DS
- 如果寄存器是BP,段寄存器是SS
5. 寄存器相对寻址
MOV BX,COUNT[SI];把DSX16+SI+COUNT指向的内存单元连续两个字节的数据放到BX中
6. 基址变址寻址
MOV AX, [BX+SI];
或
MOV AX, [BX][SI];把DSX16+BX+SI指向的内存连续两个字节的数据放到AX中
7. 相对基址变址寻址
MOV AX, MASK[BX][SI];把DSX16+BX+SI+MASK指向的连续两个字节的数据放到AX中
机器码的组成
其他
// 公式编辑器
https://demo.wiris.com/mathtype/en/developers.php