Assembly 将字节数组读入DWORD数组
我正在尝试完成一项家庭作业,其中包括在汇编中创建2、4、6、8、10的字节数组,将这些值交换为DWORD类型的数组,显示结果,交换值的顺序,然后在汇编中再次显示。除了从8->32位阵列交换之外,我的每一块都可以工作。以下是我最近的一次尝试: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
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时,编译器给了我一个关于索引数组的错误?太棒了,作业指定了以某种方式执行操作。然而,你的回答帮助我让它工作起来,非常感谢。太棒了,作业指定了以某种方式做事。然而,你的回答帮助我让它工作起来,非常感谢。太棒了,作业指定了以某种方式做事。然而,你的回答帮助我让它工作起来,非常感谢。太棒了,作业指定了以某种方式做事。然而,你的回答帮助我使它工作,非常感谢。