1 通用寄存器:AX,BX,CX,DX。由于8086上一代寄存器是8位的,所以为了向上兼容,AX又分为AH和AL,分别为底8位和高8位。
2 进行mov操作时,源操作数要与目的操作数的位数一致。比如mov ax,al是错误的,因为把8位赋值给了16位寄存器。
3 8086的cpu内部地址是16位,物理地址是20位。寻址公式为 物理地址=段地址*16+偏移地址。也可以说“段地址左移了4位”。这种寻址方式的本质就是:基地址+偏移地址。
4 段的概念。内存并没有被划分为段,而是CPU使用划分段的方式来管理物理内存。因此,可以根据编程的需要将连续的内存划分为段。但是一个段是有限制的,段只能是16的整数倍,而且段最大为64KB。
(1) 观察下面地址
物理地址 段地址 偏移地址
21F60H 2000H 1F60H
2100H F60H
结论就是:CPU可以使用不同的段地址和偏移地址找到同一个物理地址,只要满足寻址公式就可以了。
(2) 数据存储在内存单元21F60H中,这句话的准确含义是什么?
由于存储单元用两个元素来进行描述,所以对PC机而言有两种表达方法
(a)数据存储在2000:1F60(2100:F60)中
(b)数据存储在内存2000段中的1F60单元中
5 存储段地址的寄存器称为段寄存器,8086中分别是CS,DS,ES,SS。
6 最重要的寄存器,CS和IP。在8086中,假设任意时刻,CS的内容为M,IP的内容为N,那么下一条指令的存储地址为M*16+N。这表示CPU将从该地址读取指令并执行。当从内存中读出一条指令之后,IP的内容会根据指令的大小自动增加,到底增加多少字节可以查Intel的白皮书。由于指令和数据都是二进制数据,那么CPU在工作的时候怎样区分指令和数据呢?结论就是,CS:IP指向的内存就是指令,凡是被CS:IP执行过的二进制都是指令。
7 如何修改CS和IP中的数值呢?mov cs,2000 mov ip,1F60可以吗?注意,不能使用mov指令来修改CS和IP中的数值。修改CS和IP中的数值只能使用跳转指令。
(1)如果想要同时修改CS和IP中的数值,可以使用"jmp 段地址:偏移地址"。执行后,CS=段地址,IP=偏移地址。
(2)如果仅仅修改IP中的数值,可以使用"jmp 某一个合法寄存器的地址"。注意,只能是寄存器地址,不能是内存地址。