trump 发表于 2014-6-18 23:07:30

检测点3.2

(1) 补全下面的程序,使其可以将10000H~1000FH中的8个字,逆序复制到20000H~20000F中。
mov ax,1000H
mov ds,ax

将sp指向栈的最底部+1
mov ax,2000H
mov ss,ax
mov sp,10H


push
push
push
push
push
push
push
push


(2) 补全下面的程序,使其可以将10000H~1000FH中的8个字,逆序复制到20000H~20000F中。
mov ax,2000H
mov ds,ax


将sp指向栈的最顶部
mov ax,1000H
mov ss,ax
mov sp,0


pop
pop
pop
pop
pop
pop
pop
pop



我爱鱼C论坛 发表于 2015-2-19 20:54:20

2356926455 发表于 2015-4-2 20:55:11

这个帖子怎么看 小鱼老师!能不能讲解一下啊!看不大懂

suxinmi 发表于 2017-1-23 18:18:13

2356926455 发表于 2015-4-2 20:55
这个帖子怎么看 小鱼老师!能不能讲解一下啊!看不大懂

关于栈操作的逆序实现方式就是要保证先进先出,后进后出,这样就颠倒了他们的顺序了。我们要将10000H的地址作为起始单元传递给20000H,因此就应当另ds寄存器指向1000H。入栈指令就像答案中所说的那样,将段地址为1000H的数据逐次送入栈中,偏移地址为f+1是10,这样开始入栈是偏移地址自动减2变为e可以保存一个字的数据。出栈的原理相同,先将ds指向2000H,方便用来接收出栈的数据,sp指向栈顶为0,然后逐次出栈{:10_315:}

ranbo_q 发表于 2017-5-20 23:14:34

我的理解就是,栈是以字来传送的,如果是空栈的话指向的则是下一个字节,PUSH的话,必须是字所以sp=sp-2,之后才存入数据,10H-2H=EH,这是鱼鱼老师课题里经常出现的样题
POP的话相反,先存入数据,sp=sp+2必须是以字传送。也等于就是三个知识点。
空栈指向的是下一个字节。也可以说是一个字+2,EH+2H=10H
PUSH,sp=sp-2,然后再存放数据,依据题目可得,数据是从2000FH开始存取一个字,2010H-2H=2000EH刚好能放下2个字节。
POP反之,先存取数据,sp=sp+2,我们要存在10000H中,那么SP=0,之后SP+2,再存取下一个字,也就是两个字节,从低位开始存取,10002H=66,10003H=22


啰嗦了一大堆{:10_245:}

酸辣小白菜 发表于 2017-7-27 17:05:22

为什么 栈段地址SS 向里面写的时候要用通用寄存器,而偏移地址SP写的时候不用呢

719871782 发表于 2017-11-27 23:51:44

酸辣小白菜 发表于 2017-7-27 17:05
为什么 栈段地址SS 向里面写的时候要用通用寄存器,而偏移地址SP写的时候不用呢

段寄存器必须通过通用寄存器才能往里面输入数据

719871782 发表于 2017-11-27 23:53:03

719871782 发表于 2017-11-27 23:51
段寄存器必须通过通用寄存器才能往里面输入数据

sp寄存器是堆栈寄存器
页: [1]
查看完整版本: 检测点3.2