コールスタックからアドレスを取得するにはどうすればよいですか? 例外ハンドラを作成していますが、CPU 例外が発生したことを示すようにしたいですか?
1 に答える
1
Intel.com または amd.com から CPU マニュアルのコピーを入手してください。割り込みと例外処理に関する章を調べてください。割り込みまたは例外が発生したときのスタックの内容を示す図を見つけます。たとえば、INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986 から:
Figure 9-5. Stack Layout after Exception of Interrupt
WITHOUT PRIVILEGE TRANSITION
D O 31 0 31 0
I F ╠═══════╦═══════╣ ╠═══════╦═══════╣
R ║▒▒▒▒▒▒▒║▒▒▒▒▒▒▒║ OLD ║▒▒▒▒▒▒▒║▒▒▒▒▒▒▒║ OLD
E E ╠═══════╬═══════╣ SS:ESP ╠═══════╬═══════╣ SS:ESP
C X ║▒▒▒▒▒▒▒║▒▒▒▒▒▒▒║ │ ║▒▒▒▒▒▒▒║▒▒▒▒▒▒▒║ │
T P ╠═══════╩═══════╣<────┘ ╠═══════╩═══════╣<────┘
I A ║ OLD EFLAGS ║ ║ OLD EFLAGS ║
O N ╠═══════╦═══════╣ ╠═══════╦═══════╣
N S ║▒▒▒▒▒▒▒║OLD CS ║ NEW ║▒▒▒▒▒▒▒║OLD CS ║
I ╠═══════╩═══════╣ SS:ESP ╠═══════╩═══════╣
│ O ║ OLD EIP ║ │ ║ OLD EIP ║ NEW
│ N ╠═══════════════╣<────┘ ╠═══════════════╣ SS:ESP
│ ║ ║ ║ ERROR CODE ║ │
v ╠═══════════════╣<────┘
║ ║
WITHOUT ERROR CODE WITH ERROR CODE
つまり、割り込みハンドラーがスタックで最後に受け取るのは、エラー コード (オプションです。すべての例外にエラー コードがあるわけではなく、実行する前にポップする必要がありますiret
)eip
と、エラーcs
の原因となった場所です。例外または中断されました。
于 2012-09-04T07:53:56.457 に答える