注意: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为栈空间(不懂,头疼,求教)

posted on 2018-10-29 01:29  sakura0—-0  阅读(204)  评论(3)    收藏  举报