先决条件–
查找在数组中一次出现的元素, 其中每个其他元素出现两次
问题–
给定11个数字, 编写汇编语言程序以查找出现一次的元素, 其中5个数字出现两次, 一个元素出现一次。
例子:
Input : [01H, 02H, 09H, 01H, 01H, 02H, 0AH, 01H, 09H, 03H, 03H]
Output : 0AH
Every number appears even number of times, except 0AH which appears only once.
算法:
使用XOR。
所有元素的XOR将给出一次出现的数字。这是因为数字本身与XOR为0, 数字本身与XOR为XOR。
^ => XOR
res = 01H ^ 02H ^ 09H ^ 01H ^ 01H ^ 02H ^ 0AH ^ 01H ^ 09H ^ 03H ^ 03H
Since XOR is associative and commutative :
res = 0AH ^ (01H ^ 01H) ^ (01H ^ 01H) ^ (02H ^ 02H) ^ (03H ^ 03H) ^ (09H ^ 09H)
= 0AH ^ 0 ^ 0 ^ 0 ^ 0 ^ 0
= 0AH ^ 0
= 0AH
步骤如下:
- 将第一个数字的地址加载到HL寄存器对中
- 用0BH初始化寄存器C, 因为我们必须遍历11个元素。它充当柜台
- 用0初始化累加器
- 用累加器对HL寄存器中存储的地址中存在的值进行XOR, 然后递增HL寄存器中的地址
- 对其余10个元素重复步骤4
- 将累加器的值存储在201DH中(任意)
201DH包含答案。
地址 | 标签 | 助记 |
---|---|---|
2000H | LXI H, 2012H | |
2001H | ||
2002H | ||
2003H | MVI A, 00H | |
2004H | ||
2005H | MVI C, 0BH | |
2006H | ||
2007H | 循环 | MOV B, M |
2008H | XRA B | |
2009H | INX H | |
200AH | DCR C | |
200BH | JNZ LOOP | |
200CH | ||
200DH | ||
200EH | STA 201DH | |
200FH | ||
2010H | ||
2011H | HLT |