首页 ARM内嵌汇编

ARM内嵌汇编

举报
开通vip

ARM内嵌汇编 说明:所有的文件必须使用 arm-linux-gcc编译,在开发板上运行, Makefile文件内容为:CC=arm-linux-gcc 01in_out.c #include int main(int argc, char **argv) { int in = 100; int out; __asm__ __volatile__( "mov r0, %1\n" "mov %0, r0\n" :"=r"(out) :"r"(in) :"r0" ); printf("out = %d\n", out);...

ARM内嵌汇编
说明:所有的文件必须使用 arm-linux-gcc编译,在开发板上运行, Makefile文件 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 为:CC=arm-linux-gcc 01in_out.c #include int main(int argc, char **argv) { int in = 100; int out; __asm__ __volatile__( "mov r0, %1\n" "mov %0, r0\n" :"=r"(out) :"r"(in) :"r0" ); printf("out = %d\n", out); return 0; } 02in_out.c #include int main(int argc, char **argv) { int in = 100; int out; __asm__ __volatile__( "mov r0, %[in]\n" //in作为标号使用,不再用%n表示 "mov %[out], r0\n" :[out]"=r"(out) :[in]"r"(in) :"r0" ); printf("out = %d\n", out); return 0; } 03in_out.c #include int main(int argc, char **argv) { int in_out = 30; int in = 100; int out; __asm__ __volatile__( "mov r0, %1\n" "mov %0, r0\n" "mov r0, %2\n" "mov %1, r0\n" :"=&r"(out), "+r"(in_out) //有和没有&大不相同 :"r"(in) :"r0" ); printf("out = %d\n", out); printf("in_out = %d\n", in_out); return 0; } 04in_out.c #include int main(int argc, char **argv) { int in1 = 100, in2 = 200, in3 = 10; int out1, out2, out3; __asm__ __volatile__( "mov r0, %3\n" "mov r1, %4\n" "mov r2, %5\n" "mov %0, r0\n" "mov %1, r1\n" "mov %2, r2\n" :"=&r"(out1), "=&r"(out2), "=&r"(out3) :"r"(in1), "r"(in2), "r"(in3) :"r0" ); return 0; } 05add.c #include int main(int argc, char **argv) { int out; #if 0 __asm__ __volatile__( "mov r0, #20\n" "mov r1, #30\n" //"add r0, r1\n" "add r0, r0, r1\n" "mov %0, r0\n" :"=r"(out) : :"r0" ); #endif int out1; __asm__ __volatile__( "mov r0, #1\n" "mvn r1, #0\n" //取反放到 r1 "add r0, r0, r1\n" "mov %0, r0\n" "mov r0, #2\n" "mov r1, #3\n" "adc r0, r0, r1\n" //r0为 6,上边进位了 "mov %1, r0\n" :"=&r"(out), "=&r"(out1) : :"r0", "r1" ); printf("out = %d\n", out); printf("out1 = %d\n", out1); return 0; } 06sub.c #include int main(int argc, char **argv) { int out; #if 0 __asm__ __volatile__( "mov r0, #20\n" "mov r1, #5\n" "sub r0, r0, r1\n" "mov %0, r0\n" :"=r"(out) : :"r0" ); #endif int out1; __asm__ __volatile__( "mov r0, #0\n" "mov r1, #1\n" "subs r0, r0, r1\n" //指令加 S会影响 CPSR "mov %0, r0\n" "mov r0, #10\n" "mov r1, #5\n" "sbc r0, r0, r1\n" "mov %1, r0\n" :"=&r"(out), "=&r"(out1) : :"r0", "r1" ); printf("out = %x\n", out); printf("out1 = %d\n", out1); return 0; } 07mul.c #include int main(int argc, char **argv) { int out; __asm__ __volatile__( "mov r0, #10\n" "mov r1, #20\n" "mul r2, r1, r0\n" "mov %0, r2\n" :"=r"(out) : :"r0" ); printf("out = %d\n", out); return 0; } 08cmp.c //lt,gt,eq可以放在任何的指令之后 #include int main(int argc, char **argv) { int out; __asm__ __volatile__( "mov r0, #30\n" "mov r1, #30\n" "cmp r0, r1\n" "movlt %0, #1\n" "movgt %0, #2\n" "moveq %0, #3\n" :"=r"(out) : :"r0", "r1" ); printf("out = %d\n", out); return 0; } 09sort.c //排序 abc #include int main(int argc, char **argv) { int a = 4, b = 5, c = 6; __asm__ __volatile__( "mov r0, %0\n" "mov r1, %1\n" "mov r2, %2\n" "cmp r0, r1\n" "movlt r3, r0\n" "movlt r0, r1\n" "movlt r1, r3\n" "cmp r0, r2\n" "movlt r3, r0\n" "movlt r0, r2\n" "movlt r2, r3\n" "cmp r1, r2\n" "movlt r3, r1\n" "movlt r1, r2\n" "movlt r2, r3\n" "mov %0, r0\n" "mov %1, r1\n" "mov %2, r2\n" :"+&r"(a), "+&r"(b), "+&r"(c) : :"r0", "r1", "r2", "r3" ); printf("a = %d\n", a); printf("b = %d\n", b); printf("c = %d\n", c); return 0; } 10and.c //位操作,and与,orr或,eor异或,bic位清零 #include int main(int argc, char **argv) { int and, orr, eor, bic; __asm__ __volatile__( "mov r0, #5\n" "mov r1, #6\n" "orr r0, r0, r1\n" "mov %0, r0\n" "and r0, r0, r1\n" "mov %1, r0\n" "eor r0, r0, r1\n" "mov %2, r0\n" "mov r0, #0xff\n" "bic r0, r0, #0x2\n" "mov %3, r0\n" :"=&r"(and), "=&r"(orr), "=&r"(eor), "=&r"(bic) : :"r0", "r1" ); printf("and = %d\n", and); printf("orr = %d\n", orr); printf("eor = %d\n", eor); printf("bic = %x\n", bic); return 0; } 11shift.c //位移动 ror循环右移,arm无循环左移;lsl左移,lsr右移,asr算 数右移 #include int main(int argc, char **argv) { int lsl, lsr, ror, asr, aasr; __asm__ __volatile__( "mov r0, #10\n" "mov %0, r0, lsl #1\n" "mov %1, r0, lsr #1\n" "mov %2, r0, asr #1\n" "mov %3, r0, ror #2\n" "mov r0, #-10\n" "mov %4, r0, asr #1\n" :"=&r"(lsl), "=&r"(lsr), "=&r"(asr), "=&r"(ror), "=&r"(aasr) : :"r0" ); printf("lsl = %d\n", lsl); printf("lsr = %d\n", lsr); printf("asr = %d\n", asr); printf("ror = %x\n", ror); printf("aasr = %d\n", aasr); return 0; } 12mrs.c //操作程序状态寄存器 #include int main(int argc, char **argv) { int cpsr; __asm__ __volatile__( "mrs r0, cpsr\n" "bic r0, r0, #0x80\n" "msr cpsr, r0\n" "mrs r0, cpsr\n" "mov %0, r0\n" "" :"=r"(cpsr) : :"r0" ); printf("cpsr = %x\n", cpsr & 0xff); return 0; } 13ldr.c //从虚拟地址取一个单个的 32位值 #include int main(int argc, char **argv) { #if 0 int out; int out1; __asm__ __volatile__( "data:\n" ".word 0x11, 0x22, 0x33\n" "ldr r0, data\n"//r0 = *data; "mov %0, r0\n" "str r0, %1\n" :"=r"(out) :"m"(out1) :"r0" ); printf("out = %d\n", out); printf("out1 = %d\n", out1); #endif #if 0 int out2; __asm__ __volatile__( "data:\n" ".word 0x11, 0x22, 0x33\n" "ldr r0, =data\n" "ldr %0, [r0]\n" // "add r0, r0, #4\n" // "ldr %1, [r0]\n" "ldr %1, [r0, #4]\n" "ldr %2, [r0, #8]\n" :"=&r"(out), "=&r"(out1), "=&r"(out2) : :"r0" ); printf("out = %d\n", out); printf("out1 = %d\n", out1); printf("out2 = %d\n", out2); #endif #if 0 int out1, out2, out3; __asm__ __volatile__( "data:\n" ".word 0x11, 0x22, 0x33\n" "ldr r0, =data\n" "ldr %0, [r0]\n" "ldr %1, [r0, #4]!\n" //!表示回写 "ldr %2, [r0, #4]!\n" :"=&r"(out1), "=&r"(out2), "=&r"(out3) : :"r0" ); printf("out1 = %d\n", out1); printf("out2 = %d\n", out2); printf("out3 = %d\n", out3); #endif #if 0 int out1, out2, out3; __asm__ __volatile__( "data:\n" ".word 0x11, 0x22, 0x33\n" "ldr r0, =data\n" "ldr %0, [r0], #4\n" "ldr %1, [r0], #4\n" "ldr %2, [r0], #4\n" :"=&r"(out1), "=&r"(out2), "=&r"(out3) : :"r0" ); printf("out1 = %d\n", out1); printf("out2 = %d\n", out2); printf("out3 = %d\n", out3); #endif int arr[5]; int *p = arr; /* ldr r0, [r5], #4 === r0 = *(r5) r5 += 4 str r0, [r5], #4 === *(r5) = r0, r5 += 4 mov r0, %0 read mov %0, r0 write */ __asm__ __volatile__( "mov r0, #1\n" "str r0, [%0], #4\n" "mov r0, #2\n" "str r0, [%0], #4\n" "mov r0, #3\n" "str r0, [%0], #4\n" "mov r0, #4\n" "str r0, [%0], #4\n" "mov r0, #5\n" "str r0, [%0], #4\n" :"+&r"(p) : :"r0" ); int i; for(i = 0; i < 5; i++){ printf("arr[%d] = %d\n", i, arr[i]); } return 0; } 14ldm.c #include int main(int argc, char **argv) { int out1, out2, out3; __asm__ __volatile__( "mov r0, #1\n" "mov r1, #2\n" "mov r2, #3\n" "stmfd sp!, {r0-r2}\n" //压栈 // "function" "ldmfd sp!, {r3-r5}\n" //出栈 "mov %0, r3\n" "mov %1, r4\n" "mov %2, r5\n" :"=&r"(out1), "=&r"(out2), "=&r"(out3) : :"r0", "r1", "r2", "r3", "r4", "r5" ); printf("out1 = %d\n", out1); printf("out2 = %d\n", out2); printf("out3 = %d\n", out3); return 0; } 15b.c //跳转 #include int main(int argc, char **argv) { int out; __asm__ __volatile__( "mov %0, #3\n" "b next\n" "mov %0, #5\n" "next:\n" "mov r0, #10\n" "mov r1, #20\n" // "stmfd sp!, {xx}\n" "bl add\n" //address of next -->lr(r14) + b add // "ldmfd sp!, {xx}\n" "mov %0, r0\n" :"=r"(out) : :"r0" ); printf("out = %d\n", out); return 0; } #if 0 __asm__( "add:\n" "add r0, r0, r1\n" "mov pc, r14\n" // "mov pc, lr\n" ); #endif int add(int a, int b) { return a + b; } 16list.c //3*8byte的 3个链表 #include int main(int argc, char **argv) { int flag;//find flag = 1, or flag = 0 __asm__ __volatile__( "create_list:\n" "sub sp, sp, #24\n" "mov r0, sp\n" "mov r1, #10\n" "str r1, [r0]\n" "add r1, r0, #8\n" "str r1, [r0, #4]\n" "mov r1, #20\n" "str r1, [r0, #8]\n" "add r1, r0, #16\n" "str r1, [r0, #12]\n" "mov r1, #30\n" "str r1, [r0, #16]\n" "mov r1, #0\n" "str r1, [r0, #20]\n" "find_list:\n" "mov r2, #50\n" "again:\n" "ldr r1, [r0]\n" "cmp r2, r1\n" "moveq %0, #1\n" "beq end\n" "ldr r0, [r0, #4]\n" "cmp r0, #0\n" "moveq %0, #0\n" "beq end\n" "b again\n" "end:\n" :"=&r"(flag) : :"r0", "r1", "r2" ); printf("flag = %d\n", flag); return 0; } 17asm.s:汇编码 @表示注释 .align 2 .global main .text main: @printf("Hello asm\n"); stmfd sp!, {r0-r12, lr} @shell跳转到 main,main跳转到 printf,lr为 bl的下一 pc地址,main @到 printf把 shell跳转到 main时候的 lr值覆盖了,如果没有压栈出 @栈,将无法返回到 shell @r0用于传参数 ldr r0, =string bl printf ldmfd sp!, {r0-r12, pc} .data @.data指定数据段,汇编可以,但是内嵌汇编是不可以使用.data的, @armgcc编译的时候已经建立了一个数据段 data1: .word 0x11, 0x22, 0x33 data2: .short 0x11, 0x22, 0x33 data3: .byte 0x11, 0x22, 0x33 string: .asciz "Hello asm\n" .bss .section .abc 18location.c #include int main(int argc, char *argv[]) { /* 位置相关情况有两种: 1》dr xx, =yy ldr zz, [xx] 2》 全局变量 */ __asm__ __volatile__( "data:\n" ".word 0x11, 0x22\n" "ldr r1, data\n" //不相关 // "ldr r0, =data\n" // "ldr r1, [r0]\n" //相关 : : :"r0", "r1" ); return 0; } 19imm.c //立即数的限制 #include int main(int argc, char *argv[]) { /* 1.imm <= 255 2.imm >> 2 * n <=255 */ __asm__ __volatile__( "mov r0, #0xff\n" "mov r1, #0x20\n" "moveq r2, #0xff00\n" : : :"r0", "r1" ); return 0; } Makefile CC=arm-linux-gcc
本文档为【ARM内嵌汇编】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_126966
暂无简介~
格式:pdf
大小:75KB
软件:PDF阅读器
页数:17
分类:生产制造
上传时间:2012-05-22
浏览量:33