[英]C/C++ indexed jump into a set of NOPs
我想產生一個時鍾分辨率的延遲,所以我的想法是一個接一個地處理255個NOP,然后跳到最后一個減去所需的延遲。 因此0會跳過最后一個NOP,1會跳過最后一個NOP,255會跳過第一個NOP。
我以前使用過索引函數調用,但是在像這樣的索引gotos上找不到任何東西。 我還考慮過使用switch語句,但這似乎還有其他說明。
任何建議表示感謝。
Nick ODell有一個不錯的解決方案,但是編譯器無法知道您所有的情況都只有一個字節的代碼。 直到匯編器通過后才知道。 因此,無論在每種情況下產生多少代碼,編譯器都必須產生能夠工作的東西,而間接跳轉表確實是實現此目的的唯一方法。
因此,我認為為了獲得“理想的”代碼(每個nop一個字節),您還必須在匯編中編寫跳轉邏輯。
這就是我想出的(對於Linux上的gcc / amd64 / gas)。 在這里,它是可笑的 。
#include <stdlib.h>
#define N 1000
#define xstr(s) str(s)
#define str(s) #s
void delay(unsigned ticks) {
if (ticks <= N) {
asm("movq $1f, %%rax \n"
"addq %0, %%rax \n"
"jmp *%%rax \n"
"1: \n"
".rept " xstr(N) " \n"
"nop \n"
".endr \n"
: : "g" ((unsigned long)(N-ticks)): "ax");
} else {
abort();
}
}
int main(void) {
delay(4);
return 0;
}
請注意,必須使用-no-pie
進行編譯。 如果希望它作為與位置無關的可執行文件工作,則可能需要類似call 2f ; 2f: popq %rax
的技巧call 2f ; 2f: popq %rax
call 2f ; 2f: popq %rax
將絕對程序地址存入寄存器。
當然,總會有一個問題,實際獲取此代碼的開銷是否會破壞您的延遲時間的准確性...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.