gpt4 book ai didi

c - C代码的反汇编中定义了哪些数值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:39 26 4
gpt4 key购买 nike

我正在理解汇编和 C 代码。我有以下 C 程序,仅编译生成目标文件。

#include <stdio.h>
int main()
{
int i = 10;
int j = 22 + i;
return 0;
}

我执行了以下命令

objdump -S myprogram.o

上面命令的输出是:

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

助记命令前的number numeric是什么意思即“sub”命令之前的“83 ec 10”或 “movl”命令之前的“c7 45 f8 0a 00 00 00”

我正在使用以下平台来编译这段代码:

$ 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

最佳答案

那些是 x86 操作码。除了上面评论中列出的引用之外,还提供了详细引用 here .

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

c7 45 f8 操作码意味着移动数据并清除 EFLAGS 中的算术进位标志。登记。查看reference了解更多详情。

其余代码是 immediate value .由于您使用的是小端系统,因此首先列出数字的最低有效字节,例如 10 进制(十六进制为 0x0a)和 4 字节值 0x0000000a 存储为 0a 00 00 00.

关于c - C代码的反汇编中定义了哪些数值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36370689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com