(三)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
- (三)ARM 常用汇编指令(3)之内嵌汇编
- (三)ARM常用汇编指令
- 常用ARM汇编指令
- ARM常用汇编指令
- ARM常用汇编指令
- 常用ARM汇编指令
- ARM常用汇编指令
- ARM常用汇编指令
- ARM常用汇编指令
- ARM常用汇编指令
- ARM常用汇编指令
- ARM常用汇编指令
- 常用ARM汇编指令
- ARM 汇编常用指令
- 常用ARM汇编指令
- ARM常用汇编指令
- 常用ARM汇编指令
- ARM 汇编常用指令
- Android提高第八篇之SQLite分页读取
- Android提高第一篇之MediaPlayer
- Android提高第二篇之SurfaceView(上)
- Android提高第三篇之SurfaceView(下)
- Android提高第四篇之Activity+Intent
- (三)ARM 常用汇编指令(3)之内嵌汇编
- Android提高第五篇之Service
- Android提高第六篇之BroadcastReceiver
- Android提高第七篇之XML解析与生成
- Android提高第十篇之AudioRecord实现"助听器"
- Android提高第十一篇之模拟信号示波器
- Android提高第十二篇之蓝牙传感应用
- Android提高第十三篇之探秘蓝牙隐藏API
- SLAMTEC-思岚科技CSO林凌受邀参上海交大“慧谷”创新创业训练营仪式