2013-10-08 3 views
0

어셈블리에서 BYTE 배열을 2, 4, 6, 8, 10으로 만들고이 값을 DWORD 형식의 배열로 바꾸고 숙제를 끝내려고합니다. 결과, 값의 순서를 바꾸고 어셈블리에 다시 표시합니다. 나는 8-> 32 비트 배열을 제외하고는 모든 조각을 교환하고있다. 가장 최근에 시도한 시도는 다음과 같습니다.BYTE 배열을 DWORD 배열로 읽는 중

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 
+1

대신'esi'의 이유는'si' 다음에 오는 것에 단계 것인가? – us2012

+0

처음에 ebx를 사용해 보았는데 컴파일러가 인덱스 배열에 대한 오류를 줬습니다. –

답변

3

DWORD는 32 비트입니다. BYTE 배열의 숫자는 8 비트입니다. 따라서 intArray는 최대 4 개의 숫자를 가질 수 있지만 예상대로는 아닙니다. 당신이 이동할 때

intArray DWORD ? 

이처럼 보일 수 있습니다 모든 번호를 보유하고 있지만 :

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

.data? 
intArray DWORD lengthof byteArray dup (?) 

이는 대신, (내가 제대로 이해하면) 5 개 개의 번호를 보유 할 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 
+0

굉장한 임무는 특정 방식으로 일을하도록 지정되었습니다. 그러나 귀하의 반응은 도움이 되었기 때문에 많은 감사드립니다. –

관련 문제