關於部落格
職場生活筆記....熱情依然在
  • 51771

    累積人氣

  • 7

    今日人氣

    1

    追蹤人氣

ARM GNU GCC Inline Assembler Part I

常常會在Linux的開發平台上遇到幾一個關鍵字(__asm__)然後在後面接一堆奇怪的符號,
ex:__asm__("add %0,%1":"r"(var):"r"(var1):"%r1","%r2"); 
我第一次看到就被這種奇怪語法嚇到(好像在linux上常被嚇到)!
再講這之前先說明linux上assemblly的語法架構,linux是follow AT&T的語法架構,
這個架構和我之前在X86用MASM寫的組語有點不同,不同點從網路上找到的資料(Google上找'GCC-Inline-Assembly')
大概有以下幾點
1.來源(SOURCE) 目的(Destination) 的編排不同
  INTEL:mov dest,src
  AT$T :mov src,dest
2 暫存器名稱(會多加個 % 在暫存器前方)
  INTEL: eax,ebx
  AT&T : %eax,%ebx
3 直接運算子(會多加個$ 16進制會加0x在前面)
  INTEL: A2h,34d
  AT&T:  $0xA2H, $34
4 運算子大小
  INTEL:會用byte ptr’, ’word ptr’, and ’dword ptr'來做為所要搬運位址的值的大小
  ex:"mov al, byte ptr foo"
  AT&T: 會用'b' 'w'(16bits) 'l'(32bits) 加在op-code尾部 作為要搬運位址的值的大小
  ex:"movb foo,al"
5 搬運記憶體的表現方式
  INTEL 用 '[' ']'來表示
  ex: mov     eax,[ecx]
  AT&T 用 '(' ')'來表示
  ex: movl   (%ecx),%eax

相簿設定
標籤設定
相簿狀態