【问题标题】:x86 32 bit protected mode: Read from call stack?x86 32 位保护模式:从调用堆栈中读取?
【发布时间】:2012-09-04 07:01:54
【问题描述】:

如何从调用堆栈中获取地址?我正在编写一个异常处理程序,我想让它显示 CPU 异常是否发生?

【问题讨论】:

    标签: exception assembly x86 interrupt


    【解决方案1】:

    从 intel.com 或 amd.com 获取一份 CPU 手册。查看有关中断和异常处理的章节。找到显示中断或异常发生时堆栈内容的图表。例如,来自 INTEL 80386 程序员参考手册 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 之前将其弹出),然后是 @987654323 @ 和cs 导致异常或被中断的位置。

    【讨论】:

    • 谢谢!这正是我正在寻找的(我仍然是一个 asm 菜鸟,哈哈)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 2016-03-29
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    相关资源
    最近更新 更多