. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->INT指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  13.3节bp 入栈 多余?  [已解决] 回复[ 4次 ]   点击[ 381次 ]  
revivedsun
[帖 主]   [ 发表时间:2010-10-10 10:44 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-02 13:13
直接将sp(栈定ip) 传入 bp 
add [bp],bx 
不存在寄存器冲突问题干嘛要入栈?


assume cs:code
        code segment
                start:
                      ; 中断例程安装
                      mov ax,cs
                      mov ds,ax
                      mov si,offset lp     ; 

                      mov ax,0
                      mov es,ax
                      mov di,200h

                      mov cx,offset len - offset lp
                      cld       ; 设置传送方向 DF  0
                      rep movsb         ;  ds:[si] 送至 es:[di]
                      ; 设置中断向量表
                      mov ax,0
                      mov es,ax
                      mov word ptr es:[7ch*4],200h
                      mov word ptr es:[7ch*4+2],0

                      ; 显示
                      mov ax,0b800h
                      mov es,ax
                      mov di,160*12

                      mov bx,offset s - offset se
                      mov cx,80   ; 计数器
                    s:mov byte ptr es:[di],'!'
                      add di,2
                      int 7ch
                   se:nop
                      mov ax,4c00h
                      int 21h

                      ;中断例程,实现loop的功能
                   lp:;push bp
                      mov bp,sp ; bp 目前为栈顶
                      dec cx    ; --(cx) 
                      jcxz lpret ;if((cx)==0) go to se
                      add [bp],bx
                      ;add [bp+2],bx
                lpret:;pop bp
                      iret     
                  len:nop
        code ends
end start
masmaster
[第1楼]   [ 回复时间:2010-10-10 11:09 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
不是多余, 是必须的。凡是利用堆栈传递子程序参数的时候, 必须这么做。
revivedsun
[第2楼]   [ 回复时间:2010-10-10 11:47 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-02 13:13
不是多余, 是必须的。凡是利用堆栈传递子程序参数的时候, 必须这么做。
------------------
回复:但这里不这么做并不影响结果。
revivedsun
[第3楼]   [ 回复时间:2010-10-10 13:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-02 13:13
我们希望
1)编写的子程序不必关心程序到底是用了哪些寄存器 
...如果想我那样,还要先看bp到底有了没
2)编写子程序不必关心调用者使用了哪些寄存器
3)不会发生寄存器冲突

所以将所有用到的寄存器都入栈。这样通用性也更强些。


start  
       push register 
       push ....
       |
       content
       |   
end    pop 
       ...
       ret
revivedsun
[第4楼]   [ 回复时间:2010-10-10 13:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-02 13:13
此贴由 贴主 于 [ 2010-10-10 13:04 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved