|
| |
dss:fffc | 注意返回地址为0123 |
| |
| |
0E69:FFF0 | | 23 01 00 00 | | #... |
| |
| |
可以看到返回地址是0123,恰好是LOW4B处。当第一次执行RET指令时,CPU将返回到这个地址处继续执行。
|
| |
| |
-g=125 12e | |
| |
| |
1 | ← 程序显示出ESC键的ASCII码高4位对应的十六进制数 |
| |
| |
AX=0231 | BX=0103 | CX=0004 | DX=1B31 | SP=FFFC | BP=0000 | SI=0000 | DI=0000 | |
| |
| |
DS=0E69 | ES=0E69 | SS=0E69 | CS=0E69 | IP=012E |
NV UP EI PL NZ NA PO NC |
| |
| |
0E69:012E | C3 | RET |
|
| |
| |
利用"G"命令在012E处打一个断点,以便于观察RET指令的执行。
|
| |
| |
-t | |
| |
| |
AX=0231 | BX=0103 | CX=0004 | DX=1B31 | SP=FFFE | BP=0000 | SI=0000 | DI=0000 | |
| |
| |
DS=0E69 | ES=0E69 | SS=0E69 | CS=0E69 | IP=0123 |
NV UP EI PL NZ NA PO NC |
| |
| |
0E69:0123 | 8AC6 | MOV AL,DH |
|
| |
| |
CPU返回0123处继续执行程序 |
| |
| |
可以看到CPU正确地返回到0123处继续执行程序,再往下CPU将直接进入0125处。
|
| |
| |
-t | |
| |
| |
AX=021B | BX=0103 | CX=0004 | DX=1B31 | SP=FFFE | BP=0000 | SI=0000 | DI=0000 | |
| |
| |
DS=0E69 | ES=0E69 | SS=0E69 | CS=0E69 | IP=0125 |
NV UP EI PL NZ NA PO NC |
| |
| |
0E69:0125 | 240F | AND AL,0F |
|
| |
| |
程序直接进入了0125处 |
| |
| |
我们再次用"G"命令在012E处打上断点,以便于观察RET指令第二次执行的情况。
|
| |
| |
-g=125 12e[Enter] | |
| |
| |
B | ← 程序显示出ESC键对应ASCII码的低半个字节 |
| |
| |
AX=0242 | BX=0103 | CX=0004 | DX=1B42 | SP=FFFE | BP=0000 | SI=0000 | DI=0000 | |
| |
| |
DS=0E69 | ES=0E69 | SS=0E69 | CS=0E69 | IP=012E |
NV UP EI PL NZ NA PO NC |
| |
| |
0E69:012E | C3 | RET |
|
| |
| |
再次用"T"命令跟踪RET指令,注意此时堆栈中已经没有CALL指令压入的返回地址,只有DOS存入的一个"0"
|
| |