0

我正在做一个让我难过的加密项目。我需要将一系列加密密钥应用于字符串数组,以确定用于加密消息的密钥。我将代码设置为运行一个循环,该循环应用范围内的所有键,但现在我需要一种“刷新”原始字符串数组的方法。我的解决方案是将原始数组复制到一个新的相同大小的未填充数组中,用于循环的每次迭代。我编写了以下过程来完成此操作:

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)

我的代码成功填充了重复数组。但是,副本的元素与原始数组的相应元素不同。

我真的很感谢一位更高级的汇编程序员在这方面的智慧!我对这门语言还很陌生,语法上还是有点模糊。

4

3 回答 3

0

好吧,您似乎没有使用您创建的循环计数器,并且您的循环只是永远运行,这反过来又覆盖了您的 copyBuffer 数组。试试线条

dec ecx jnz L3

instedof loop L3 应该有帮助。

于 2013-04-04T18:54:12.620 回答
0

该代码似乎是正确的(无论其风格如何)。唯一的观察是提供的样本数组只有 66 个元素,而不是 67 个,因此第一个字节将被复制两次。

问题出在其他地方。尝试在调试器中运行程序,并在过程返回后立即检查数组,以证明其正确性。

于 2013-04-04T18:56:28.437 回答
0

好的,首先感谢大家的建议!我已经解决了这个问题(尽管可能不是以最简单的方式)。首先,我将 bufferCopy 的声明从

bufferCopy  db 67 dup(0)

to

bufferCopy  BYTE    SIZEOF buffer DUP(0),0

我认为转换为空终止字符串解决了我的一些问题。除此之外,我还修改了我的 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 的调用可能是多余的。作为免责声明,我想补充一点,我对组装还不是特别熟悉。这个解决方案(虽然是功能性的)绝不是最优的。此外,我的解释充其量只是粗略的。

于 2013-04-12T13:15:06.120 回答