【问题标题】:Windows x86 assembly language syntax [duplicate]Windows x86汇编语言语法[重复]
【发布时间】:2017-01-03 14:29:16
【问题描述】:

(1) 下面的代码是什么意思?我在网上的任何地方都找不到关于 ds:[ ] 语法的任何参考资料。和没有 ds: 有什么不同?

cmp eax,dword ptr ds:[12B656Ch] 

(2) 在下面的指令中,

movsx eax,word ptr [esi+24h]

esi 寄存器是做什么用的?使用这么稀有的寄存器,能猜出原来的 C 代码在做什么吗?

【问题讨论】:

  • 与没有 ds: 有何不同?。不是,您的反汇编程序只是冗长。
  • @cr001:(1)是的;除非有特定的段覆盖,默认情况下mov 中的地址和大多数其他指令都相对于 DS 段(值得注意的例外:字符串指令 - 使用 ES;代码地址,相对于 CS 获取;但鉴于 CS, DS 和 ES 在“正常” 32 位进程中默认设置为零,这些细节通常可以忽略)。
  • 致何塞·罗德里格斯:非常感谢。这就是我想知道的事情。我将尝试查看该地址处的数据是否与程序中任何明显的数组或字符串数​​据匹配。
  • @cr001: (2) ESI 是“特殊的”,因为它可以用于“字符串指令”(寻找replodsbstosb 和类似的指令),但通常也用作普通的通用寄存器。它是跨函数调用保留的寄存器之一,因此当值必须“生存”几个函数调用而不将其溢出到堆栈上时,可以使用它(因此,它可以用于当前函数中的长期变量)。
  • 这就是我想知道的事情。我认为stackoverflow.com/questions/38843403/… 会是一个更好的重复目标,那么。我会重新打开,但其他人将不得不重新关闭。显然我无法重新关闭它。

标签: windows assembly x86


【解决方案1】:

DS 指的是数据段。
在 Win32 中,CS = DS = ES = SS = 0。
也就是说,这些段无关紧要,使用的是平坦的 32 位地址空间。

Data 段是访问内存时的默认段。一些反汇编程序错误地列出了它,即使列出默认段没有用处。
如果您愿意,可以使用段覆盖列出不同的段。
CS 是代码段,它是跳转和调用的默认段,SS 是堆栈段,它是基于地址的默认段在 ESP 上。
ES 是用于字符串指令的额外段。

在 Win32 中唯一有意义的段覆盖是 FSF 不代表任何东西,但它出现在 E 之后)。
FS 链接到线程信息块 (TIB ) 它包含线程特定的数据,对于线程本地存储和一般的多线程非常有用。
还有一个GS,它是为将来在Win32中使用而保留的,用于Win64中的TIB。
在 Linux 中,情况大致相同。

什么是寄存器 X
您必须放弃寄存器具有特殊用途的观念。
在 x86 中,您几乎可以将任何寄存器用于任何目的。
只有少数复杂指令使用特定寄存器,但普通指令可以使用任何寄存器。
编译器将尝试使用尽可能多的寄存器以避免使用内存。

话虽如此,8个x86寄存器的最初用途如下:

EAX : accumulator, some instructions using this register have 'short versions'.  
EDX : overflow for EAX, used to store 64 bit values when multiplying or dividing.
ECX : counter, used in string instructions like rep mov and shifts.
EBX : miscellaneous general purpose register.
ESI : Source Index register, used as source pointer for string instructions
EDI : Destination Index register, used as destination pointer
ESP : Stack pointer, used to keep track of the stack
EBP : Base pointer, used in stack frames

您可以随意使用任何寄存器,ESP 除外。尽管 ESP 可以在许多指令中工作,但忘记堆栈就太尴尬了。

是否有可能通过使用如此罕见的寄存器来猜测原始 C 代码在做什么?

我的猜测:

struct x {
  int a,b,c,d,e,f,g,h,i,j;    //36 bytes
  short s };
....
int i = x.s;

ESI 可能指向某个结构或对象。在偏移量 24h (36) 处存在一个短路,该短路被传输到一个 int 中。 (因此带有 Sign eXtend 的 mov)。
ESI 不链接局部变量,因为在这种情况下将使用 EBPESP
如果您想了解更多关于 c 代码的信息,则需要更多上下文。
许多 c 构造转换为多个 cpu 指令。

最好的方法是编写 c 代码并检查生成的 cpu 代码。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多