ARM cortex-m3 Assembly - 2

收錄於 : 關於Ameba的一百篇

前篇:  Ameba assembly -1 


上回介紹 assembly 在 C 的做法.

其實比較常用的

1. nop  : asm volatile ( "nop");

    這我用過兩個應用 :

    (1) 插一堆 nop 去夾 code 的前後, build 出組語後, 就知道這段 code 編出來的樣子

    (2) 因為 nop 是 1 個 cycle , 搭配 loop 可以做時間上的 delay 計算 (busy loop delay)

    PS: volatile 對編譯器而言代表不要作最佳化,
          否則看到 nop, compiler 想他沒做事就把他去掉了.

2. 寫一大段程式

    e.g.

    asm volatile (
       "mov r0, #0 \n\t"
       "mov r1, #0 \n\t"
    );

    剛看到一段code , 先存一下 : article




網路上的確蠻多資料的. 搜尋到一篇技巧,
http://blog.benoitblanchon.fr/arduino-code-size-and-assembly/


當寫好 assembly 編譯後, 怎麼知道編出來的 code 長怎樣, 做得對不對呢?


這位老兄是在 Arduino Uno 上實驗, Arduino Uno 板子用的是 Atmel AVR CPU.

AVR 的組合語言, 和 Arduino Due (cortex M3) 是不同的. 因為 CPU 的指令集不同.

但 gcc 的操作上是一樣的.


仿照做一次

( 個人是在 Mac 上開 terminal 使用 ,
windows 可能用 cygwin 會有些相關 unix 指令可以使用, 不然的話也可以開 cmd 使用基本命令 )

1. 把編譯訊息開啟 : 在偏好設定的 顯示詳細輸出中, 勾選編譯


2. 看編譯訊息最後一行 :

   

這 toolchain 相對位置, 也有相關的 nm 和 objdump 

往右拉可看到 elf 檔產生位置



3. nm 

    參數 : ( 可以下 -h 或 --help 來看 )

     在原文中是帶參數底下這參數

     --size-sort        Sort symbols by size

  -C, --demangle[=STYLE] Decode low-level symbol names into user-level names
                          The STYLE, if specified, can be `auto' (the default),
                          `gnu', `lucid', `arm', `hp', `edg', `gnu-v3', `java'
                          or `gnat'

      -r, --reverse-sort     Reverse the sense of the sort

     個人習慣不帶參數, 用 default 值, 但最後加一個 | sort . 

     在 Ameba, 裡面有 ROM 和 RAM, 有些程式已經預燒在 ROM 中. 可以節省 RAM 的 size. 

      memory 定址 : ROM 0000 0000 開始 , RAM 是 1000 0000 開始. 



4. objdump 反組譯 

    原文參數使用以下兩個 

    -C, --demangle[=STYLE]         Decode mangled/processed symbol names
                                  The STYLE, if specified, can be `auto', `gnu',
                                  `lucid', `arm', `hp', `edg', `gnu-v3', `java'
                                  or `gnat'

    -d, --disassemble        Display assembler contents of executable sections

    個人習慣用一個 -D 並把結果導向到檔案中

  Users/neojou/Library/Arduino15/Packages/njiot/tools/arm-none-eabi-gcc/5.2.1-2015q4/bin/arm-none-eabi-objdump -D target.axf > target.asm

    這樣再去看檔案就有相關的程式組合語言了





留言

熱門文章