注意:Debug在执行“d 1000:0”时,会将段地址送入ds中。
① 在使用 a 命令输入指令调试前,使用 e 命令将内存单元 0021:0 ~0021:7 连续 8
个字节数据修改为 30H, 31H, 32H, 33H,34H,35H,36H,37H
② 将 P74 实验任务(1)中第 1 行的 mov ax, ffff → 改为 mov ax, 0021
实验任务
Mov ax,【0】即为读入段地址ds为0021,偏移地址为0的内容(0021:0的值我们已改为30)
执行结果与分析
mov ax,0021
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0] ;ax= 3130
add ax,[2] ;ax= 6462
mov bx,[4] ;bx= 3534
add bx,[6] ;bx= 6C6A
push ax ;sp= 00FE ;修改的内存单元的地址是 2200:FE到FF 内容为 62 64
push bx ;sp= 00FC ;修改的内存单元的地址是 2200:FC到FD 内容为 6A 6C
pop ax ;sp= 00FE ;ax= 6C6A
pop bx ;sp=0100 ;bx= 6462
push [4] ;sp= 00FE ;修改的内存单元的地址是 2200:FE到FF 内容为 34 35
push [6] ;sp= 00FC ;修改的内存单元的地址是 2200:FC到FD 内容为 36 37
分析
mov ax[0]执行后内存单元段地址ds被赋值为0021,栈段的段地址ss被赋值为2200(不能向ss中直接送入数据,一般用ax中转)。mov sp,0100表示设置栈顶为2200:0100,ax、bx得到新数据为6462、6C6A。然后将ax、bx的数据依次压入栈中,pop[ax] pop[bx]指令表示数据出栈到ax,bx寄存器中,又因为出栈顺序为后进先出,所以出栈后ax中为后入栈的bx的内容6c6A,而bx中为先入栈的ax中的内容6462,实现了ax与bx的数据交换。最后,通过push指令将数据段中地址为0021:0004和0021:0006对应的数据依次存入栈段中。
仔细观察会发现栈顶的内存单元地址最大,每压入一个数据占两个内存单元(两个字节),ss:sp就像一个指针,每压入一个数据,指向的内存单元地址就减小2,呈上行压入状态
下面放张图便于理解栈中的情况
(2)
因为在用T命令执行mov ss,ax的时候,他的下一条指令mov sp,10也执行了。修改了寄存器sp。
也就是说一个T命令执行两条指令,使栈顶变为2000:0010,初始化栈顶。所以2000:0000——2000:0010为栈空间(不懂,头疼,求教)