下头的程序实现依次用内存0:0-0:15单元中的内容改写程序中的数据,数据的传送用栈来进行,栈空间设置在程序内,有几个地方不是很清楚,请大家指点一下

下面的程序实现依次用内存0:0-0:15单元中的内容改写程序中的数据,数据的传送用栈来进行,栈空间设置在程序内,有几个地方不是很清楚,请大家指点一下!
程序如下:
assume   cs:codesg
codesg   segment

   dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
   dw 0,0,0,0,0,0,0,0,0,0

   start: mov ax,cs
          mov ss,ax
          mov sp,26         ;这里为什么是26啊 感觉好像是24就可以了 但是不行

          mov ax,0
          mov ds,ax
          mov bx,0
          mov cx,8
        s:push [bx]
          pop cs:[bx]       ;这里也不太清楚
          add bx,2
          loop s

          mov ax,4c00h
          int 21h

codesg  ends

end start


我是个初学者希望大家能尽量说清楚一点谢谢了

------解决方案--------------------
SP开始是24是!中间数据转换只需要用一个字来转换!所以LOOP那里SP的变化是从24到22之前变化!

然后退出循环后,使用了INT 21H 也就是中断!

进入中断处理器前还要保留现声场,同时要保护当前的标记位。所以还要用到栈。

而这里要保存的数据量有{ 当前CS段,INT 21H 的下一条指令的IP,当前标记寄存器的值} = 3*2字节。

也就是上面SP从24跳到 24-3*2 = 18 这个位了,就进入INT 21H这里啦!也就是退出程序啦。

再计算一下,sp=18这里并没有来到
 dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
  dw 0,0,0,0,0,0,0,0,0,0
的0987h这个位置,0987这个位置刚刚好是 0eh

所以总的来讲,程序是从0:0-0:15读出了16字节的数据,并存放到:
 dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
这16字节的地方中。

也就是MOV SP 24也是可行的!

LZ :"貌似24个运行出来不能10个字单元" 是什么意思 ?

LZ还要保留这10个0吗? 这10个0不是LZ用来做栈空间的吗?下头的程序实现依次用内存0:0-0:15单元中的内容改写程序中的数据,数据的传送用栈来进行,栈空间设置在程序内,有几个地方不是很清楚,请大家指点一下