所以我的任务是编写一个使用汇编程序的c ++代码,该程序应该是二进制搜索。
以下是c ++调用的结果:
index = AsmBinarySearch(value, numbers, SIZE)
以下是汇编代码的样子:
TITLE AsmBinarySearch Procedure (AsmBinarySearch.asm)
.586
.model flat,C
AsmBinarySearch PROTO, searchValue:DWORD, arrayPTR:PTR DWORD, count:DWORD
.data
.code
AsmBinarySearch PROC USES edi, searchValue:DWORD, arrayPTR:PTR DWORD, count:DWORD
mov eax,arrayPTR
mov ecx,arrayPTR
add ecx,count
@@:
cmp eax,ecx
jg not_found
mov edx,eax
add edx,ecx
shr edx,1
xchg DWORD PTR [edx],eax
cmp eax,searchValue
xchg DWORD PTR [edx],eax
jg search_right
jl search_left
mov eax,edx
sub eax,arrayPTR
ret
search_right:
mov ecx,edx
jmp @B
search_left:
mov eax,edx
jmp @B
not_found:
mov eax,-1
ret
AsmBinarySearch ENDP
END
问题是当从c ++程序调用时,此汇编代码运行无限循环。那么我该如何修复这段代码?
请帮我修完这段代码,这样就完成了预期的工作,因为在这一点上,主要是因为我是初学者,我找不到任何解决方法来解决这个问题。
答案 0 :(得分:1)
一些注释,我认为第一个引起你的核心问题(虽然可能不是唯一的问题):
1)在以下代码中,
mov eax,arrayPTR
mov ecx,arrayPTR
add ecx,count
将计数添加到arrayPTR的地址,而不考虑每个数组元素的大小;你需要将count乘以4以匹配数组的DWORD定义。请注意,这将搜索整个阵列的四分之一,并且数组未排序,这将导致代码随机跳转并以奇怪的方式 - 考虑您是否有01 00 00 00 02 00 00 00,数组的前五个值将被视为1,35554432,131072,512,2 ......
2)你跳转到标签@B,但没有匹配的标签;我认为这是你帖子中的拼写错误,@@实际上是跳转目的地 - 如果没有,你的代码就会跳到它不应该的地方。
3)您尝试保存阵列的左侧,
xchg DWORD PTR [edx],eax
cmp eax,searchValue
xchg DWORD PTR [edx],eax
非常难看,特别是考虑到你现在有ebx免费。请注意,xchg不应该在比较后删除标记,但即使它没有,这也非常慢,而且非常难看。
4)地址计算对于不会溢出的地址有效(这些不应该),但我建议记录这类代码来解释它是如何工作的,特别是对于你发布的代码因为评论表明有些人不了解地址算法。