我正在写一个mini os。当我写这篇文章的代码显示实时时钟,它不顺心i386-elf-gcc输出关于“static a = 0”的奇怪汇编指令
7 void timer_callback(pt_regs *regs)
8 {
9 static uint32_t tick = 0;
10 printf("Tick: %dtimes\n", tick);
11 tick++;
12 }
蜱是0不是初始化,但1818389861.但如果剔初始化与0×01或任何其他零,没关系!
,所以我WIRTE一个简单的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
这么奇怪,使用无记忆!
更新:让我说清楚
第二static.c文是一个实验,有人认为它没有显示使用的内存,但是我错了,
mov 0x0 %eab
是。我混淆0x0和$ 0x0/.. \我的起源问题是为什么剔不成功与初始值为0.(但可以初始化1或anyelsenumber)。
我期待它再次使用gdb的,好吧,它做使用记忆像是
mov
,但真正的强者就是内存
eax,ds:0x106010x 0x106010
不为0,但它应该是,就像我说的,如果我让tick = 1 or anythingelse
,内存做初始化,因为我想,这是奇怪的事情!工具:GDB,objdump的返回不同的ASM(不同的手段,而不是甲酸盐),因为,刚学操作系统,位于C不好,所以我让他走,不理它....
问题是什么吗?你也展示了一些C代码,但反汇编是为了不同的东西 - 连接是什么?你提到的奇怪装配在哪里? – nos
如果在第一次调用timer_callback时tick不是打印为零,那么您的代码中的其他位置必须有未定义的行为。在你使用'a'的第二个例子中,因为编译器已经优化了它,所以没有使用内存,它不需要是静态的,因为你只打印一次然后退出。 –
11:处的指令是从地址0x0到%eax的一个mov。地址为0x0的原因是因为这是一个目标文件,链接程序所做的重定位尚未完成。链接后,这将是一个适当的地址,从一个适当的内存位置“a”存储。 – Art