ARM_CODE 发表于 2011-1-19 14:49:18

最近学习ARM 汇编,写了一个C调用汇编函数的例子。

AREAAsmTest,   CODE,   READONLY
                PRESERVE8
;void ArraryArrange(char * buf, unsigned long length);
;R0 传递buf、R1传递 length。
                EXPORT   ArraryArrange    ;在这里声明一个可全局引用的标号也就是该函数的名称
ArraryArrange                  ;必须顶格写,下面的就是实现其功能的具体方法啦
                STMFD   R13!, {R1-R7, LR}
                MOV   R4, R0
                ADD   R5, R0, R1
STAR_CMP_ARRARY
                LDRB    R2, , #0x01
                LDRB    R3,
STAR_CMP_BYTE
                CMP   R2, R3
               
                BLS   CMP_NEXT_BYTE
                MOV   R6, R2
                MOV   R2, R3
                MOV   R3, R6

                STRB    R2,
                STRB    R3,
CMP_NEXT_BYTE       
      MOV   R2, R3       
          LDRB    R3, !
                CMP   R4, R5
                BLT   STAR_CMP_BYTE
                SUB   R5, R5, #0x01
           MOV   R4, R0

                CMP   R0, R5
                BLT                STAR_CMP_ARRARY
                LDMFD   R13!, {R1-R7, LR}
                BX      LR ; == MOV   PC, LR

;unsigned long ArithmeticSum(char *buf, unsigned long length);
                EXPORT    ArithmeticSum
ArithmeticSum
                STMFD   R13!, {R1-R7, LR};== STMDBR13!, {R1-R7, LR}
      ADD   R0, R0, #0x01
                SUB   R2, R1, #0x02
                ADD   R2, R0
                MOV   R4, #0x00
                MOV   R3, #0x00
SUM_ADD
                LDRB    R4, , #1
                ADD         R3, R4
                CMP   R0, R2
                BLT   SUM_ADD

                MOV   R0, R3
                LDMFD   R13!, {R1-R7, LR} ;== LDMIAR13!, {R1-R7, LR}
      BX      LR;        等同于 MOV   PC, LR; 但BX指令在返回的同时自动从THUMB状态切换回ARM状态          
                END



void ArraryArrange(char * buf, unsigned long length);
unsigned long ArithmeticSum(char *buf, unsigned long length);

//求算均,但ARM没除法指令。所以只好分成两步写。
char ArithmetAverage(char *buf, unsigned long length)
{
        unsigned long sum;

        //ArithmeticSum函数需要增加入栈、出栈
        sum = ArithmeticSum(buf, length);
        sum = sum / (length-2);
        return (char)sum;
}


char DataBuf =
{
        100,
        99,
        70,
        50,
        200,
        40,
        50,
        73,
        74,
        12
};

int main(void)
{
    char Aver = 0;
    while(1)
        {
          ArraryArrange(DataBuf, 10);
                Aver = ArithmetAverage(DataBuf, 10);
        }

}

kangear 发表于 2013-1-25 15:51:01

学习,学习
页: [1]
查看完整版本: 最近学习ARM 汇编,写了一个C调用汇编函数的例子。