两个阵列使用相同的内存地址

时间:2015-09-02 22:28:39

标签: assembly

实验室要求从大Endian到小端序。我得到了渴望的结果,但是一个临时数组使用与我的小端相同的地址,使内容加倍。怎么样,我能解决吗?我是汇编语言的新手

这是我的代码:

.386
.model flat,stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword

.data
bigEndian BYTE 12h,34h,56h,78h ;given code do not delete
littleEndian DWORD ?

tempArray BYTE ?


.code
main proc

    mov ebx,0
    mov ecx,4
    mov esi, SIZEOF bigEndian -1


L1: 

    mov dl,bigEndian[esi]
    mov tempArray[ebx], dl
    dec esi
    inc ebx


    loop L1

    mov esi,0
    mov eax,DWORD PTR tempArray[esi]
    mov littleEndian,eax
    ;inc esi


    invoke ExitProcess,0
main endp
end main

2 个答案:

答案 0 :(得分:1)

您不需要临时数组。你可以使用这样的东西(MASM语法):

        mov     esi,offset bigEndian         
        lodsb
        shl     eax,8
        lodsb
        shl     eax,8
        lodsb
        shl     eax,8
        lodsb
        mov     littleEndian,eax

如果赋值只是使用mov instructrions而没有移位指令(MASM语法):

        mov     al,byte ptr bigEndian+0
        mov     byte ptr littleEndian+3,al
        mov     al,byte ptr bigEndian+1
        mov     byte ptr littleEndian+2,al
        mov     al,byte ptr bigEndian+2
        mov     byte ptr littleEndian+1,al
        mov     al,byte ptr bigEndian+3
        mov     byte ptr littleEndian+0,al

        mov     ah,byte ptr bigEndian+0
        mov     al,byte ptr bigEndian+1
        mov     word ptr littleEndian+2,ax
        mov     ah,byte ptr bigEndian+2
        mov     al,byte ptr bigEndian+3
        mov     word ptr littleEndian+0,ax

答案 1 :(得分:1)

此任务无需使用临时数组。

  • 仅使用MOV说明进行就地倒车。

    mov esi, 0
    mov edi, 3
    L1: 
    mov dl, bigEndian[esi]
    mov dh, bigEndian[edi]
    mov bigEndian[edi], dl
    mov bigEndian[esi], dh
    inc esi
    dec edi
    cmp esi, edi
    jb L1
    
  • 如果目的地确实是另一个变量,那么请使用:

    mov esi, 3
    mov edi, 0
    L1: 
    mov dl, bigEndian[esi]
    mov littleEndian[edi], dl
    inc edi
    dec esi
    jns L1