Windows x86汇编语言语法

时间:2016-08-26 20:44:06

标签: windows assembly x86

(1)以下代码是什么意思?我在网上任何地方找不到关于ds:[]语法的任何参考。如果没有ds,它有什么不同??

cmp eax,dword ptr ds:[12B656Ch] 

(2)在以下说明中,

movsx eax,word ptr [esi+24h]

esi寄存器用于什么?是否可以通过使用如此罕见的寄存器来猜测原始C代码的作用?

1 个答案:

答案 0 :(得分:2)

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

数据段是访问内存时的默认段。有些反汇编程序会错误地列出它,即使它没有用来列出默认段 如果您希望使用分段覆盖,则可以列出不同的分段 CS是de Code Segment,它是跳转和调用的默认段,而SS是Stack段,它是基于ESP的地址的默认值。
ES是Extra Segment,用于字符串指令。

在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中。 (因此带有符号eXtend的mov) ESI不会链接本地变量,因为在这种情况下会使用EBPESP
如果您想了解更多关于c代码的信息,您需要更多的背景信息 许多c构造转换为多个cpu指令。

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