前面讲过(参见汇编语言段地址段的概念的理解),对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。我们可以将一组长度为N(N } 64KB)、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。比如用123BOH-123B9H这段内存空间来存放数据,我们就可以认为,123BOH-123B9H这段内存是一个数据段,它的段地址为123BH,长度为10个字节。
如何访问数据段中的数据呢?将一段内存当作数据段,是我们在编程时的一种安排,可以在具体操作的时候,用ds存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。
比如,将123B0H-123B9H的内存单元定义为数据段。现在要累加这个数据段中的前3个单元中的数据,代码如下。
mov ax,123BH mov ds,ax ;将123BH送入ds中,作为数据段的段地址 mov al,0 ;用al存放累加结果 add al,[0] ;将数据段第一个单元(偏移地址为0)中的数值加到al工中 add al,[1] ;将数据段第二个单元(偏移地址为1)中的数值加到al中 add al,[2] ;将数据段第三个单元(偏移地址为2)中的数值加到al中
问题3.5
写几条指令,累加数据段中的前3个字型数据,思考后看分析。
分析
代码如下。
mov ax,123BH mov ds,ax ;将123BH送入ds中,作为数据段的段地址 mov ax,0 ;用ax存放累加结果 add ax,[0] ;将数据段第一个字(偏移地址为0)加到ax中 add ax,[2] ;将数据段第二个字(偏移地址为4)加到ax中 add ax,[4] ;将数据段第三个字(偏移地址为4)加到ax中
注意,一个字型数据占两个单元,所以偏移地址是0, 2,4
小结
(1)字在内存中存储时,要用两个地址连续的内存单元来存放,高位李节存放在高地址单元中。字的低位字节存放在低地址单元中,
(2)用mov指令访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中。
(3) [address]表示一个偏移地址为address的内存单元。
(4)在内存和寄存器之间传送字型数据时,高地址单元和高8位寄存器、低地址单元和低8位寄存器相对应。
(5) mov. add. sub是具有两个操作对象的指令。jmp是具有一个操作对象的指令。可以根据自己的推测,在Debug中实验指令的新格式。
检测点3.1
(1)在Debug中,用“d 0:0 1f”查看内存,结果如下。
(2)内存中的情况如图3.6所示。
各寄存器的初始值:CS=2000H, IP=0, DS=1000H, AX=0, BX=0;
①写出CPU执行的指令序列(用汇编指令写出)。
②写出CPU执行每条指令后,CS, IP和相关寄存器中的数值。
③再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?