ARM汇编程序中学ARM程序的结构和混合编程

来源:互联网 发布:开淘宝怎么上传照片 编辑:程序博客网 时间:2024/05/01 18:04

一:ARM汇编程序的结构

例一:

AREAExample,CODE,READONLY; 声明代码段Example ENTRY; 标识程序入口CODE32; 声明32位ARM指令STARTMOVR0,#1MOVR0,#0END;标明程序结束
例二:
COUNTEQU0x30003100; 定义一个变量,地址为0x30003100AREAExample,CODE,READONLY; 声明代码段Example ENTRY; 标识程序入口CODE32; 声明32位ARM指令STARTLDRR1,=COUNT; R1 <= COUNTMOVR0,#0; R0 <= 0 STRR0,[R1]; [R1] <= R0,即设置COUNT为0LOOP   LDRR1,=COUNTLDRR0,[R1]; R0 <= [R1] ADDR0,R0,#1; R0 <= R0 + 1STRR0,[R1]; [R1] <= R0,即保存COUNTBLOOPEND
二:C和ARM汇编的混合编程:

例一:在C语言中混合汇编

#include <stdio.h>void my_strcpy(const char *src, char *dest){char ch;asm{loop:   ldrb ch, [src], #1   strb ch, [dest], #1   cmp ch, #0   bne loop}}int main(){char *a = "forget it and move on!";char b[64];my_strcpy(a, b);printf("original: %s", a);printf("copyed: %s",b);return 0;}

例二:在C语言或汇编中调用对方的变量:

AREA asmfile, CODE, READONLYEXPORT asmDoubleIMPORT gVar_1asmDoubleldr r0, =gVar_1ldr r1, [r0]mov r2, #2mul r3, r1, r2str r3, [r0]mov pc, lrEND

#include <stdio.h>int gVar_1 = 12;extern asmDouble(void);int main(){printf("original value of gVar_1 is: %d", gVar_1);asmDouble();printf(" modified value of gVar_1 is: %d", gVar_1);return 0;}

例三:在C语言中调用汇编语言的函数:

AREA asmfile, CODE, READONLYEXPORT asm_strcpyasm_strcpyloop:ldrb r4, [r0], #1cmp r4, #0beq overstrb r4, [r1], #1b loopover:mov pc, lrEND

#include <stdio.h>extern void asm_strcpy(const char *src, char *dest);int main(){    const char *s = "seasons in the sun";char d[32];asm_strcpy(s, d);printf("source: %s", s);printf("destination: %s",d);return 0;}

例四:在汇编语言中调用C语言函数:(略)



0 0