2016-05-09 194 views
-2

所以我一直負責編寫使用匯編程序的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

可憐的@Jester會把他的頭髮拉出 –

+0

@MichaelPetch哈哈,沒錯。我無法完成這項工作,但我不知道問題所在。 –

+0

「我一直負責任」 - 由誰?你能告訴他們去跳嗎? C++標準庫提供了['std :: binary_search'](http://en.cppreference.com/w/cpp/algorithm/binary_search),這比浪費時間更好。 –

回答

1

的幾個注意事項,我認爲首先引起你的核心問題(儘管也許不是唯一的問題):在下面的代碼

1),

mov eax,arrayPTR 
mov ecx,arrayPTR 
add ecx,count 

你加計數到arrayPTR的地址,而不考慮每個數組元素的大小;您需要將計數乘以4來匹配數組的DWORD定義。請注意,這將搜索總陣列的四分之一,並且數組未被排序,這會導致代碼隨機地以奇怪的方式跳轉 - 考慮您是否有01 00 00 00 02 00 00 00,前五個你的數組的值將被視爲1,33554432,131072,512,2,...

2)你跳轉到標籤@B,但沒有匹配的標籤;我認爲這是你的文章中的一個錯字,而@@實際上是跳轉目標 - 如果沒有,你的代碼跳到它不應該的地方。

3)你出手救陣列的左側,

xchg DWORD PTR [edx],eax 
cmp eax,searchValue 
xchg DWORD PTR [edx],eax 

實在是太醜了,尤其是考慮到你在這一點上EBX免費。請注意,在比較之後,xchg不應該丟棄標誌,但即使不這樣做,這也非常慢並且非常難看。

4)地址計算適用於不會溢出的地址(但這些不應該),但我建議記錄這類代碼以解釋如何/爲什麼會起作用,尤其是對於您在SO中發佈的代碼將來,由於評論表明有些不懂地址算術。