Exact和Approximate进行判断:

Secret: R G G
================
Guess1: B R G
Answ1: 1 1
Guess2: R B G
Answ2: 2 0
Guess3: R G G
Answ3: 3 0
 上述的主要问题就是对于 R G G 而言,当我们猜的是
G R R的时候,理论上应该是 exact:0 approx:2

但是我写出的时候发现approx为4,检查发现是G对上面的两个G都approx加1然后R同理

对于上述的实现如果使用C java这样的就是可以简单的判断,当有exact或者approx加一的时候直接跳出,但是要求是用汇编来写,我就直接全部列出来了,然后。。。。。:

就发现了有十几种loop需要写。。。。然后后来参考别人的方法,发现了一个非常好的方法:即当判断完后如果exact加一或者approx加一的话就把这数变为0然后再去和下面的比较。这个用汇编便会很容易实现:

 

.global matches_
matches_:			@ Input: R0, R1 ... ptr to int arrays to match ; Output: R0 ... exact matches (10s) and approx matches (1s) of base COLORS
	push {lr}
	LDR R2, [R0, #0]
	LDR R3, [R0, #4]
	LDR R4, [R0, #8]
	LDR R5, [R1, #0]
	LDR R6, [R1, #4]
	LDR R7, [R1, #8]
	MOV R0, #0 @ exact
	MOV R1, #0 @ appro
    B cp11
cp11: 
    CMP R2, R5
	BNE cp22
	ADD R0, #1
	MOV R5, #0
	MOV R2, #-1
cp22: 
    CMP R3, R6
	BNE cp33
	ADD R0, #1
	MOV R6, #0
	MOV R3, #-1
cp33: 
    CMP R4, R7
	BNE cp12
	ADD R0, #1
	MOV R7, #0
	MOV R4, #-1
cp12:
    CMP R2, R6
	BNE cp13
	ADD R1, #1
	MOV R6, #0
	MOV R2, #-1
cp13: 
    CMP R2, R7
	BNE cp21
	ADD R1, #1
	MOV R7, #0
	MOV R2, #-1
cp21: 
    CMP R3, R5
	BNE cp23
	ADD R1, #1
	MOV R5, #0
	MOV R3, #-1
cp23: 
    CMP R3, R7
	BNE cp31
	ADD R1, #1
	MOV R7, #0
	MOV R3, #-1
cp31: 
    CMP R4, R5
	BNE cp32
	ADD R1, #1
	MOV R5, #0
	MOV R4, #-1
cp32: 
    CMP R4, R6
	BNE final
	ADD R1, #1
	MOV R6, #0
	MOV R4, #-1
final:
	MOV R2, #10
	MOV R3, R0
	MUL R0, R3, R2
	ADD R0, R1
	pop {lr}
	bx lr

 做完后确实感觉到这个方法的便利性,同时也算是用了subrouting 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值