2017-03-31 2 views
0

J'essaye de coder ceci en langage assembleur x86, mais pour une raison quelconque, mon programme se bloque. Voici la mission. Ecrivez une fonction en langage assembleur qui recevra une liste (tableau) de 10 valeurs de 16 bits et un numéro , N, entre 1 et 10, entré par l'utilisateur. La fonction AL doit déplacer la Nième valeur au début de la liste en de la manière suivante: Pousser toutes les valeurs de l'élément 1 vers l'élément N-1 de la pile. Relocaliser la valeur à l'élément N à l'élément 1. Pop la pile et de restaurer ses éléments dans des endroits N, N-1, ..., 2Implémentation de l'assemblage d'éléments de tableau

Voici mon code

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 

     } 
    } 

Je reçois violation lire erreur sur

TOP: push [ebx]    ; 

Et mon programme se bloque après la compilation.

Répondre

0
  1. Vous avez besoin d'un bon EBP pour [ebp + 12] et [ebp + 8]. Donc déplacer son initialisation droite derrière push ebp:

    ... 
    push ebp 
    mov  ebp, esp 
    ... 
    
  2. push [ebx] pousse un DWORD (32 bits) parce que la pile est normalement sage 32 bits organisé. pop [ebx] affiche un mot (16 bits) car l'assembleur reconnaît le tableau 16 bits. Ainsi, ret obtiendra une valeur totalement erronée de la pile. Synchronisez les types:

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

qui a résolu mon problème. Merci beaucoup! –