第一課感覺沒什么內容,回答一下課后習題吧。文字描述評論區已經很多了,於是我決定在看一下這兩個指令是否真的實現了評論中所說的功能。
調試環境為 visual studio 2019。
1.call
在執行 call 指令之前,RSP = 0xE69635E920 ,記住了下一條指令 是B490 ,等下棧頂存放的地址就是這個地址。
執行 call 指令之后,首先對下一條指令進行入棧,接下來跳轉到調用的函數的入口地址。可以看到ESP地址減少了 8 個字節,
這 8 個字節存放了下一條指令的地址
在內存框里看一下,確實是這個地址B490:
妙啊,評論區誠不欺我。
2.ret
接下來看一下ret指令, 這個指令執行之前先進行一系列的出棧,我們可以看到在ret指令之前,RSP的值已經恢復到了之前調用 call 指令
時壓棧后時的值,且存儲的地址也是之前保存的IP地址。
執行完ret之后,IP地址指向call的下一條指令,RSP也恢復到了調用函數之前的值。
如此這般,就完成了一次函數從調用到返回的全部過程