Arrays 组件(MASMx86 PC)复制阵列

Arrays 组件(MASMx86 PC)复制阵列,arrays,assembly,x86,masm,Arrays,Assembly,X86,Masm,我正在做一个加密项目,这让我很难堪。我需要对字符串数组应用一系列加密密钥,以确定用于加密消息的密钥。我将代码设置为运行一个循环,该循环应用范围内的所有键,但现在我需要一种方法来“刷新”原始字符串数组。我的解决方案是,对于循环的每次迭代,将原始数组复制到相同大小的新的未填充数组中。为此,我编写了以下过程: CopyBuffer PROC ; Copies the original buffer into a storage variable ; recieves: nothing ; retur

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

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)
    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
我的代码成功地填充了重复的数组。但是,副本的元素与原始数组的相应元素不同

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

看来 您没有使用已创建的循环计数器,而循环只是永远运行,这反过来会覆盖copyBuffer数组。 试试台词

12月ecx jnz L3


而不是循环L3,这应该会有所帮助。

代码似乎是正确的(不管它的样式是否不整洁)。唯一的观察结果是,提供的示例数组只有66个元素,而不是67个,因此第一个字节将被复制两次


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

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

bufferCopy  db 67 dup(0)

to

bufferCopy  BYTE    SIZEOF buffer DUP(0),0
我认为转换为以null结尾的字符串解决了我的一些问题。除此之外,我还让我的CopyBuffer程序按如下方式运行:

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)
    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的调用可能是冗余的。作为免责声明,我想补充一点,我对汇编还不是特别熟悉。这个解决方案(虽然功能正常)绝不是最优的。此外,我的解释充其量只是粗略的

我觉得这个很好。一定还有别的事。您确定您正在调用proc?;)(已弃用)
循环
指令隐式递减ecx(当ecx变为零时不进行分支)。@500 InternalServerError我很想知道,根据谁
循环
已弃用。在英特尔和AMD指令参考中,我找不到任何与
循环
被弃用有关的内容<代码>循环
也被纳入x86-64指令集中。关于
loop
被弃用,你有什么参考资料吗?没有,是我编的;)--不过,说真的,我想我最初是从这本书中得到的,当然,这本书已经有点过时了。当时我自己也验证过,但我还没有在最近的硬件上检查过。我认为这与指令绑定到特定寄存器的事实有关,因此不是RISC风格的指令。哦,说它已被弃用是不准确的——它的速度不如dec/jnz(或者至少以前是这样)。我已经一步一步地运行了整个过程。奇怪的是,在过程的每个步骤中,buffer和bufferCopy的值都显示为0'\0'未分配字符。我确信我的数组声明正确,因为我能够打印它。我还将循环计数器从67改为66。还有其他建议吗?如果在过程调用之前缓冲区已满00h,则有两种变体:1:数据在程序的未初始化数据部分中定义。2:您的程序清除代码中某个位置的数组。不幸的是,我在MASM语法(和链接器的东西)方面不是很强,所以无法提供更多帮助。