gpt4 book ai didi

c - i386-elf-gcc 输出关于 "static a = 0"的奇怪汇编命令

转载 作者:太空宇宙 更新时间:2023-11-04 01:52:58 25 4
gpt4 key购买 nike

我正在写一个迷你操作系统。当我编写这段代码来显示时钟时,它出错了

  7 void timer_callback(pt_regs *regs)
8 {
9 static uint32_t tick = 0;
10 printf("Tick: %dtimes\n", tick);
11 tick++;
12 }

tick 不是用 0 初始化的,而是 1818389861。但是如果用 0x01 或其他任何零来初始化 tick init,就没问题!!!

所以我写了一个简单的 c 文件然后 objdump:

staic.o:     file format elf32-i386


Disassembly of section .text:

00000000 <main>:
extern void printf(char *, int);

int main(){
0: 8d 4c 24 04 lea 0x4(%esp),%ecx
4: 83 e4 f0 and $0xfffffff0,%esp
7: ff 71 fc pushl -0x4(%ecx)
a: 55 push %ebp
b: 89 e5 mov %esp,%ebp
d: 51 push %ecx
e: 83 ec 04 sub $0x4,%esp
static int a = 1;
printf("%d\n", a);
11: a1 00 00 00 00 mov 0x0,%eax
16: 83 ec 08 sub $0x8,%esp
19: 50 push %eax
1a: 68 00 00 00 00 push $0x0
1f: e8 fc ff ff ff call 20 <main+0x20>
24: 83 c4 10 add $0x10,%esp
return 0;
27: b8 00 00 00 00 mov $0x0,%eax
}
2c: 8b 4d fc mov -0x4(%ebp),%ecx
2f: c9 leave
30: 8d 61 fc lea -0x4(%ecx),%esp
33: c3 ret

好奇怪,没有使用内存!!!

更新:我说清楚

  1. 第二个 static.c 是一个实验,它被认为没有内存使用,但我错了,mov 0x0 %eab是。我混淆了 0x0 和 $0x0/..\

  2. 我的原始问题是为什么 tick 不能用 0 初始化成功。(但可以用 1 或任何其他数字初始化)。

  3. 我再次使用 gdb 查找它,好的,它确实像 mov<br/>
    eax,ds:0x106010
    这样使用内存,但真正强大的是内存x 0x106010不是 0,但它应该是,就像我说的,如果我让 tick = 1 or anythingelse , 内存按照我的意愿进行初始化,这很奇怪!

  4. 工具:gdb,objdump返回不同的asm(不同的意思,不是formate),因为,刚学os,不擅长c,所以我放弃了,忽略它....

最佳答案

内存被占用,请确定;但是,您不会在 .text 部分中找到该内存。静态变量的内存分配在 .bss(当零初始化时;或者,在 C++ 的情况下,动态初始化)或 .data(当非零初始化时)部分。

当使用 -d(反汇编)选项使用 objdump 转储目标文件时,还使用 ​​-r(重定位)很重要) 选项。否则,您得到的反汇编是骗人的,没有任何意义。

在您的情况下,地址 111f 处的指令必须在地址 11 处重定位到变量 a 和地址 1f,到函数 printf。地址 11 的指令从变量 a 加载值,如果没有适当的重定位,它看起来就像从地址 0 加载值一样。

关于您最初的问题,您得到的值 1818389861 或 0x6C626D65 非常了不起。我敢打赌,在您的程序中的某处,您有一个缓冲区溢出,涉及一个包含子序列 embl 的字符串。

作为旁注,我想提请您注意在 printf 调用中使用正确的类型规范。类型规范%d对应类型int;在所有现代主流架构上,intint32_t 的大小相同。然而,这并不能保证永远如此。有用于显式大小类型的特殊类型规范,例如,对于 int32_t,您使用 "PRId32":

uint32_t x;
printf("%"PRId32, x);

关于c - i386-elf-gcc 输出关于 "static a = 0"的奇怪汇编命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39975235/

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