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