Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C代码的分解中定义了哪些数值?_C_Linux_Assembly_Mnemonics - Fatal编程技术网

在C代码的分解中定义了哪些数值?

在C代码的分解中定义了哪些数值?,c,linux,assembly,mnemonics,C,Linux,Assembly,Mnemonics,我理解汇编和C代码。 我有下面的C程序,编译后只生成目标文件 #include <stdio.h> int main() { int i = 10; int j = 22 + i; return 0; } 上述命令的输出为: objdump -S testelf.o testelf.o: file format elf32-i386 Disassembly of section .text: 00000000 <main>: #includ

我理解汇编和C代码。 我有下面的C程序,编译后只生成目标文件

#include <stdio.h>
int main()
{
  int i = 10;
  int j = 22 + i;
  return 0;
}
上述命令的输出为:

objdump -S testelf.o 

testelf.o:     file format elf32-i386


Disassembly of section .text:

00000000 <main>:
#include <stdio.h>

int main()
{
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 10                sub    $0x10,%esp
  int i = 10;
   6:   c7 45 f8 0a 00 00 00    movl   $0xa,-0x8(%ebp)
  int j = 22 + i;
   d:   8b 45 f8                mov    -0x8(%ebp),%eax
  10:   83 c0 16                add    $0x16,%eax
  13:   89 45 fc                mov    %eax,-0x4(%ebp)

  return 0;
  16:   b8 00 00 00 00          mov    $0x0,%eax
}
  1b:   c9                      leave  
  1c:   c3                      ret  

这些是x86操作码。除上述评论中列出的参考资料外,还提供了详细的参考资料

例如,
movl$0xa,-0x8(%ebp)
之前的
c7 45 f8 0a 00 00
是操作码字节的十六进制值。它们告诉CPU将10位小数的立即值(作为4字节的值)移动到位于堆栈帧基指针上方8字节的当前堆栈地址中。这就是代码运行时C源代码中的变量
i
所在的位置。堆栈顶部的内存地址低于堆栈底部的内存地址,因此从底部向上移动负方向就是向上移动堆栈

c7 45 f8
操作码表示mov数据并清除寄存器中的算术进位标志。有关更多详细信息,请参阅


其余代码是一个。由于您使用的是小尾数系统,因此首先列出数字的最低有效字节,这样10位十进制(十六进制为0x0a,4字节值为0x0000000a)存储为
0a 00 00

这些是汇编指令汇编成的机器代码序列。有关完整的指令集参考以及如何将指令映射到机器代码(反之亦然)的信息,请参阅。请注意,如果您想研究这样一个小测试程序的汇编输出,编译器可能会优化无用的代码。在这种情况下,可能是因为从来没有使用过j。请注意,这与英特尔手册中的语法并不直接对应。基本上,是安装程序将堆栈指针定位在堆栈顶部。没有
argc
argv
值,因此您可能有4位argc、8位argv和4位align,从而导致
0x10
从堆栈顶部偏移。您可以找到的操作码
objdump -S testelf.o 

testelf.o:     file format elf32-i386


Disassembly of section .text:

00000000 <main>:
#include <stdio.h>

int main()
{
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 10                sub    $0x10,%esp
  int i = 10;
   6:   c7 45 f8 0a 00 00 00    movl   $0xa,-0x8(%ebp)
  int j = 22 + i;
   d:   8b 45 f8                mov    -0x8(%ebp),%eax
  10:   83 c0 16                add    $0x16,%eax
  13:   89 45 fc                mov    %eax,-0x4(%ebp)

  return 0;
  16:   b8 00 00 00 00          mov    $0x0,%eax
}
  1b:   c9                      leave  
  1c:   c3                      ret  
$ lscpu 
Architecture:          i686
CPU op-mode(s):        32-bit
Byte Order:            Little Endian
CPU(s):                1
On-line CPU(s) list:   0
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             1
Vendor ID:             GenuineIntel