2017-03-31 77 views
0

我想在彙編語言x86中編寫代碼,但由於某種原因我的程序崩潰了。這是任務。 編寫一個彙編語言函數,該函數將接收用戶輸入的10個16位值的列表(數組)和一個編號爲N的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]    ; 

而我的程序在編譯後崩潰。

回答

0
  1. 您需要爲[ebp + 12][ebp + 8]適當EBP。因此,直動它的初始化背後push ebp

    ... 
    push ebp 
    mov  ebp, esp 
    ... 
    
  2. push [ebx]推一個DWORD(32位),因爲堆棧通常是32位的,明智的安排。 pop [ebx]由於彙編器識別16位數組,所以彈出一個WORD(16位)。因此,ret將從堆棧中獲得完全錯誤的值。同步類型:

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

這解決了我的問題。非常感謝! –