ARM與GNU Assembler差異到底有多大,只能說非常的大!用過就知道,之前就將GNU 可成功Make的程式丟到ADS(他用的是ARM Assembler,自家開發的嘛)上模擬,看看中斷點、暫存器數值、程式流程。
錯誤居然有309個(組合語言部分,C語言倒是沒什麼問題)Google了ADS_Errors_and_Warnings、An Introduction to the GNU Assembler、GNU ARM Assembler Quick Reference以及網路上各方精華才知道,問題出在哪?還一直以為是環境設置的問題(當然環境設置也很重要,弄不好一樣不能跑!)。
ADS顯示的主要錯誤
1. Error : A1163E: Unknown opcode
組譯器擺明就是看不懂
2. Error : C2470E: function prototype formal '__packed__' needs type or class - 'int' assumed
這個__attribute__((__packed__))是GNU才有的用法 ARM Assembler也是看不懂的,記得Mark(註解)起來
其實真正的錯誤是下面這些(是非常多 XD)
ARM -> GNU
INCLUDE 替換成 .INCLUDE
TCLK2 EQU PB25 替換成 .equ TCLK2, PB25
EXPORT 替換成 .global
IMPORT 替換成 .extern
DCD 替換成 .long
IF :DEF: 替換成 .IFDEF
ELSE 替換成 .ELSE
ENDIF 替換成 .ENDIF
:OR: 替換成 |
:SHL: 替換成 <<
END 替換成 .end
TCLK2 EQU PB25 替換成 .equ TCLK2, PB25
EXPORT 替換成 .global
IMPORT 替換成 .extern
DCD 替換成 .long
IF :DEF: 替換成 .IFDEF
ELSE 替換成 .ELSE
ENDIF 替換成 .ENDIF
:OR: 替換成 |
:SHL: 替換成 <<
END 替換成 .end
AREA Word, CODE, READONLY --> .text
AREA Block, DATA, READWRITE --> .data
CODE32 --> .arm
CODE16 --> .thumb
LTORG --> .ltorg
AREA Block, DATA, READWRITE --> .data
CODE32 --> .arm
CODE16 --> .thumb
LTORG --> .ltorg
For ADS environment
__asm{
rsbs dumy, var2, 0
movmi L_var_out, L_var1, lsl var2
movpl L_var_out, L_var1, asr dumy
}
For GNU environment
__asm__ __volatile__(
" rsbs %0, %3, #0;\n\r"
" movmi %1, %2, lsl %3;\n\r"
" movpl %1, %2, asr %0"
:"=r" (dumy), "=r" (L_var_out)
:"r" (L_var1), "r" (var2)
);
or
asm volatile(
" rsbs %0, %3, #0;\n\r"
" movmi %1, %2, lsl %3;\n\r"
" movpl %1, %2, asr %0"
:"=r" (dumy), "=r" (L_var_out)
:"r" (L_var1), "r" (var2)
);
不知道的人,這部分可能弄個一輩子都不知道問題在哪?明明沒有錯看半天,上面只是主要的部分,其實還有很多想不到的,像是少加了個冒號、程式前面沒空白、有的地方必須是小寫,所有令人意想不到的錯誤都出現了。如果你很習慣GNU GDB(GNU DeBugger) 或是你根本就在Windows上開發一開始就是學ARM Assembler語法,那你就沒這個問題了,但如果你要將程式從GNU轉ARM或是倒過來ARM轉GNU記得先看看。