簡體   English   中英

匯編代碼和開關聲明案例

[英]Assembly Code and Switch Statement Cases

在理解如何通過匯編語言確定案例50、52等時,我有些麻煩。

據我了解,跳轉表對應於每種情況下要執行的操作,並且檢查edx> 5表示情況范圍為0到5? 我相信遺漏1是因為它是默認情況,但是為什么遺漏了5?

我覺得應該有一個案例55:結果* =結果,不?

如果有人可以幫助解釋,那就太好了。 謝謝!

 int switch_prob(int x) { int result = x; switch (x) { case 50: case 52: result <<= 2; break; case 53: result >>= 2; break; case 54: result *= 3; break; default: result += 10; } return result; } 

圖3.38顯示了該過程的反匯編的目標代碼。 我們只對第4到16行所示的代碼部分感興趣。我們可以在第4行看到將參數x(相對於%ebp的偏移量為8)加載到寄存器%eax中,與程序變量結果相對應。 第11行的“ lea 0x0(%esi),%esi”指令是插入的nop指令,以使第12行的指令從16的倍數開始的地址開始

跳轉表位於不同的內存區域中。 使用調試器GDB,我們可以使用命令x / 6w 0x8048468檢查從地址0x8048468開始的六個4字節的內存字。 GDB打印以下內容:

 (gdb) x/6w 0x8048468: 0x080483d5 0x080483eb 0x080483d5 0x0x80483e0 0x8048478: 0x080483e5 0x080483e8 (gdb) 

匯編代碼:

 1: 080483c0 <switch_prob>: 2: 80483c0: push %ebp 3: 80483c1: mov %esp,%ebp 4: 80483c3: mov 0x8(%ebp),%eax // X is copied into eax ; eax = x 5: 80483c6: lea 0xffffffce(%eax),%edx // placeholder 6: 80483c9: cmp $0x5, %edx // Compare edx (3rd argument) with 5; Edx - 5 // clearly, edx is x 7: 80483cc: ja 80483eb <switch_prob+0x2b> // if edx - 5 > 0, Jump into line 16 (default) 8: 80483ce: jmp *0x8048468(,%edx,4) // Go into the jump table 9: 80483d5: shl $0x2, %eax // eax << 2 10: 80483d8: jmp 80483ee <switch_prob+0x2e> // Jump to line 17 11: 80483da: lea 0x0(%esi),%esi // esi = esi NOP. Filling in N bytes 12: 80483e0: sar $0x2, %eax // eax >> 2 13: 80483e3: jmp 80483ee <switch_prob+0x2e> // Jump to line 17 14: 80483e5: lea (%eax, %eax, 2), %eax // eax = eax + 2(eax) 15: 80483e8: imul %eax, %eax // eax *= eax 16: 80483eb: add $0xa, %eax // eax += 10 17: 80483ee: mov %ebp, %esp // esp = ebp 18: 80483f0: pop %ebp 19: 80483f1: ret 

程序集與源代碼不匹配。 它匹配更像這樣的東西:

int switch_prob(int x) 
{
    int result = x;
    switch (x)
    {
        case 50:
        case 52:
            result <<= 2;
            break;
        case 53:
            result >>= 2;
            break;
        case 54:
            result *= 3;
            // WARNING: Falls through
        case 55:
            result *= result;
            // WARNING: Falls through
        default:
            result += 10;   
            break;
    }
    return result;
}

這很可能是由人為錯誤引起的(例如,更新問題中的源代碼,使其與去年的學生提出的問題不同,但忘記更新程序集以使其匹配)。

永遠不要假設老師/教授是非人類的...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM