说明:所有的文件必须使用 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