2013-04-04 42 views
0

我正在研究一個讓我難倒的加密項目。我需要將一系列加密密鑰應用於字符串數組,以確定哪個密鑰用於加密消息。我將代碼設置爲運行循環,該循環應用範圍內的所有鍵,但是現在我需要一種「刷新」原始字符串數組的方法。我的解決方案是將原始數組複製到相同大小的新的未填充數組中,用於循環的每次迭代。我寫的以下過程來實現:組裝(MASMx86 PC)複製陣列

CopyBuffer PROC 

; Copies the original buffer into a storage variable 
; recieves: nothing 
; returns: nothing 
    pushad 
    mov ecx,67    ; loop counter 
    mov esi,0 
L3: 
    mov dl,buffer[esi] 
    mov bufferCopy[esi],dl  ; Store byte in array copy 
    inc esi    ; point to the next byte 
    loop L3 
    popad 
    ret 
CopyArray ENDP 

在上面的代碼中提到的陣列,聲明如下:

buffer  BYTE 0e9h,0c8h,0d0h,087h,0ceh,0d4h,087h,0d3h,0cfh,0c2h,087h,0d3h,0ceh,0cah,0c2h,087h 
      BYTE 0c1h,0c8h,0d5h,087h,0c6h,0cbh,0cbh,087h,0c0h,0c8h,0c8h,0c3h,087h,0cah,0c2h,0c9h 
      BYTE 087h,0d3h,0c8h,087h,0c4h,0c8h,0cah,0c2h,087h,0d3h,0c8h,087h,0d3h,0cfh,0c2h,087h 
      BYTE 0c6h,0ceh,0c3h,087h,0c8h,0c1h,087h,0d3h,0cfh,0c2h,0ceh,0d5h,087h,0d7h,0c6h,0d5h 
      BYTE 0d3h,0deh 
bufferCopy db 67 dup(0) 

我的代碼成功地填充重複陣列。但是,副本的元素與原始數組的相應元素不同。

我真的很感謝這個更高級的彙編程序員的智慧!我對這門語言相當陌生,語法上仍然有些模糊。

+0

這對我來說看起來非常好。必須有其他事情正在進行。你確定你在調用proc? ;) – 2013-04-04 18:51:10

回答

0

好吧,它似乎 你沒有使用你創建的循環計數器,你的循環只是永遠運行,這反過來會覆蓋你的copyBuffer數組。 嘗試線

月ECX JNZ L3

instedof循環L3,應該幫助。

+1

(不建議使用)'loop'指令隱式遞減ecx(並且當它變爲零時不會分支)。 – 2013-04-04 18:56:18

+0

@ 500-InternalServerError我很想知道根據哪個'loop'被棄用。在英特爾和AMD指令參考文獻中,我無法找到與「loop」有關的任何內容。 'loop'也被帶入x86-64指令集。你有'循環'被棄用的一些參考? – nrz 2013-04-05 00:11:34

+0

不,我做到了;) - 儘管如此,我認爲我最初是從[Rick Booth的Inner Loops]得到的(http://books.google.com/books/about/Inner_Loops.html?id=v2pnQgAACAAJ )這本書已經變得有些老了。我當時也親自驗證了它,但是我沒有在最近的硬件上檢查過它。我認爲這與指令綁定到特定寄存器並且因此不是RISC型指令有關。噢,說它已經被棄用是不準確的 - 它只是沒有dec/jnz那麼快(或者至少它以前是這樣的)。 – 2013-04-05 00:28:46

0

該代碼似乎是正確的(不管其凌亂的風格)。唯一的觀察是提供的樣本數組只有66個元素,而不是67,因此第一個字節將被複制兩次。

問題在別的地方。嘗試在調試器中運行程序,並在程序返回後立即檢查數組,以證明其正確性。

+0

我已經貫穿整個proc一步一步。奇怪的是,在過程的每個步驟中,buffer和bufferCopy的值都顯示爲0'\ 0'未分配字符。我相信我的數組是正確的,因爲我可以打印它。另外我把循環計數器從67改爲66.還有什麼建議嗎? – 2013-04-05 16:47:33

+0

如果** buffer **在過程調用之前已滿00h,則有兩種變體:1:數據在程序的未初始化數據部分中定義。 2:你的程序清除代碼中的某個地方的數組。不幸的是,我在MASM語法(和鏈接器的東西)方面不夠強大,所以不能提供更多的幫助。 – johnfound 2013-04-05 18:01:37

0

好的,首先感謝大家的建議!我已經解決了這個問題(儘管可能不是以最簡單的方式)。首先,我從

bufferCopy db 67 dup(0) 

to 

bufferCopy BYTE SIZEOF buffer DUP(0),0 

改變bufferCopy的聲明我認爲轉換爲空結束的字符串,解決了我的一些問題。除此之外,我還ammended我CopyBuffer PROC運行如下:

pushad     
    mov edx,OFFSET buffer    
    Call StrLength     
    mov bufSize,eax      

    mov ecx,bufSize    
    mov esi,0 
L2: 
    mov  al,buffer[esi]    
    mov  bufferCopy[esi],al  
    inc  esi     
    loop L2 
    popad 
    ret 

到StrLength調用可能是一個冗餘,考慮我知道開始與字符串的長度。作爲一個免責聲明,我想補充一點,我還不是特別熟悉彙編。這個解決方案(雖然功能)絕不是最佳的。此外,我的解釋充其量是粗略的。