2010年3月19日 星期五

ARM Assembler V.S GNU Assembler


ARMGNU Assembler差異到底有多大,只能說非常的大!用過就知道,之前就將GNU 可成功Make的程式丟到ADS(他用的是ARM Assembler,自家開發的嘛)上模擬,看看中斷點、暫存器數值、程式流程。

錯誤居然有309(組合語言部分,C語言倒是沒什麼問題)GoogleADS_Errors_and_WarningsAn Introduction to the GNU AssemblerGNU 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
AREA Word, CODE, READONLY --> .text
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語法,那你就沒這個問題了,但如果你要將程式從GNUARM或是倒過來ARMGNU記得先看看。