mov ax,001AH ax=001AH bx=0000H
mov bx,0026H ax=001AH bx=0026H
add al,bl al=al+bl=1AH+26H=40H ax=0040H bx=0026H
add ah,bl ah=ah+bl=00H+26H=26H ax=2640H bx=0026H
add bh,al bh=bh+al=00H+40H=40H ax=2640H bx=4026H
mov ah,0 ax=0040H bx=4026H
add al,85H al=al+85H=40H+85H=C5H ax=00C5H bx=4026H
add al,93H al=al+93H=C5H+93H=158H (al为8位寄存器,最高位1丢失)
ax=0058H bx=4026H
8086CPU有20位的地址总线,可以传送20位的地址,达到1M的寻址能力。
8086CPU又是16位结构,在内部一次性处理,传输,暂时存储的地址为16位。
从8086内部结构来看,表现的寻址能力只有64KB
8086采用一种在内部用两个16位地址合成的方法来形成20位的物理地址。

1.cpu中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址。
2.段地址和偏移地址通过内部总线送入一个叫做地址加法器的部件。
3.地址加法器将两个16位地址合并为一个20位的物理地址。
4.地址加法器通过内部总线将20位物理地址送入输入输出控制电路
5.输入输出控制电路将20位物理地址送上地址总线。
6.20位物理地址被地址总线送入存储器
地址加法器采用 物理地址=段地址*16+偏移地址 的方法将段地址和偏移地址合成物理地址
例如:cpu要访问地址为123C8H的内存单元

段的概念
段地址名称中的段的概念,可能会让人误以为内存被划分成了一个一个的段,每个段又一个段地址。
内存并没有分段,段的划分来自于CPU。由于8086CPU用段地址*16+偏移地址=物理地址的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存,
地址10000H-100FFH的内存单元组成一个段,该段的起始地址(基础地址)为10000H,段地址为1000H,大小为100H。
也可以认为地址10000H-1007FH,10080H-100FFH的内存单元组成两个段,他们的原始地址基础地址为:10000H和10080H,段地址为:1000H和1008H,大小都为80H
偏移地址16位,变化范围0000H-FFFFH,仅用偏移地址来寻址最多可寻64KB个内存单元
比如给定段地址1000H,用偏移地址寻址,CPU的寻址范围为10000H-1FFFFH,也是64KB,段有16个即16*64=1024KB=1M
段寄存器(了解,后面有详细的解释)
8086CPU有4个段寄存器:CS,DS,SS,ES
CS:代码段code
DS:数据段data
IP:指令指针寄存器,指向下一条要执行的命令
CS和IP
CS和IP指示了CPU当前要读取的指令的地址,
CS是代码段寄存器,IP是指令指针寄存器
在8086机器中,任意时刻,设CS中的内容为M,IP为N,CPU将从内存M*16+N单元开始读取一条指令并执行
也可以这样表述,任意时刻,CPU将CS:IP指向的内容当作指令执行。
修改CS:IP指令
在CPU中。能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。
CPU从何处执行指令由CS:IP决定的,程序员可以通过修改CS,IP的值来控制CPU执行目标指令。
jmp指令:
同时修改CS:IP的值,可用"jmp 段地址:偏移地址"的指令完成
jmp 2AE3:3 执行后:CS=2AE3H IP=00003H,CPU 将从2AE33H处读取指令
jmp 3:0B16 执行后:CS=0003H IP=0B16H,CPU将从00B46H处读取指令
若仅想修改IP的值,"jmp 某一个合法寄存器"
jmp ax,指令执行前:ax=1000H cs=2000H ip=0003H
指令执行后 ax=1000H cs=2000H ip=1000H
jmp ax 在含义上近似 mov ip,ax
修改cs,mov cs,ax