Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 将字节数组读入DWORD数组_Assembly_Masm_Irvine32 - Fatal编程技术网

Assembly 将字节数组读入DWORD数组

Assembly 将字节数组读入DWORD数组,assembly,masm,irvine32,Assembly,Masm,Irvine32,我正在尝试完成一项家庭作业,其中包括在汇编中创建2、4、6、8、10的字节数组,将这些值交换为DWORD类型的数组,显示结果,交换值的顺序,然后在汇编中再次显示。除了从8->32位阵列交换之外,我的每一块都可以工作。以下是我最近的一次尝试: INCLUDE Irvine32.inc .data byteArray BYTE 2, 4, 6, 8, 10 intArray DWORD ? .code main PROC Swap: mov si,OFFSET byteAr

我正在尝试完成一项家庭作业,其中包括在汇编中创建2、4、6、8、10的字节数组,将这些值交换为DWORD类型的数组,显示结果,交换值的顺序,然后在汇编中再次显示。除了从8->32位阵列交换之外,我的每一块都可以工作。以下是我最近的一次尝试:

INCLUDE Irvine32.inc
.data
byteArray BYTE 2, 4, 6, 8, 10
intArray DWORD ?

.code
main PROC
    Swap:
        mov si,OFFSET byteArray     ;si=byteArray
        mov ebx,OFFSET intArray     ;ebx=intArray
        mov ecx,LENGTHOF byteArray  ;since byteArray is the one defined ATM

        swaploop:
            mov eax,[si]
            mov [ebx], eax  
            inc esi
            add ebx, 4
            loop swaploop

DWORD是32位,对吗?字节数组中的数字是8位,对吗?因此,您的intArray最多可以容纳4个数字,但不是您期望的方式。相反,(如果我理解正确的话)是创建一个DWORD数组来保存所有5个数字:

.data
byteArray   BYTE 2, 4, 6, 8, 10

.data?
intArray    DWORD lengthof byteArray dup (?)
这:

可能看起来它保存了您所有的数字,但当您将多个字节移动到
intArray
地址时,它将踩到
intArray

    xor     ecx, ecx                ; index into arrays, 0 on start
    mov     esi, offset byteArray   ; address of byteArray
    mov     edi, offset intArray    ; address of intArray

MoveEm:
    movzx   eax, byte ptr [esi + ecx]   ; move byte from (address) byteArray + ecx into eax, zero extending eax
    mov     dword ptr [edi + 4 * ecx], eax  ; move byte in eax, into (address) intArray + 4 * ecx
    inc     ecx
    cmp     ecx, lengthof byteArray
    jne     MoveEm

DWORD是32位,对吗?字节数组中的数字是8位,对吗?因此,您的intArray最多可以容纳4个数字,但不是您期望的方式。相反,(如果我理解正确的话)是创建一个DWORD数组来保存所有5个数字:

.data
byteArray   BYTE 2, 4, 6, 8, 10

.data?
intArray    DWORD lengthof byteArray dup (?)
这:

可能看起来它保存了您所有的数字,但当您将多个字节移动到
intArray
地址时,它将踩到
intArray

    xor     ecx, ecx                ; index into arrays, 0 on start
    mov     esi, offset byteArray   ; address of byteArray
    mov     edi, offset intArray    ; address of intArray

MoveEm:
    movzx   eax, byte ptr [esi + ecx]   ; move byte from (address) byteArray + ecx into eax, zero extending eax
    mov     dword ptr [edi + 4 * ecx], eax  ; move byte in eax, into (address) intArray + 4 * ecx
    inc     ecx
    cmp     ecx, lengthof byteArray
    jne     MoveEm

DWORD是32位,对吗?字节数组中的数字是8位,对吗?因此,您的intArray最多可以容纳4个数字,但不是您期望的方式。相反,(如果我理解正确的话)是创建一个DWORD数组来保存所有5个数字:

.data
byteArray   BYTE 2, 4, 6, 8, 10

.data?
intArray    DWORD lengthof byteArray dup (?)
这:

可能看起来它保存了您所有的数字,但当您将多个字节移动到
intArray
地址时,它将踩到
intArray

    xor     ecx, ecx                ; index into arrays, 0 on start
    mov     esi, offset byteArray   ; address of byteArray
    mov     edi, offset intArray    ; address of intArray

MoveEm:
    movzx   eax, byte ptr [esi + ecx]   ; move byte from (address) byteArray + ecx into eax, zero extending eax
    mov     dword ptr [edi + 4 * ecx], eax  ; move byte in eax, into (address) intArray + 4 * ecx
    inc     ecx
    cmp     ecx, lengthof byteArray
    jne     MoveEm

DWORD是32位,对吗?字节数组中的数字是8位,对吗?因此,您的intArray最多可以容纳4个数字,但不是您期望的方式。相反,(如果我理解正确的话)是创建一个DWORD数组来保存所有5个数字:

.data
byteArray   BYTE 2, 4, 6, 8, 10

.data?
intArray    DWORD lengthof byteArray dup (?)
这:

可能看起来它保存了您所有的数字,但当您将多个字节移动到
intArray
地址时,它将踩到
intArray

    xor     ecx, ecx                ; index into arrays, 0 on start
    mov     esi, offset byteArray   ; address of byteArray
    mov     edi, offset intArray    ; address of intArray

MoveEm:
    movzx   eax, byte ptr [esi + ecx]   ; move byte from (address) byteArray + ecx into eax, zero extending eax
    mov     dword ptr [edi + 4 * ecx], eax  ; move byte in eax, into (address) intArray + 4 * ecx
    inc     ecx
    cmp     ecx, lengthof byteArray
    jne     MoveEm

为什么
si
而不是
esi
?我最初尝试使用ebx,编译器给了我一个关于索引数组的错误?为什么
si
而不是
esi
?我最初尝试使用ebx,编译器给了我一个关于索引数组的错误?为什么
si
而不是
esi
?我最初尝试过使用ebx时,编译器给了我一个关于索引数组的错误?为什么
si
而不是
esi
?我最初尝试使用ebx时,编译器给了我一个关于索引数组的错误?太棒了,作业指定了以某种方式执行操作。然而,你的回答帮助我让它工作起来,非常感谢。太棒了,作业指定了以某种方式做事。然而,你的回答帮助我让它工作起来,非常感谢。太棒了,作业指定了以某种方式做事。然而,你的回答帮助我让它工作起来,非常感谢。太棒了,作业指定了以某种方式做事。然而,你的回答帮助我使它工作,非常感谢。