簡體   English   中英

C / C ++索引跳轉到一組NOP中

[英]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.

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