装配中的反转阵列有故障

时间:2018-01-19 18:53:07

标签: linux assembly x86 intel

好啊我想制作反转数组的程序 所以我做了这个

        section .data
    rev:
        push eax
        push ebx
        push esi
        push ecx
        mov ebx,ecx
        mov eax,esi
        Lrev_1:
            push dword[esi]
            inc esi
            loop Lrev_1
        mov ecx,ebx
        Lrev_2:
            pop dword[eax]
            inc eax
            loop Lrev_2
        pop ecx
        pop esi
        pop ebx
        pop eax
        ret
    msg dd "Hello"
section .text
global _start
_start:
    mov esi,msg
    mov ecx,5
    call rev
    mov eax,4
    mov ebx,1
    mov ecx,msg
    mov edx,5
    int 80h
    mov eax,1
    xor ebx,ebx
    int 80h

它完美地工作正常,但正如你所看到的那样,我将内存地址的所有内容推送到堆栈,这可能很慢(像乌龟)

所以我尝试使用this way

然后我尽可能地实现了这3种方式

section .data
    rev1:
        push eax
        push ebx
        push esi
        push edi
        Lrev1:
            cmp esi,edi
            jge Lrev1_out
            mov eax,dword[esi]
            mov ebx,dword[edi]
            mov dword[esi],ebx
            mov dword[edi],eax
            inc esi
            dec edi
            jmp Lrev1
        Lrev1_out:
        pop edi
        pop esi
        pop ebx
        pop eax
        ret
    rev2:
        push esi
        push edi
        Lrev2:
            cmp esi,edi
            jge Lrev2_out
            push dword[esi]
            push dword[edi]
            pop dword[esi]
            pop dword[edi]
        pop edi
        pop esi
        ret
    rev3:
        push eax
        push esi
        push edi
        Lrev3:
            cmp esi,edi
            jge Lrev3_out
            mov eax,dword[esi]
            xchg eax,dword[edi]
            mov dword[esi],eax
            inc esi
            dec edi
            jmp Lrev3
        Lrev3_out:
        pop edi
        pop esi
        pop eax
        ret
    msg dd "Hello"
section .text
global _start
_start:
    mov esi,msg
    mov edi,esi
    add edi,4
    ;if I call rev1 or rev2 here msg will be reverse into oH for me
    ;if I call rev3 here msg will be reversed into oHel for me
    mov eax,4
    mov ebx,1
    mov ecx,msg
    mov edx,5
    int 80h
    mov eax,1
    xor ebx,ebx
    int 80h

好吧,我的预期结果是olleH.But然后我得到了意想不到的结果。 我错过了什么?或者只是添加更多东西? 得到真正的逆转结果

1 个答案:

答案 0 :(得分:0)

看起来你正试图将你加载的字节反转为32位双字。

这可能对rev1有帮助吗?

        mov al,[esi]
        mov bl,[edi]
        mov [esi],bl
        mov [edi],al

你在rev2和rev3中遇到类似的问题。另外XCHG带内存的含义远不仅仅是交换reg< - > mem ...我会小心那条指令。