Assembly 在x86汇编程序中查找代码段的偏移量
我是x86汇编编程的新手,在一次作业中遇到了这个问题。 我的目标是为某些中断(比如INT32或INT35,两者都是用户定义的中断)编写中断描述符表条目。我阅读了《英特尔x86开发人员手册》,找到了IDT条目的结构。为了这个问题,让我考虑一下我的程序有以下结构:Assembly 在x86汇编程序中查找代码段的偏移量,assembly,x86,Assembly,X86,我是x86汇编编程的新手,在一次作业中遇到了这个问题。 我的目标是为某些中断(比如INT32或INT35,两者都是用户定义的中断)编写中断描述符表条目。我阅读了《英特尔x86开发人员手册》,找到了IDT条目的结构。为了这个问题,让我考虑一下我的程序有以下结构: myCodeGeneratingInterrutpt35: ... ... ... someOtherCode: .. .. .. myInterruptHandlerForInterrupt35: .
myCodeGeneratingInterrutpt35:
...
...
...
someOtherCode:
..
..
..
myInterruptHandlerForInterrupt35:
.
.
.
IRET
someOtherInterruptHandlers:
... ..
此代码位于从地址开始的代码段中,例如0xa1000(存储在CS中)。让IDTR指向某个地址,比如0xe5000。我有8字节的条目,对应于从[IDTR]开始的每个IDT条目。根据我的计算,INT 35的条目是0xe5118。
(a) 。你们能给我一个方法找出以“myInterruptHandlerForInterrupt35:…”开头的代码的地址吗?
(b) 。另外,如何找到代码“myInterruptHandlerForInterrupt35”与CS之间的偏移量?如果您处于保护模式,您应该知道内核的
CS
。即使没有,您也必须已经处于内核模式才能修改IDT,因此假设您只有一个代码段,对于中断处理程序,当前的CS
将是CS
。请注意,CS
本身与基址无关,因为基址存储在GDT或LDT中(如适用)。因此从地址0xa1000开始(存储在CS中)
只有在表示从该地址开始的段的选择器位于CS
中时才有意义
至于偏移量,那当然只是标签的地址。嘿,杰斯特!谢谢你的回答。你能告诉我如何找到标签的地址吗?任何数学公式或洞察到这一点将不胜感激。不知道你想要什么。。。只需使用标签名,汇编程序和链接程序就会处理其余的部分。我遇到的问题是为INT35定义IDT条目。IDT条目需要中断处理程序的段选择器,以及与中断处理程序例程所在代码段的偏移量。我在计算“myInterruptHandlerForInterrupt35”的偏移量时遇到了一个问题,当我的代码段从“MyDegrationInterrupt35”开始时,
CS
是您的选择器,标签是您的偏移量。问题是什么?定义IDT条目时,我在偏移字段中输入的数值是多少?