首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >政务司司长:EIP比较

政务司司长:EIP比较
EN

Stack Overflow用户
提问于 2015-01-27 10:29:31
回答 1查看 1.2K关注 0票数 0

我正在尝试理解如何使用gdb在xv6 (教学操作系统)中引导。

初始引导过程中的指令之一是(AT&T语法):

代码语言:javascript
复制
cmpl 0x0,%cs:0x65a4

然后,

代码语言:javascript
复制
jne 0xfd2b9

现在,据我所知,cmpl比较了这两个值并设置了标志,如果刚才比较的值不相等,jne会查看标志和跳转。

但我不明白%cs:0x65a4作为操作数的含义。这是指地址(cs*16 + 65a4)的值还是该内存位置的实际内容?

我之所以问这个问题,是因为系统不会在jne指令之后跳转,这意味着第二个操作数(%cs:0x65a4)被计算为零。但不应该这样,因为地址和内容都不是零。

EN

回答 1

Stack Overflow用户

发布于 2015-01-27 16:17:08

这是指地址(cs*16 + 65a4)的值还是该内存位置的实际内容?

将位于地址(cs*0x10 + 0x65a4)的内存中的32位字与值0进行比较-假设CPU以“真实模式”运行。

然而,对我来说,有件事显得很奇怪:

您将讨论"cs*0x10“,它是”实模式“的地址计算。由于80286有第二个寻址模式称为“保护模式”。在这种模式下,绝对地址不能简单地.

只有在保护模式下运行时,CPU才能处于“32位模式”。x86 CPU的16位指令集和32位指令集是不同的!

"jne 0xfd2b9“绝对是32位指令,EIP绝对是32位寄存器。

所以要么..。

  • ..。CPU在真实模式下运行,但您看到的解体代码是32位代码(因此反汇编是错误的)。
  • ..。CPU在真实模式下运行,但是您组装了32位代码(所以代码是错误的)。
  • ..。CPU以保护模式运行,因此计算cs*0x10是错误的。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28168240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档