注意: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】即为读入段地址ds0021,偏移地址为0的内容(00210的值我们已改为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           ;修改的内存单元的地址是 2200FEFF 内容为   62       64                 

push bx                                                ;sp= 00FC           ;修改的内存单元的地址是 2200FCFD 内容为   6A        6C                 

pop ax                                                  ;sp= 00FE           ;ax=  6C6A              

pop bx                                                  ;sp=0100            ;bx=   6462            

push [4]                                                ;sp= 00FE          ;修改的内存单元的地址是  2200FEFF   内容为   34      35                

push [6]                                                ;sp= 00FC          ;修改的内存单元的地址是  2200FCFD   内容为    36      37       

 

分析

mov ax[0]执行后内存单元段地址ds被赋值为0021,栈段的段地址ss被赋值为2200(不能向ss中直接送入数据,一般用ax中转)mov sp,0100表示设置栈顶为22000100axbx得到新数据为64626C6A。然后将axbx的数据依次入栈中,pop[ax] pop[bx]指令表示数据出栈到axbx寄存器中,又因为出栈顺序为后进先出,所以出栈后ax中为后入栈的bx的内容6c6A,而bx中为先入栈的ax中的内容6462,实现了axbx的数据交换。最后,通过push指令将数据段中地址为0021:00040021:0006对应的数据依次存入栈段中。

仔细观察会发现栈顶的内存单元地址最大,每压入一个数据占两个内存单元(两个字节),sssp就像一个指针,每压入一个数据,指向的内存单元地址就减小2,呈上行压入状态

 

 

下面放张图便于理解栈中的情况

 

 

(2)

 

因为在用T命令执行mov ssax的时候,他的下一条指令mov sp10也执行了。修改寄存器sp

也就是说一个T命令执行两条指令,使栈顶变为20000010,初始化栈顶。所以20000000——20000010为栈空间不懂,头疼,求教)

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