# Symbol table 觀察紀錄(二) ###### tags: `Firmware` `MVMC-lab` ## 相關連結 - [Symbol table 觀察紀錄](https://hackmd.io/nMj_csylQ9GZ5dMQGguBFQ?both) ## 實驗步驟 ```c= int global_uninit_var; // 全域未初始化變數 int global_init0_var = 0; // 全域初始化為 0 變數 int global_init_var = 66; // 全域初始化變數 static int global_static_uninit_var; // 全域未初始化靜態變數 static int global_static_init0_var = 0; // 全域初始化為 0 靜態變數 static int global_static_init_var = 99; // 全域初始化靜態變數 int main(void) { int local_uninit_var; // 區域未初始化變數 int local_init0_var = 0; // 區域初始化為 0 變數 int local_init_var = 10; // 區域初始化變數 static int local_static_uninit_var; // 區域未初始化靜態變數 static int local_static_init0_var = 0; // 區域初始化為 0 靜態變數 static int local_static_init_var = 77; // 區域初始化靜態變數 return 0; } ``` 以上程式碼使用avr-gcc進行編譯生成.o檔案 接著使用avr-objdump觀察symbol table ## 輸出結果 ```asm SYMBOL TABLE: 00000000 l df *ABS* 00000000 test.c 00000000 l d .text 00000000 .text 00000000 l d .data 00000000 .data 00000000 l d .bss 00000000 .bss 0000003e l *ABS* 00000000 __SP_H__ 0000003d l *ABS* 00000000 __SP_L__ 0000003f l *ABS* 00000000 __SREG__ 0000003b l *ABS* 00000000 __RAMPZ__ 00000000 l *ABS* 00000000 __tmp_reg__ 00000001 l *ABS* 00000000 __zero_reg__ 00000002 l O .bss 00000002 global_static_uninit_var 00000004 l O .bss 00000002 global_static_init0_var 00000002 l O .data 00000002 global_static_init_var 00000004 l O .data 00000002 local_static_init_var.1471 00000006 l O .bss 00000002 local_static_init0_var.1470 00000008 l O .bss 00000002 local_static_uninit_var.1469 00000000 l d .comment 00000000 .comment 00000002 O *COM* 00000001 global_uninit_var 00000000 g O .bss 00000002 global_init0_var 00000000 g O .data 00000002 global_init_var 00000000 g F .text 0000002a main 00000000 *UND* 00000000 __do_copy_data 00000000 *UND* 00000000 __do_clear_bss ``` 觀察結果: - 加入static修飾的全域宣告變數變為'l' -> local標籤,效果等同在函式前加入static。而特性變為local的global_static_uninit_var直接被編譯器安排至bss section。 - 有static的local var後面皆被增加了數字,因為同一份.c中local static var可能會有重複名稱,編譯器避免發生衝突加入的。[參考](https://stackoverflow.com/questions/14907225/symbol-table-local-static-variable-name) - 未加上static修飾的local var則都不存在於symbol table中,而隱藏於是在instruction中(但不確定未初始化的local var是否被處理) ```asm 00000000 <main>: 0: cf 93 push r28 2: df 93 push r29 4: 00 d0 rcall .+0 ; 0x6 <main+0x6> 6: 00 d0 rcall .+0 ; 0x8 <main+0x8> 8: cd b7 in r28, 0x3d ; 61 a: de b7 in r29, 0x3e ; 62 c: 1a 82 std Y+2, r1 ; 0x02 e: 19 82 std Y+1, r1 ; 0x01 10: 8a e0 ldi r24, 0x0A ; 10 12: 90 e0 ldi r25, 0x00 ; 0 14: 9c 83 std Y+4, r25 ; 0x04 16: 8b 83 std Y+3, r24 ; 0x03 18: 80 e0 ldi r24, 0x00 ; 0 1a: 90 e0 ldi r25, 0x00 ; 0 1c: 0f 90 pop r0 1e: 0f 90 pop r0 20: 0f 90 pop r0 22: 0f 90 pop r0 24: df 91 pop r29 26: cf 91 pop r28 28: 08 95 ret ``` :::info - [AVR Instruction Set Manual](http://ww1.microchip.com/downloads/en/devicedoc/atmel-0856-avr-instruction-set-manual.pdf) ST (STD) – Store Indirect From Register to Data Space using Index Y :::
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up