ARM汇编实现全排列

C Codes

#include<bits/stdc++.h>
using namespace std;
int a[10];
int b[10];
void dfs(int k){
	if (k>5){
		for (int i=1; i<=5; i++)
			cout<<a[i]<<' ';
		cout<<'\n';
	}
	else{
		for (int i=1; i<=5; i++){
			if (!b[i]){
				b[i]=1; a[k]=i;
				dfs(k+1);
				b[i]=0;
			}
		}
	}
	return;
}
int main(){
	dfs(1);
	return 0;
}

在这里插入图片描述

Assembly Codes

	AREA reset,CODE, READONLY
		CODE32
		ENTRY	
N EQU 5
start
	LDR R0,=0x0000001D ;a
	LDR R1,=0x00000105 ;b
	LDR R2,=0x000001D0  ;val
	LDR R3,=0x00000244  ;i
	MOV R4,#1
	B dfs
dfs
	CMP R4,N ;k
	BGT return
	MOV R5,#1
	B Loop
Loop
	CMP R5,#6 ;for (i=1; i<=5; i++)
	BEQ return ;return
	LDR R6,[R1,R5,LSL #2]
	CMP R6,#0
	ADDNE R5,R5,#1
	;save state
	STREQ R4,[R2,#4]!
	STREQ R5,[R3,#4]!;if (b[i]==0)
	BNE Loop
	; if (!b[i])
	STREQ R5,[R0,R4,LSL #2] ;a[k]=i
	MOVEQ R6,#1 
	STREQ R6,[R1,R5,LSL #2]; b[i]=1;
	ADDEQ R4,R4,#1 ;k=k+1
	BLEQ dfs  ;dfs(k+1)
	MOV R6,#0
	STR R6,[R1,R5,LSL #2] ;b[i]=0
	ADD R5,R5,#1
	CMP R5,#6;
	BEQ return
	BNE Loop
	
return 
	LDR R4,[R2]
	SUB R2,R2,#4
	LDR R5,[R3]
	SUB R3,R3,#4
;	BEQ start
	MOV PC,LR
	 end      

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值