寄存器有默认值吗?

And*_*tín 5 assembly

我想了解一些小代码:

jg 0x00000047
dec esp
inc esi
add [ecx],eax
Run Code Online (Sandbox Code Playgroud)

eax的价值是什么?这些是程序的四个第一句话,我不知道是否有默认值,或者前面的句子是否为eax添加了一些内容.

我的操作系统是Linux,可执行文件是由gcc4.3从C源代码编译的(gcc file.c exec)

cHa*_*Hao 5

取决于平台,语言和/或调用约定.但是,在此之前的代码通常应该将EAX设置为某个值.EAX是那些经常被修改的寄存器之一,它通常不用于保存内容.

说明看起来有点随机.特别是,"dec esp"通常是一个巨大的禁忌,因为堆栈应该始终是双字对齐的.你确定这是实际代码吗?如果我正在向右翻译,则指令字节转换为"\ x7fELF",这告诉我这只是Linux程序的头字节,而不是实际的代码字节.

  • 如果x86dis知道如何反汇编ELF程序,也许吧.但它有点看起来不那么聪明. (3认同)

Nat*_*man 3

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

  • cpuid返回 eax、ebx、ecx 和 edx 中的值
  • loop减少 ecx
  • rep字符串指令更改 ecx、edi 和 esi
  • rdmsr更改 eax 和 edx
  • muldiv更改 eax 和 edx

还有很多其他的例子。

您不能仅通过查看代码中未列出 eax 就认为它没有更改。

即使假设您知道哪些寄存器受哪些指令影响,您对值有任何保证的唯一时间是:

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

在任何其他时间,您都不能对值做出假设。