【问题标题】:Finding offset for code segment in x86 assembly program在 x86 汇编程序中查找代码段的偏移量
【发布时间】:2015-03-08 16:30:47
【问题描述】:

我是 x86 汇编编程的新手,在我的一项作业中遇到了这个问题。 我的目标是为某些中断(比如 INT 32 或 INT 35,两者都是用户定义的中断)编写中断描述符表条目。我查看了 Intel x86 Developers Manual 并找到了 IDT 条目的结构。出于这个问题的目的,让我们考虑我的程序具有以下结构:

myCodeGeneratingInterrutpt35:
  ...
  ...
  ...

someOtherCode:
  ..
  ..
  ..

myInterruptHandlerForInterrupt35:
  .
  .
  .
  IRET

someOtherInterruptHandlers:
 ... ..

此代码位于从地址开始的代码段中,例如 0xa1000(存储在 CS 中)。让 IDTR 指向某个地址,比如 0xe5000。我有 8 字节的条目对应于从 [IDTR] 开始的每个 IDT 条目。因此,根据我的计算,INT 35 的条目位于 0xe5118。 (一种)。你们能给我一个方法来找出以“myInterruptHandlerForInterrupt35: ...”开头的代码地址吗? (b)。另外,如何从 CS 中找到代码“myInterruptHandlerForInterrupt35”的偏移量?

【问题讨论】:

    标签: assembly x86


    【解决方案1】:

    如果您处于保护模式,您应该知道内核的CS。即使您不这样做,您也必须已经处于内核模式才能修改 IDT,因此假设您只有一个代码段,当前的 CS 将是 CS 用于中断处理程序。请注意,CS 本身与基地址无关,因为它存储在适用的 GDT 或 LDT 中。因此,starting at address 0xa1000 (which is stored in CS) 仅在您表示从该地址开始的段的选择器位于 CS 中时才有意义。

    至于偏移量,当然是标签的地址。

    【讨论】:

    • 嘿小丑!感谢您的回答。你能告诉我如何找到标签的地址吗?任何数学公式或对此的见解都将受到高度赞赏。
    • 不确定你想要什么......只需使用标签名称,汇编器和链接器将负责其余的工作。
    • 我遇到的问题是为 INT 35 定义 IDT 条目。IDT 条目需要中断处理程序的段选择器,以及中断处理程序例程所在代码段的偏移量。当我的代码段从“myCodeGeneratingInterrupt35”开始时,我在计算“myInterruptHandlerForInterrupt35”的偏移量时遇到问题
    • CS 是您的选择器,标签是您的偏移量。有什么问题?
    • 我在定义 IDT 条目时在偏移字段中输入的数值是多少?
    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    相关资源
    最近更新 更多