汇编小试--十安辰

汇编小试

1、 用ARM汇编语言实现以下C程序段的功能。

(1)y=a×(b+c)

	   	THUMB ; 表示接下来的代码为 THUMB 指令集
		PRESERVE8 ; 表示接下来的代码保持 8 字节栈对齐
		AREA Init1, CODE, READONLY ; 声明代码段
		ENTRY 
       	CODE32
START  	MOV R0, #9       		;加载a到R0
       	MOV R1, #1            	;加载b到R1 
       	MOV R2, #1				;加载c到R2 
       	ADD R1,R2				;b与c相加结果保存到R1中
       	MUL R0,R1				;结果a*(b+c)的结果保存到R0中
       	END 

​ (2)if(x<3)

y=3×x+66;

else if(x<100)

y=100×x+88;

else

y=0;

	   	THUMB ; 表示接下来的代码为 THUMB 指令集
		PRESERVE8 ; 表示接下来的代码保持 8 字节栈对齐
		AREA Init2, CODE, READONLY ; 声明代码段
		ENTRY 
       	CODE32
       	
	  	CMP R0, #3               ;与 3 比较
       	BLT COND1                ;则跳转到 COND1 处理
       	CMP R0, #100
       	BLT COND2                ;大于3但是小于100 则跳转到 COND1 处理
       	MOV	R0, #0				;都不是,则把R0赋值为0
       	B FINISH             	 ;跳转到结束
       	
COND1  	MUL R0, #3				;R0=R0*3,小于3 
       	ADD	R0, #66				;R0=R0+66
       	B FINISH             	 ;跳转到结束
       	
COND2   MUL R0, #100			;大于3但是小于100,R0=R0*100
       	ADD	R0, #88				;R0=R0+88

FINISH 	END 

​ (3) for(i=0;i<10;i++)

x[i]=a[i]+b[i]

	   AREA BlockData,DATA,READWRITE    ;定义数据段
DATA1  DCD 2,5,0,3,-4,5,0,10,9,5          ;数组 DATA1
DATA2  DCD 3,5,4,-2,0,8,3,-10,5,6         ;数组 DATA2
SUM    DCD 0,0,0,0,0,0,0,0,0,0            ;数组 SUM

       AREA Init3,CODE,READONLY        ;定义代码段
       ENTRY      
       CODE32
START  LDR R1,=DATA1            ;数组 DATA1 的首地址存入到 R1
       LDR R2,=DATA2            ;数组 DATA2 的首地址存入到 R2
       LDR R3,=SUM              ;数组 SUM 的首地址存入到 R3
       MOV R0,#0                ;计数器 R0 的初始值置 0
LOOP   LDR R4,[R1],#04          ;取 DATA1 数组的一个数 , 同时修改地址指针
       LDR R5,[R2],#04          ;取 DATA1 数组的一个数 , 同时修改地址指针
       ADDS R4,R4,R5            ;相加并影响标志位
       ADD R0,R0,#1             ;计数器加 1
       STR R4,[R3],#04          ;保存结果到 SUM 中 , 同时修改地址指针
       BNE LOOP                 ;若相加的结果不为 0 则循环
       END 

2、编写C语言函数int fact(int N),求N的阶乘,要求用for循环来完成。

(1)将函数中的乘法部分,用嵌入汇编来实现。

嵌入汇编部分

__asm int  multi(int X1, int X2)
{
	MUL	R0, R0, R1	//R0 = X1*X2
    BX	LR			//返回结果保存在R0中
}

函数fact调用multi做乘法

int fact(int N)
{
int i ;
int sum = 0;
for(i=1;i<=N;i++)
{
    sum = multi(sum, i); 
}	
return sum;
}

​ (2)将函数中的乘法部分,用内联汇编来实现。

int fact(int N)
{
int i ;
int sum = 0;
for(i=1;i<=N;i++)
{
    __asm{
        MUL sum, sum, i	  //sum = sum * i
    }
}	
return sum;
}

所有文章首发平台是微信公众号-极客印记,同步发布到CSDN,简书,掘金等平台博客–十安辰,喜欢的话,记得微信扫码关注我哦
汇编小试--十安辰_第1张图片

你可能感兴趣的:(北邮专业课)