LC3汇编数组查找程序存在目标元素仍返回未找到问题求助
LC3数组查找程序错误排查
你的程序存在多处逻辑错误,和R2的基地址赋值无关,具体问题如下:
- 返回值赋值错误:需求要求R1返回匹配元素的地址,但原代码使用
LDR R1, R2, #0把R2地址中存储的元素值写入了R1,应该直接把R2本身的值(即元素地址)赋值给R1。 - 匹配成功后未退出循环:匹配到目标值后没有主动跳转到EXIT结束流程,会继续执行后续的指针移动和遍历逻辑,导致匹配结果被覆盖。
- 未匹配时未移动数组指针:原逻辑只有在匹配到元素的时候才会执行
ADD R2, R2, #1移动指针,未匹配时直接跳回LOOP开头,R2永远不会更新,要么出现死循环,要么永远无法遍历到后续元素。 - 指针自增位置错误:数组指针的自增操作应该放在每轮元素比较完成后执行,未匹配时就移动指针进入下一轮遍历,匹配成功时直接退出不需要移动。
修正后的完整代码
; ; Subroutine to search for a value in an array ; Input: ; - R2: the base array address ; - R3: the number of elements in the array ; - R4: the value to look for ; Output: in R1, the address of the found value, or zero if nothing was found .ORIG 0x300 NUM_1: .FILL 0x032 NUM_2: .FILL 0x00A NUM_3: .FILL 0x009 NUM_4: .FILL 0x025 N: .FILL 0x004 SEARCH_VALUE: .FILL 0x032 LEA R2, NUM_1 LD R3, N LD R4, SEARCH_VALUE FIND: AND R1, R1, #0 ; Zero out R1 in case we find nothing ADD R3, R2, R3 ; We turn R3 from the number of elements of the array into ; the address of the word just past the end of the array LOOP: NOT R5, R3 ADD R5, R5, #1 ADD R5, R5, R2 BRZ EXIT ; if (R2==R3), traverse complete LDR R5, R2, #0 NOT R5, R5 ADD R5, R5, #1 ADD R5, R4, R5 BRZ MATCH ; if equal, jump to match logic ADD R2, R2, #1 ; not match, R2++ BR LOOP ; continue loop MATCH: ADD R1, R2, #0 ; assign element address to R1 EXIT: HALT .END
修正说明
- 新增了
MATCH分支专门处理匹配成功的逻辑,匹配到直接跳转到该分支,把R2的地址赋值给R1后结束程序。 - 未匹配时先移动R2指针再进入下一轮循环,保证可以遍历所有数组元素。
- 保留了原有的边界判断逻辑,遍历到数组末尾时直接退出,R1保持初始的0值,符合未找到返回0的要求。
内容的提问来源于stack exchange,提问作者Shark44
相关产品推荐
相关产品推荐

