(1)以下代码是什么意思?我在网上任何地方找不到关于ds:[]语法的任何参考。如果没有ds,它有什么不同??
cmp eax,dword ptr ds:[12B656Ch]
(2)在以下说明中,
movsx eax,word ptr [esi+24h]
esi寄存器用于什么?是否可以通过使用如此罕见的寄存器来猜测原始C代码的作用?
答案 0 :(得分:2)
DS
指的是数据段
在Win32中,CS = DS = ES = SS = 0
也就是说,这些段无关紧要,并使用扁平的32位地址空间。
数据段是访问内存时的默认段。有些反汇编程序会错误地列出它,即使它没有用来列出默认段
如果您希望使用分段覆盖,则可以列出不同的分段
CS
是de Code Segment,它是跳转和调用的默认段,而SS
是Stack段,它是基于ESP的地址的默认值。
ES
是Extra Segment,用于字符串指令。
在Win32中唯一有意义的段覆盖是FS
(F
不代表任何内容,但是它位于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
不会链接本地变量,因为在这种情况下会使用EBP
或ESP
。
如果您想了解更多关于c代码的信息,您需要更多的背景信息
许多c构造转换为多个cpu指令。
查看此代码的最佳方法是编写c代码并检查生成的cpu代码。