2014-09-22 43 views
1

我正在學習彙編。我寫了下面的包含switch case的c程序,創建了目標文件(gcc -o filename filename.c),然後進行了對象轉儲。但是我沒有在對象轉儲中找到標籤和跳轉表。彙編代碼中找不到跳轉表

有人可以告訴我爲什麼跳轉表沒有得到生成?像那些在這裏提到 Link

代碼

C文件

int main() { 
    int i = 0; 
    int n = 9, z = 99 , p = 999; 
    switch(i) 
    { 
     case -1: 
     n++; 
     printf("value n=%d",n); 
     break; 
     case 0 : 
     z++; 
     printf("value z=%d",z); 
     break; 
     case 1 : 
     p++; 
     printf("value p=%d",p); 
     break; 
     case 2 : 
     p++; 
     printf("value p=%d",p); 
     break; 
     case 3 : 
     p++; 
     printf("value p=%d",p); 
     break; 
     case 4 : 
     p++; 
     printf("value p=%d",p); 
     break; 
     case 5 : 
     p++; 
     printf("value p=%d",p); 
     break; 

    } 
    printf("Values n=%d z=%d p=%d \n",n,z,p); 
    return 0; 
} 

以下是主要部分

0804841d <main>: 
804841d: 55      push %ebp 
804841e: 89 e5     mov %esp,%ebp 
8048420: 83 e4 f0    and $0xfffffff0,%esp 
8048423: 83 ec 20    sub $0x20,%esp 
8048426: c7 44 24 1c 00 00 00 movl $0x0,0x1c(%esp) 
804842d: 00 
804842e: c7 44 24 10 09 00 00 movl $0x9,0x10(%esp) 
8048435: 00 
8048436: c7 44 24 14 63 00 00 movl $0x63,0x14(%esp) 
804843d: 00 
804843e: c7 44 24 18 e7 03 00 movl $0x3e7,0x18(%esp) 
8048445: 00 
8048446: 8b 44 24 1c    mov 0x1c(%esp),%eax 
804844a: 83 c0 01    add $0x1,%eax 
804844d: 83 f8 06    cmp $0x6,%eax 
8048450: 0f 87 cb 00 00 00  ja  8048521 <main+0x104> 
8048456: 8b 04 85 1c 86 04 08 mov 0x804861c(,%eax,4),%eax 
804845d: ff e0     jmp *%eax 
804845f: 83 44 24 10 01   addl $0x1,0x10(%esp) 
8048464: 8b 44 24 10    mov 0x10(%esp),%eax 
8048468: 89 44 24 04    mov %eax,0x4(%esp) 
804846c: c7 04 24 e0 85 04 08 movl $0x80485e0,(%esp) 
8048473: e8 78 fe ff ff   call 80482f0 <[email protected]> 
8048478: e9 a4 00 00 00   jmp 8048521 <main+0x104> 
804847d: 83 44 24 14 01   addl $0x1,0x14(%esp) 
8048482: 8b 44 24 14    mov 0x14(%esp),%eax 
8048486: 89 44 24 04    mov %eax,0x4(%esp) 
804848a: c7 04 24 eb 85 04 08 movl $0x80485eb,(%esp) 
8048491: e8 5a fe ff ff   call 80482f0 <[email protected]> 
8048496: e9 86 00 00 00   jmp 8048521 <main+0x104> 
804849b: 83 44 24 18 01   addl $0x1,0x18(%esp) 
80484a0: 8b 44 24 18    mov 0x18(%esp),%eax 
80484a4: 89 44 24 04    mov %eax,0x4(%esp) 
80484a8: c7 04 24 f6 85 04 08 movl $0x80485f6,(%esp) 
80484af: e8 3c fe ff ff   call 80482f0 <[email protected]> 
80484b4: eb 6b     jmp 8048521 <main+0x104> 
80484b6: 83 44 24 18 01   addl $0x1,0x18(%esp) 
80484bb: 8b 44 24 18    mov 0x18(%esp),%eax 
80484bf: 89 44 24 04    mov %eax,0x4(%esp) 
80484c3: c7 04 24 f6 85 04 08 movl $0x80485f6,(%esp) 
80484ca: e8 21 fe ff ff   call 80482f0 <[email protected]> 
80484cf: eb 50     jmp 8048521 <main+0x104> 
80484d1: 83 44 24 18 01   addl $0x1,0x18(%esp) 
80484d6: 8b 44 24 18    mov 0x18(%esp),%eax 
80484da: 89 44 24 04    mov %eax,0x4(%esp) 
80484de: c7 04 24 f6 85 04 08 movl $0x80485f6,(%esp) 
80484e5: e8 06 fe ff ff   call 80482f0 <[email protected]> 
80484ea: eb 35     jmp 8048521 <main+0x104> 
80484ec: 83 44 24 18 01   addl $0x1,0x18(%esp) 
80484f1: 8b 44 24 18    mov 0x18(%esp),%eax 
80484f5: 89 44 24 04    mov %eax,0x4(%esp) 
80484f9: c7 04 24 f6 85 04 08 movl $0x80485f6,(%esp) 
8048500: e8 eb fd ff ff   call 80482f0 <[email protected]> 
8048505: eb 1a     jmp 8048521 <main+0x104> 
8048507: 83 44 24 18 01   addl $0x1,0x18(%esp) 
804850c: 8b 44 24 18    mov 0x18(%esp),%eax 
8048510: 89 44 24 04    mov %eax,0x4(%esp) 
8048514: c7 04 24 f6 85 04 08 movl $0x80485f6,(%esp) 
804851b: e8 d0 fd ff ff   call 80482f0 <[email protected]> 
8048520: 90      nop 
8048521: 8b 44 24 18    mov 0x18(%esp),%eax 
8048525: 89 44 24 0c    mov %eax,0xc(%esp) 
8048529: 8b 44 24 14    mov 0x14(%esp),%eax 
804852d: 89 44 24 08    mov %eax,0x8(%esp) 
8048531: 8b 44 24 10    mov 0x10(%esp),%eax 
8048535: 89 44 24 04    mov %eax,0x4(%esp) 
8048539: c7 04 24 01 86 04 08 movl $0x8048601,(%esp) 
8048540: e8 ab fd ff ff   call 80482f0 <[email protected]> 
8048545: b8 00 00 00 00   mov $0x0,%eax 
804854a: c9      leave 
804854b: c3      ret  
804854c: 66 90     xchg %ax,%ax 
804854e: 66 90     xchg %ax,%ax 

下面是.RODATA部分

Disassembly of section .rodata: 

080485d8 <_fp_hw>: 
80485d8: 03 00     add (%eax),%eax 
    ... 

有人可以讓我知道爲什麼這是這樣的行爲? 預先感謝

+4

你看過什麼在804861c? – harold 2014-09-22 09:12:20

+0

除了@harold的要求外,編譯器不會爲你的代碼生成一個跳轉表。 – usr2564301 2014-09-22 09:25:50

+0

如果您的編譯器具有它,請不要使用反彙編程序,而是直接使用'-S'等選項來生成彙編程序。通常這更具可讀性,因爲它仍然有標籤,而不僅僅是跳轉地址。 – 2014-09-22 10:08:25

回答

1

您的跳轉表位於地址0x804861c。如果您轉儲此地址,我很確定,您會發現0x804845f,0x804847d,0x804849b等值,因爲這些值對應於switch語句的分支地址。 會發生什麼情況是,首先確保i0x1c(%esp))的值介於0和6之間(如果跳過,跳到ja),如果介於兩者之間,則使用其值乘以4(sizeof addresses on您的體系結構)作爲跳轉表中的偏移量(0x804861c(,%eax,4),%eax)。

我不確定你在找什麼或者你想要達到什麼目的,但是@Jens Gustedt指出,如果你想觀察生成的程序集,你應該使用-S開關。

此外,請注意,您的代碼可以很容易地被編譯器優化,例如,只要您使用-O開關,您的程序集可能會縮小到最後一個printf和return語句,因爲可以預測整個代碼執行而無用的部分可以省略。

+0

實際上,通過在*原始*範圍-1..5中加1,代碼確保'i'介於'0'和'6'(@'804844a')之間。 – usr2564301 2014-09-22 12:40:53

+0

@Jongware是的,你是對的。更新了帖子以反映這一點,謝謝! – grasbueschel 2014-09-22 13:54:56

+0

@grasbueschel你能告訴我什麼是傾銷地址0x804861c,我到底需要做什麼?我只想看看帶有switch語句的簡單c程序如何轉換爲跳轉表 – bhakta288 2014-09-22 17:51:06