2010-11-10 67 views
5

我想明白了一点代码:寄存器是否有任何默认值?

jg 0x00000047 
dec esp 
inc esi 
add [ecx],eax 

什么是EAX的价值?这些是程序的四个第一句,我不知道是否有默认值,或者前面的句子是否给eax添加了一些东西。

我的操作系统是Linux和可执行由gcc4.3从C源代码(GCC file.c EXEC)

+1

不是'是',而是'是'。 – leppie 2010-11-10 08:37:08

+0

如果您提供有关您的平台(操作系统,可执行格式)的一些信息,我确定有人可以告诉您在程序入口点设置了什么'eax'。 – Edmund 2010-11-10 08:49:10

+0

编辑,谢谢你的建议。 – 2010-11-10 08:55:03

回答

3

某些指令隐式更新寄存器,即使目标未在代码中明确列出。一些例子:

  • cpuid在EAX,EBX,ECX和EDX
  • loop递减ECX
  • rep字符串指令改变ECX,EDI和ESI返回值
  • rdmsr变化EAX和EDX
  • muldiv更改eax和edx

还有很多其他的例子。

你不能仅仅通过看到代码中没有列出eax而没有改变它。

即使假设你知道哪些寄存器是由哪些指令,你有一个值的任何担保的唯一时间影响的是:

  • 您知道的指令更新后
  • 硬件后立即复位

在任何其他时间,您无法对这些值进行假设。

+0

所以我们会说eax有一个随机的(至少是随机的)值? – 2010-11-10 08:47:58

+1

@Vaul:是的,我们会 – 2010-11-10 09:38:09

5

依赖于平台,语言编制,和/或调用约定。但是,在此之前的代码通常应该将EAX设置为某个值。 EAX是那些经常修改的寄存器之一,通常不用于保存东西。

该指令看起来有点随意。特别是,“dec esp”通常是一个巨大的no-no,因为堆栈应该始终是双字对齐的。你确定这是实际的代码吗?指令字节翻译成“\ x7fELF”,如果我正确翻译,这表明这只是Linux程序的头字节,而不是实际的代码字节。

+0

我在C中反编译了一个由我编写的程序代码,试图理解asm代码,我想他们不是随机指令。正如我所说的,没有以前的句子,所以eax可能有一个随机值。谢谢。 – 2010-11-10 08:52:46

+0

你如何分解代码?请记住,可执行文件很少只是原始代码。 (我知道的唯一格式是.com文件,而这些文件已经过时了10年以上。)在大多数32位操作系统中,可执行文件的格式完全有点复杂。 – cHao 2010-11-10 08:59:19

+0

使用x86dis,可以吗?如果x86dis知道如何反汇编一个ELF程序,可能是 – 2010-11-10 09:06:45

2

它似乎不是有效的代码。你确定这不是文字吗?

解码它作为32位的x86给人串ELF

00: 7F 45 // 0x7F E 
02: 4C  // L 
03: 46  // F 
04: 01 01 // ?? ?? 

尝试打开该文件为ELF文件,而不是像刚才二进制。

4

我想你真正在问的是calling convention,它描述了程序中的子程序如何相互传递信息,操作系统如何将信息传递给程序,一般来说不同的寄存器应该是什么意思。

例如,大多数C编译器使用的cdecl calling convention on the x86表示,当一个函数返回时,返回值会在eax寄存器上。所以如果你有一个函数int foo(),你知道在foo执行它的ret操作码之后,eax将包含那个foo返回的int。相反,PowerPC处理器(通常)具有(至少)32个寄存器,简称为r0,r1,...,r31。该芯片的The AIX calling convention表示堆栈指针在r1上传递,函数参数在r3到r11上传递,返回值在r3上返回,依此类推。

重要的是要记住,调用约定有点像程序中的函数或库之间的协议。它不是硬件或法律的一部分,通常有许多不同的调用约定可用于平台。这就是为什么有时候你会看到这样

struct CFoo { void __stdcall method(); }; 

这是MSVC的指令,通常喜欢用fastcall约定,告诉它使用不同的约定对于一个功能代码。这很重要,如果例如该函数是在由其他编译器构建的库中定义的,该编译器使用stdcall代替。当我们谈论操作系统如何将信息传递给程序(或硬件到操作系统)时,我们通常将其称为ABI而不是调用约定,但它是相同的想法。所以对于你的程序来说,它的编写假设操作系统会在eax上传递一些特定的信息。这个假设对于操作系统,编译器甚至个别程序都是特别的。

+0

非常感谢,这给我一个理解ASM的好点。 – 2010-11-10 09:13:09