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

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);   //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 <stdio.h>

#if 0
char *strcpy(char *dst,const char *src)
{
	char *ret = dst;
	while(*src != '\0')
	{
		*dst = *src;
		src++;
		dst++;
	}
	*dst = '\0';
	return ret;
}
#endif
char *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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值