簡體   English   中英

在C中使用x86樣式的跳轉表

[英]Using x86 style jump table in C

我試圖像這樣在C中做一個跳轉表

    cmp     eax, dword 3                        ;max number
    ja      invalid                     ;default
    jmp     [eax*4+jumptable]           ;jump to handler
invalid:
    retn
jumptable:
    dd handle0, handle1, handle2, handle3
handle0:
    ....

等等

我從這開始

void dohandler(int a, int b, void (*jumptable[4]) (int x))
    if (a > 3) return
    else jumptable[3 * 4](b);
}
int main() {
    void (*jumptable[4]) (int x);
    jumptable[0] = &handler1;
    ... etc

    dohandler(1,2,jumptable);
}
void handler1(int x) { ... }
.. etc

但它運作不好..

jumptable是一個指針數組。 不要嘗試縮放偏移量,只需索引要引用的指針。

void dohandler(int a, int b, void (*jumptable[4]) (int x))
    if (a >= 0 && a < 4)
        jumptable[a](b);
}

不確定,但我認為你有幾個問題:

void dohandler(int a, int b, void (*jumptable[4]) (int x))
    if (a > 3) return
    else jumptable[3 * 4](b);
}

首先,你不使用a在引用您的跳表,而我認為,對應於eax在裝配版本寄存器。 其次,不要將它乘以4.我認為這是指針的大小,數組引用就是為你做的。 所以你最終得到這個:

void dohandler(int a, int b, void (*jumptable[4]) (int x))
    if (a > 3) return
    else jumptable[a](b);
}

只要標簽值不太稀疏, switch就會像你想要的那樣編​​譯成一個跳轉表。 為表達式設置一個小尺寸類型(如unsigned char )或掩蓋高位可能會有所幫助,因此編譯器在跳轉跳轉之前不會添加額外的“if-in-range”條件,但是可能不那么重要。

最重要的是,實驗。 使用gcc -S檢查程序集輸出。

暫無
暫無

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

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