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