实现数组元素汇编

时间:2017-03-31 15:31:52

标签: assembly visual-c++ inline-assembly

我试图用汇编语言x86编写代码,但由于某些原因我的程序崩溃了。这是作业。 编写汇编语言函数,它将接收10个16位值和a的列表(数组) 数字N,在1-10之间,由用户输入。 AL函数应将第N个值移动到列表的前面 以下方式: 将所有值从元素1推送到堆栈上的元素N-1。将元素N处的值重新定位到元素1。 弹出堆栈并将其元素恢复到位置N,N-1,...,2

这是我的代码

    void __declspec (naked) asmSwitch(short[], int)
    {
        __asm
        {
                    push    ebp
                    push    eax
                    push    ebx
                    push    ecx
                    push    edx
                    push    ebx
                    mov     ebp, esp
                    mov     ecx, [ebp + 12]         ; the element
                    dec     ecx                     ; 
                    mov     ebx, [ebp + 8]          ; est ptr to array
            TOP:    push    [ebx]               ;
                    inc     ebx                     ;
                    inc     ebx
                    loop    TOP
                    mov     ax, [ebx]
                    mov     ebx, [ebp + 8]
                    mov     [ebx], ax
                    mov     ecx, [ebp + 12]
                    dec     ecx
                    mov     eax, ecx
                    add     eax, eax
                    add     ebx, eax
            TOP1:   pop     [ebx]
                    dec     ebx
                    dec     ebx
                    loop    TOP1
                    pop     esi
                    pop     edx
                    pop     ecx
                    pop     ebx
                    pop     eax
                    pop     ebp
                    ret

        }
    }

我在

上收到了读取违规错误
    TOP:    push    [ebx]               ;

编译后我的程序崩溃了。

1 个答案:

答案 0 :(得分:0)

  1. EBP[ebp + 12]需要适当的[ebp + 8]。因此,将其初始化直接移至push ebp

    ...
    push    ebp
    mov     ebp, esp
    ...
    
  2. push [ebx]推送DWORD(32位),因为堆栈通常是32位组织的。 pop [ebx]弹出一个WORD(16位)因为汇编程序识别出16位数组。因此,ret将从堆栈中获得完全错误的值。同步类型:

    ...
    push    WORD PTR [ebx]
    ...
    pop     WORD PTR [ebx]
    ...