王爽汇编13.3对int,iret和栈的深入理解的疑惑,该如何解决

王爽汇编13.3对int,iret和栈的深入理解的疑惑
就是用7ch中断例程完成loop指令那道例题

7ch中断例程如下。

    lp:push bp     ;bp入栈是什么意思,直接修改SP不就行了吗     
       mov bp,sp     
      dec cx      
      jcxz lpret  
      add [bp+2],bx ;怎么知道DS 和SS是在一个段,[bp+2]如果不写段的话默认就是ds吧
lpret:pop bp      
      iret


还有之前的求s的偏移地址

    mov bx,offset s-offset se ;设置从标号se到标号s的位移转移?
    mov cx,80
  s:mov byte prt es:[di],'!'
    add di,2
    int 7ch
 se:nop




还有之前的求s的偏移地址,         
mov bx,offset s-offset se 这是什么意思? s在前,se在后 这样减不成负值了吗? 直接offset s不就是 s的偏移地址了吗?


问题:1.bp入栈是什么意思,直接修改SP不就行了吗         
      2.怎么知道DS 和SS是在一个段,[bp+2]如果不写段的话默认就是ds吧         
      3.s标号在前,se标号在后 这样减不成负值了吗 ?直接offset s不就是 s的偏移地址了吗? 
------解决方案--------------------
>> add [bp+2],bx ;怎么知道DS 和SS是在一个段,[bp+2]如果不写段的话默认就是ds吧
这是不对的,[bp+2] 这样的以 bp 间接寻址的,默认段址是 SS 而非 DS

那个 offset s-offset se 的问题,由于没有更多的内容,看不到对这个计算结果是怎么使用的,所以具体用途就不知道了。

>> bp入栈是什么意思,直接修改SP不就行了吗
bp 入栈是为了保存 bp 以便最后的出栈进行恢复,直接修改 sp 的话,能有这效果吗?