(三)ARM 常用汇编指令(3)之内嵌汇编

来源:互联网 发布:kindle选购 知乎 编辑:程序博客网 时间:2024/05/26 19:18

3.5内嵌汇编

示例1 add sub mul

#include <stdio.h>int 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


示例2 and orr bic eor

#include <stdio.h>int 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

 

示例3 lsl lsr asr ror

#include <stdio.h>int 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);   //0x960printf("%#x >> 4 = %#x\n", lsl, lsr);//0x96printf("0x96 ror 4 = %#x\n", ror);   //0x6000009printf("%#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

      

示例4 ldr str cmp b

#include <stdio.h>#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

0 0
原创粉丝点击