簡體   English   中英

裸露功能的asm插入

[英]Asm inserion in naked function

我有ubuntu 16.04,x86_64 arch,4.15.0-39通用內核版本。 GCC 8.1.0

我試圖將此功能(從第一篇文章https://groups.google.com/forum/#!topic/comp.lang.c++.moderated/qHDCU73cEFc )從英特爾方言重寫為AT&T。 我沒有成功。

namespace atomic {
  __declspec(naked)
  static void*
  ldptr_acq(void* volatile*) {
    _asm {
      MOV EAX, [ESP + 4]
      MOV EAX, [EAX]
      RET
    }
  }

  __declspec(naked)
  static void*
  stptr_rel(void* volatile*, void* const) {
    _asm {
      MOV ECX, [ESP + 4]
      MOV EAX, [ESP + 8]
      MOV [ECX], EAX
      RET
    }
  }
}

然后,我編寫了一個簡單程序,以獲取相同的指針,並將其傳遞給內部。 我安裝了具有受支持的裸屬性( https://gcc.gnu.org/gcc-8/changes.html “ x86端口現在支持裸函數屬性”)的GCC 8.1,以實現功能。 據我所記得,該屬性告訴編譯器不要創建函數的序言和結尾,並且我可以自己從堆棧中獲取參數並返回它們。 代碼:(不適用於segfault)

#include <cstdio>
#include <cstdlib>

  __attribute__ ((naked))
  int *get_num(int*) {
    __asm__  (
      "movl 4(%esp), %eax\n\t"
      "movl (%eax), %eax\n\t"
      "ret"
    );
  }

int main() {
    int *i =(int*) malloc(sizeof(int));
    *i = 5;

    int *j = get_num(i);
    printf("%d\n", *j);

    free(i);
    return 0;
}

然后我嘗試使用64位寄存器:(不適用於segfault)

__asm__  (
  "movq 4(%rsp), %rax\n\t"
  "movq (%rax), %rax\n\t"
  "ret"
);

而且只有在我從rdi寄存器中取出值后,所有方法才起作用。

__asm__  (
  "movq %rdi, %rax\n\t"
  "ret"
);

為什么我無法通過堆棧寄存器進行傳輸? 我可能弄錯了。 請告訴我我的失敗在哪里?

因為x86-64 System V調用約定與舊的低效i386 System V調用約定不同,所以在寄存器中而不是在堆棧中傳遞args。

如果您要用asm編寫整個函數(例如使用naked函數或獨立的.S文件),則始終必須編寫與調用約定匹配的asm。

GNU C擴展的asm允許您使用操作數來指定asm語句的輸入,並且編譯器將生成指令以實現此目的。 (不過,除非您了解asm以及編譯器如何在啟用優化的情況下將C轉換為asm,否則我不建議您使用它。)


另請注意, movq %rdi, %rax實現long *foo(long*p){return p;}而不return *p 也許您是說mov (%rdi), %rax解引用指針arg?


順便說一句,您絕對不需要,也不應該為此使用內聯匯編。 https://gcc.gnu.org/wiki/DontUseInlineAsm ,請參閱https://stackoverflow.com/tags/inline-assembly/info

在GNU C中,可以將指針轉換為volatile uint64_t* 或者,您可以使用__atomic_load_n (ptr, __ATOMIC_ACQUIRE)基本上從該asm中獲取所有內容,而不會產生函數調用的開銷,也不會在調用位置讓優化器花費任何成本,而使所有被調用問題的寄存器重挫。

您可以在任何對象上使用它們: https : //gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html與C ++ 11不同,您只能在std::atomic<T>上執行原子操作。

暫無
暫無

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

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