1.c语言中内嵌汇编语言:
例程:
#include <stdio.h>
int main()
{
int ret = 0;
__asm__ __volatile__(
"mov r0, #12 \n"
" mov %0,r0 \n"
:"=r"(ret) /此冒号表示输出, =表示只写, +号表示可读可写
: :"r0","r1" //此冒号告诉编译器不要分配这些寄存器给%0
)
printf("ret = %d\n",ret);
return 0;
}
2.
#include <stdio.h>
int main(void)
{
int ret = 88, num = 0;
__asm__ __volatile__ (
#if 0
"mov %1, %0 \n"
:"+r"(ret), "=r"(num)
#endif
"mov %0, %1\n"
:"=r"(num)
:"r"(ret) //此冒号表示输入, r是表示在汇编里用寄存器代替相应的c语言变量
);
printf("num = %d\n", num);
return 0;
}
3.
#include <stdio.h>
int main(void)
{
__asm__ __volatile__ (
// "mov r0, #0x000ff00 \n"
"ldr r0, =0x123456 \n"
);
return 0;
}
4.
#include <stdio.h>
int main(void)
{
int ret = 0;
__asm__ __volatile__ (
"ldr r2, = 0x12345678 \n"
"add r5, r2, #0x11 \n"
"mov %0, r5 \n"
:"=r"(ret)
::"r2", "r5"
);
printf("ret = %p\n", ret);
return 0;
}
5.
#include <stdio.h>
int main(void)
{
int num = 0x7788, ret = 0;
__asm__ __volatile__ (
"sub %0, %1, #0x11 \n"
:"=r"(ret)
:"r"(num)
);
printf("ret = %p\n", ret);
return 0;
}
6.
#include <stdio.h>
int main(void)
{
int ret = 0;
__asm__ __volatile__ (
"mov r2, #8 \n"
"mov r3, #9 \n"
"mul r3, r2, r3 \n"
"mov %0, r3 \n"
:"=r"(ret)
::"r2", "r3"
);
printf("ret = %d\n", ret);
return 0;
}
7.
#include <stdio.h>
int main(void)
{
int ret = 0;
__asm__ __volatile__ (
"mov r2, #5 \n"
"cmp r2, #6 \n"
"moveq %0, #99 \n"
"movne %0, #88 \n"
:"=r"(ret)
::"r2"
);
printf("ret = %d\n", ret);
return 0;
}
8.
#include <stdio.h>
int main(void)
{
int ret = 0;
__asm__ __volatile__ (
"movs r0, #1 \n"
"ldreq %0, =0x345 \n"
"ldrne %0, =0x0 \n"
:"=r"(ret)
::"r0"
);
printf("ret = %p\n", ret);
return 0;
}
9.
#include <stdio.h>
int main(void)
{
__asm__ __volatile__ (
"ldr r3, =0x8ffffff \n"
"loop: \n"
#if 0
"sub r3, r3, #1 \n"
"cmp r3, #0 \n"
"bne loop \n"
#endif
"subs r3, r3, #1 \n"
"bne loop \n"
);
printf("after delay \n");
return 0;
}
10.
#include <stdio.h>
int main(void)
{
__asm__ __volatile__ (
"ldr r0, =0xffff \n"
"loop: \n"
"ldr r2, =0xfff \n"
"loop2: \n"
"subs r2, r2, #1 \n"
"bne loop2 \n"
"subs r0, r0, #1 \n"
"bne loop \n"
);
printf("after loop \n");
return 0;
}
11.
#include <stdio.h>
int main(void)
{
unsigned int ret;
__asm__ __volatile__ (
"mrs %0, cpsr \n"
:"=r"(ret)
);
printf("%p\n", ret & 0x1f);
return 0;
}
12.
#include <stdio.h>
int main(void)
{
// lsl lsr
// asl asr
int ret = 0;
__asm__ __volatile__ (
"mov r0, #1 \n"
"mov %0, r0, lsl #2 \n"
:"=r"(ret)
::"r0"
);
printf("ret = %d\n", ret);
return 0;
}
13.
#include <stdio.h>
int main(void)
{
int ret = 0;
__asm__ __volatile__ (
"mov r2, #7 \n"
// "and %0, r2, #12 \n"
"orr %0, r2, #8 \n"
:"=r"(ret)
::"r2"
);
printf("ret = %d\n", ret);
return 0;
}