博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(三)ARM 常用汇编指令(3)之内嵌汇编
阅读量:4125 次
发布时间:2019-05-25

本文共 3263 字,大约阅读时间需要 10 分钟。

3.5内嵌汇编

示例1 add sub mul

#include 
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 
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 
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); //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

      

示例4 ldr str cmp b

#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/

你可能感兴趣的文章
JAVA八大经典书籍,你看过几本?
查看>>
《读书笔记》—–书单推荐
查看>>
String s1 = new String("abc"); String s2 = ("abc");
查看>>
JAVA数据类型
查看>>
【Python】学习笔记——-6.2、使用第三方模块
查看>>
【Python】学习笔记——-7.0、面向对象编程
查看>>
【Python】学习笔记——-7.2、访问限制
查看>>
【Python】学习笔记——-7.3、继承和多态
查看>>
【Python】学习笔记——-7.5、实例属性和类属性
查看>>
Linux设备模型(总线、设备、驱动程序和类)之四:class_register
查看>>
git中文安装教程
查看>>
虚拟机 CentOS7/RedHat7/OracleLinux7 配置静态IP地址 Ping 物理机和互联网
查看>>
弱类型、强类型、动态类型、静态类型语言的区别是什么?
查看>>
Struts2技术内幕图书 转载
查看>>
Java异常分类
查看>>
项目中的jackson与json-lib使用比较
查看>>
Jackson Tree Model Example
查看>>
j2ee-验证码
查看>>
js-高德地图规划路线
查看>>
常用js收集
查看>>