我正在尝试完成一项功课,包括在程序集中创建一个2,4,6,8,10的BYTE数组,将这些值交换为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
答案 0 :(得分:3)
DWORD是32位对吗?你的BYTE数组中的数字是8位吗?所以,你的intArray最多可以容纳4个数字但不是你想象的那样。相反,(如果我理解正确的话)是创建一个DWORD数组来保存所有5个数字:
.data
byteArray BYTE 2, 4, 6, 8, 10
.data?
intArray DWORD lengthof byteArray dup (?)
此:
intArray DWORD ?
似乎它包含了您的所有数字,但是当您将多个字节移动到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