本文共 3263 字,大约阅读时间需要 10 分钟。
#includeint main(void){ //(1-(1+2))*(1+2) int out = 0; __asm__ __volatile__( "nop\n\t" //nop延时指令 \n\t 换行 "mov r0,#1\n\t" "mov r1,#2\n\t" "add %[out],r0,r1\n\t"//out = 1+2=3 "sub r1,r0,%[out]\n\t"//r1 = r0-out=1-3=-2 "mul %[out],r1,%[out]\n\t"//out = r1*out=-6 "nop\n\t" :[out]"=&r"(out) //输出操作数列表 可读 : //输入操作数列表 :"r0","r1" //破坏操作数列表 保护寄存器值不被修改 /* = 只写操作 用于输出 + 读写操作 必须是输出操作 & 只用做输出的寄存器(表示与输入寄存器不能用同一个寄存器) */ ); printf("out = %d\n",out); return 0;}
调试结果:
root@ubuntu12:/ARM/instructions#arm-linux-gcc add_sub_mul.c -o add_sub_mul
root@ubuntu12:/ARM/instructions#cp add_sub_mul /nfsroot/
[root@ARM_Exynos4412/mnt]# ./add_sub_mul
out= -6
#includeint main(void){ int and, orr, bic, eor; unsigned int var = 0; printf("give a hex num:"); scanf("%x", &var); __asm__ __volatile__( "nop\n\t" "and %[and], %[var], #(~0xf)\n\t" //& "orr %[orr], %[var], #(0xf << 28)\n\t"//| "bic %[bic], %[var], #0xf\n\t" // &= ~ "eor %[eor], %[var], #0x11\n\t"//按位异或 "nop\n\t" :[and]"=&r"(and),[orr]"=&r"(orr), [bic]"=&r"(bic),[eor]"=&r"(eor) :[var]"r"(var) ); printf("var = %#x\n", var); printf("and: add = %#x & 0xfffff0 = %#x\n", var,and); printf("orr: orr = %#x | 0xf00000 = %#x\n", var,orr); printf("bic: bic = %#x &= ~0xf) = %#x\n",var,bic); printf("eor = %#x\n", eor); return 0;}
调试结果:
root@ubuntu12:/ARM/instructions# arm-linux-gcclogic.c
root@ubuntu12:/ARM/instructions#cp logic.c /nfsroot/
[root@ARM_Exynos4412 /mnt]# ./logic
givea hex num:0xff
var= 0xff
and:add = 0xff & 0xfffff0 = 0xf0
orr:orr = 0xff | 0xf00000 = 0xf00000ff
bic:bic = 0xff &= ~0xf) = 0xf0
eor= 0xee
#includeint main(void){ int lsl, lsr, asr, ror; __asm__ __volatile__( "nop\n\t" "mov r0,#0x96\n\t" "lsl %[lsl], r0,#4\n\t" "lsr %[lsr], %[lsl],#4\n\t" "ror %[ror], r0, #4\n\t"//循环右移 "mov r0, #-2\n\t" "asr %[asr], r0, #9\n\t"//算术右移 :[lsl]"=&r"(lsl),[lsr]"=&r"(lsr),[asr]"=&r"(asr),[ror]"=&r"(ror) ); printf("lsl << 4 = %#x\n", lsl); //0x960 printf("%#x >> 4 = %#x\n", lsl, lsr);//0x96 printf("0x96 ror 4 = %#x\n", ror); //0x6000009 printf("%#x asr 4 = %#x\n", -2, asr); return 0;}
调试结果:
root@ubuntu12:/ARM/instructions# arm-linux-gcc shift.c -o shift
root@ubuntu12:/ARM/instructions#cp shift /nfsroot/
[root@ARM_Exynos4412/mnt]# ./shift
lsl<< 4 = 0x960
0x960>> 4 = 0x96
0x96ror 4 = 0x60000009
0xfffffffeasr 4 = 0xffffffff
#include#if 0char *strcpy(char *dst,const char *src){ char *ret = dst; while(*src != '\0') { *dst = *src; src++; dst++; } *dst = '\0'; return ret;}#endifchar *strcpy(char *dst,const char *src){ __asm__ __volatile__( "nop\n\t" "mov r0,%[dst]\n\t" "mov r1,%[src]\n\t" "while:\n\t" "ldrb r2,[r1],#1\n\t" "cmp r2,#0\n\t" "beq end\n\t" "strb r2,[r0],#1\n\t" "b while\n\t" "end:\n\t" "mov r3,#0\n\t" "strb r3,[r0]\n\t" :[dst]"+&r"(dst) :[src]"r"(src) :"r0","r1","r2","r3" ); return dst;}int main(void){ char buf[] = "hello"; char buf2[10] = {0}; printf("strcpy:%s\n",strcpy(buf2,buf)); return 0;}
调试结果:
root@ubuntu12:/ARM/instructions# arm-linux-gcc strcpy.c -ostrcpy
root@ubuntu12:/ARM/instructions#cp strcpy /nfsroot/
[root@ARM_Exynos4412 /mnt]#./strcpy
strcpy:hello
转载地址:http://grlpi.baihongyu.com/