概括:Intel的芯片具有良好的兼容性,8086和80386是两个典型的代表,以下介绍8086的编程模型。
一、寄存器
寄存器是对CPU硬件的抽象,指令系统是CPU功能的抽象。
1.1、以下是CPU寄存器组结构图:

1.2、寄存器概述
不同的寄存器配合不同的指令来完成各种操作,所有的寄存器都是16位,其中AX,BX,CX,DX的高低8位可以单独访问。
AX,BX,CX,DX是数据寄存器,CS,DS,SS,ES是段寄存器,IP是指令指针寄存器,SP,BP,SI,DI是数据指针寄存器,FLAG 是运算结果标志寄存器。
二、存储器接口
8086只能工作在实模式下,也就是不提供虚拟地址的机制,有20根地址线,所以能访问的地址范围是1M,而寄存器是16位,无法直接寻址1M的地址范围,所以用两个寄存器来访问,具体的方法如下:
2.1、把1M的空间分成段,每段的粒度是16字节,每段最大为64KB。
2.2、这样就可以通过CS,DS,SS,ES来存储段号,而用SP,BP等来存储偏移,就可以达到寻址1MB空间的目的。
2.3、为什么粒度必须是16字节?
因为如果粒度小于16字节的话,段号就有可能超过64KB,无法用16bit的寄存器表示,而如果粒度大于16字节的话,则很有可能会造成空间浪费,如果粒度设置为可变的话,则还需要另外的寄存器来存储粒度,会造成效率和空间的极大浪费。
三、寻址方式
3.1、立即数寻址,操作数位于代码段中,mov ax,1234h
3.2、寄存器寻址,操作数位于寄存器中,mov ax,bx
3.3、存储器寻址,操作数位于存储器中
★直接寻址,直接给出地址,mov ax,[1234h];mov ax,es:[1234h],如果没有指明地址所在段,则默认为DS。
★寄存器间接寻址,地址偏移量在寄存器中,和直接寻址类似,mov ax,es:[bx]
★寄存器相对寻址,mov ax,es:[bx+1234h] 可以实现访问一维数组的某一元素
★基址加变址方式,mov ax,[bx+di] 可以实现遍历一维数组
★相对基址加变址,mov ax,[bx+di+1234h] 可以实现访问二维数组的某一元素
基址只能使用 bx,bp,bp默认对应ss段,变址只能使用si,di
3.4、寻址方式总结
★存储器内部不能直接的传输数据是显而易见的,因为必须要CPU的参与才能完成数据的传输。
★存储器的寻址就是段的指定和偏移量的指定,其中偏移量的指定有几种方式,灵活应用即可。
四、指令系统 [Label:] Operator [Operand1[,Operand2]][;comment]
4.1、指令总结如下图:
4.2、条件跳转
条件跳转指令根据FLAG的相关标志位的结果进行跳转,跳转范围在-126-129之间,总结如下图:
五、伪指令
所谓伪指令就是不直接对应80x86的一条特定的指令,它的作用是为汇编器或者链接器提供程序的辅助信息,总结如下图:
5.1、段定义详解
六、dos功能调用
assume cs:codeseg
codeseg segment
mov al,97 ;参数
mov ah,2 ;功能号
int 21h ;dos调用
mov ah,4ch
int 21h
codeseg ends
end
七、中断
7.1、中断向量表大小为1024byte,每4byte代表一个中断入口地址,低字表示偏移,高字表示段号,为了容易寻址中断向量表,中断向量表位于地址0处。
7.2、通过 dos的35号调用,入口参数为中断号,es,bx将得到中断入口地址的段号和偏移。(当然也可以自己查)
7.3、中断返回用iret