我正在寫一個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