目录 上一页 下一页 下一章

第5章 子程序和串处理 -85-

  "PUSH DX"指令将字符串首地址压入堆栈,借助堆栈将参数传递给子过程。注意SP寄存器的原值为0000。
-t
AX=0924BX=0000CX=004EDX=0000SP=FFFEBP=0000SI=0000DI=0000
DS=1031ES=1021SS=1031CS=1033IP=000D NV UP EI PL NZ NA PO NC
1033:000DE80800CALL 0018
  "CALL"指令执行时堆栈中存入返回地址,恰好在所传递的参数之上。
-t
AX=0924BX=0000CX=004EDX=0000SP=FFFCBP=0000SI=0000DI=0000
DS=1031ES=1021SS=1031CS=1033IP=0018 NV UP EI PL NZ NA PO NC
1033:001855PUSH BP
  为不破坏BP寄存器的原值,在应用BP寄存器之前先将其原状态压入堆栈,此时堆栈指针距传递参数的距离为4个BYTE。
-t
AX=0924BX=0000CX=004EDX=0000SP=FFFABP=0000SI=0000DI=0000
DS=1031ES=1021SS=1031CS=1033IP=0019 NV UP EI PL NZ NA PO NC
1033:00198BECMOV BP,SP
  将堆栈指针置入BP寄存器,准备从堆栈之中取得参数。
-t
AX=0924BX=0000CX=004EDX=0000SP=FFFABP=FFFASI=0000DI=0000
DS=1031ES=1021SS=1031CS=1033IP=001B NV UP EI PL NZ NA PO NC
1033:001B8B5E04MOV BX,[BP+04] SS:FFFE=0000
  参数的实际位置应该是"WORD PTR SS:[BP+04]",应用BP寄存器做间接寻址时CPU会自动引用SS寄存器提取段地址,因此编程时可以不明确指定引用SS寄存器。
-t注意此数据实际来自堆栈
AX=0924BX=0000CX=004EDX=0000SP=FFFABP=FFFASI=0000DI=0000
DS=1031ES=1021SS=1031CS=1033IP=001E NV UP EI PL NZ NA PO NC
1033:001EB91300MOV CX,0013 SS:FFFE=0000
  下面我们一次将子过程全部执行完,并在002BH处设置断点,以便于观察指令RET的执行情况。

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章