(1) 在Debug中,用户”d 0:0 1F” 查看内存,结果如下。
0000:0000 70 80 F0 30 EF 60 30 E2-00 80 12 66 20 22 60
0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88
下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行后相关寄存器中的值。
mov ax,1 AX=0001H
mov ds,ax DS=0001H (0001:0000)指向的内存地址与(0000:0010)相同
mov ax,[0000] AX=2662H
mov bx,[0001] BX=E626H
mov ax,bx AX=E626H
mov ax,[0000] AX=2662H
mov bx,[0002] BX=D6E6H
add ax,bx AX=FD48H
add ax,[0004] AX=2C14H
mov ax,0 AX=0000H
mov al,[0002] AX=00E6H
mov bx,0 BX=0000H
mov bl,[000c] BX=0026H
add al,bl BX=000CH
提示,注意DS的设置。
(2) 内存中的情况如图3.6所示。
各寄存器的初始值:CS=2000H, IP=0, DS=1000H, AX=0, BX=0;
① 写出CPU执行的指令序列(用汇编指令写出)。
② 写出CPU执行每条指令后,CS、IP和相关寄存器中的数值。
③ 再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?

图 3.6 内存情况示意图
1. mov ax,6622H
CS=2000H, IP=0003, DS=1000H, AX=6622H, BX=0000H
2. jmp 0FF0:0100
CS=0FF0H, IP=0100H, DS=1000H, AX=6622H, BX=0000H
指令指向内存地址为 0FF0H x 10H + 0100H = 10000H
3. mov ax,2000H
CS=0FF0H, IP=0103H, DS=1000H, AX=2000H, BX=0000H
4. mov ds,ax
CS=0FF0H, IP=0105H, DS=2000H, AX=2000H, BX=0000H
数据指向内存地址为 2000H x 10H + 0000H = 20000H
5. mov ax,[0008]
CS=0FF0H, IP=0108H, DS=2000H, AX=C389H, BX=0000H
6. mov ax,[0002]
CS=0FF0H, IP=010BH, DS=2000H, AX=EA66H, BX=0000H
数据在内存中都是以二进制形式存放,CPU把CS:IP指向的内存地址当做指令执行,DS:0000指向的内存地址当做数据来调用。
一月 24th, 2010 at 10:33:24
请教,为什么 (0001:0000)指向的内存地址与(0000:0010)相同呢??非常疑惑,谢谢。
三月 19th, 2010 at 00:36:19
@匿名
(0001:0000)=0001H*10H+0000H=00010H
(0000:0010)=0000H*10H+0010H=00010H
(0001:0000)=(0000:0010)
二月 11th, 2011 at 19:12:11
你好好想一想 段地址*16+偏移地址=物理地址
0001:0000
0001*16+0000=物理(0010)
0000*16+0010=物理(0010)