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. 看編譯訊息最後一行 :
前篇: 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
這樣再去看檔案就有相關的程式組合語言了
留言
張貼留言