汇编学习笔记4
第三讲讲的是寄存器,第四讲仍然介绍寄存器。
在第三讲里,介绍了8086,8088CPU共有14个16位寄存器,8个8进制寄存器,分别为16位数据寄存器AX,BX,CX,DX,8位寄存器AH,AL,BH,BL,CH,CL,DH,DL等,指针寄存器BP,SP等,变址寄存器SI,DI等以上八个16位寄存器称为通为寄存器,还有四个段寄存器CS,DS,ES,SS,两个控制寄存器IP,FLAG。
作为如下:
AX,AL 被称为累加器,用于累加运算时。BX基址寄存器。CX用于控制循环的次数。CL用于保存移位时的偏移位数。DX用于32位乘除法时保存被除数或保存余数。
BP栈顶指针寄存器,SP堆栈指针寄存器。SI源变址寄存器,DI目的地址寄存器。CS代码段,DS数据段,ES附加段,SS堆栈段。IP记录下一条要执行的指令的偏移。FLAG标记寄存器,用一个16位数表示一组9个标记。
结果标识:
CF,进位标识。AF,附助进位标识。ZF,零标识。PF,奇偶标识。SF,符号标识。OF,溢出标识。
控制标识:
DF,方向标识。IF,中断标识。SF,单步标识。
以上部分内容视频中反复强调,故再复习一次。
存储器中的地址和数据,
寄存器中的地址的形成:
寄存器以字节为单位存储数据,使用16位二进制数来表示每个存储单元。故可表示65536个存储单元。0~FFFFH。存储单元的内容指存放在存储单元中的数据。
字单元采用高高低低的原则存入存储器的相邻两个字节单元,高位存放高字节,低位存放低字节。双字等与之相同。
而8086,8088CPU的总线为20根,共有2^20存储空间即1M字节存储单元,可用20位二进制数来表示。而寄存器只能表示64K个存储单元,解决这个问题的方法是存储器分段。
将存储器分段,每段的长度为64K,段内的地址可使用16位二进制数来表示。而段的地址使用段的起始地址。对每段的起始地址,必须是存储器中任一小段的起始地址。存储器内从0地址开始,每16个字节为一小段。
00000H 00001H 00002H 00003H …… 0000DH 0000EH 0000FH
00010H 00011H 00012H 00013H …… 0001DH 0001EH 0001FH
…
…
FFFE0H FFFE1H FFFE2H FFFE3H …… FFFEDH FFFEEH FFFEFH
FFFF0H FFFF1H FFFF2H FFFF3H …… FFFFDH FFFFEH FFFFFH
故每一段的地址的后四位都必然为0。
存储器中每个存储单元都可以使用一个唯一的20位二进制数来表示,即为该存储单元的物理地址。
存储单元可以使用存储单元所在的段地址和在该段中的偏移来表示,即为该存储单元的逻辑地址。一个存储单元的逻辑地址表示为 段值 : 偏移。该段的地址为 段值 * 2^4。
于是每个存储单元的物理地址 = 段值 * 2^4 + 偏移。例如: 230E : 3321H 的物理地址为: 230E0 + 3321 = 26411H。
段可相连,不相连,重叠。
段地址和偏移可直接使用16位二进制数来表示,也可使用寄存器指针来表示。
CS与IP寄存器一起使用,取指令时自动引用代码段和IP寄存器确定指令位置。
堆栈操作使用SS和SP。SS也可和BP一起使用。
这一讲内容有些多,记不太清楚,写得有些零碎。这两讲多为概念性的东西。后在以后用到的时候加深记忆。