Jmptable

di il
19 risposte

Jmptable

Salve a tutti
ho un piccolo problema

           smista_ritorno dd offset A0020,offset A0008,
                             offset A0011,offset A0017
se metto il codice nel .data mi da errore in fase di compilazione sulle label.
se invece lo metto nel .code non mi da errore in compilazione ma in esecuzione

mov opzione,1
xor eax,eax
mov ebx,4
mov al,opzione
mul ebx
mov edx,offset A0008 ;solo per verifica
mov esi,smista_ritorno[eax] ;solo per verifica
jmp dword ptr smista_ritorno[eax]

facendo il confronto fra esi e edx mi trovo valori differenti.
qualcuno sa come potrei fare?
scarto a priori la seguente soluzione perchè già usata per testare il programma
ed essendo in fase di ottimizzazione debbo ridurre il codice.
.data
opzione db ?
smista_ritorno dd 4 dup (?)
.code
 mov eax,offset A0020
 mov esi,offset A0008
 mov edi,offset A0011
 mov edx,offset A0017
 mov smista_ritorno[0],eax
 mov smista_ritorno[4],esi
 mov smista_ritorno[8],edi
 mov smista_ritorno[12],edx
;------------------------------------ 
mov opzione,1
xor eax,eax
mov ebx,4
mov al,opzione
mul ebx
mov edx,offset A0008 ;solo per verifica
mov esi,smista_ritorno[eax] ;solo per verifica
jmp dword ptr smista_ritorno[eax]
ringrazio anticipatamente chiunque mi sappia aiutare.

19 Risposte

  • Re: Jmptable

    A occhio, ti basta qualcosa del genere
    
      .data
        align 4
        smista_ritorno dd   A0020, A0008, A0011, A0017
    
      .code
        mov eax, 0   ; per il primo indirizzo, 1 per il secondo ...
        jmp dword ptr [smista_ritorno+eax*4]
    
  • Re: Jmptable

    Grazie per la soluzione
    spostandola in .code funziona
  • Re: Jmptable

    In che senso "spostandola in .code " ?
  • Re: Jmptable

    Nel senso che:
    
     .data
        align 4
        smista_ritorno dd   A0020, A0008, A0011, A0017
    

    non riconosce le label
    mentre se scrivo:
    
    .code
        mov eax, 0   ; per il primo indirizzo, 1 per il secondo ...
        jmp dword ptr [smista_ritorno+eax*4]
        ......
        ......
        ret 
          align 4
        smista_ritorno dd   A0020, A0008, A0011, A0017  
        
    nonsolo non da errore ma le label vengono eseguite correttamente.
  • Re: Jmptable

    Utilizza il data segment

    jmp dword ptr ds:[smista_ritorno+eax*4]
  • Re: Jmptable

    Cosi non funziona mi da l'errrore error A2006: undefined symbol : A0020
    evidentemente la direttiva offset opera solo nel segmento dati e in quello corrente.
    quindi se sta' nel segmento dati
    .data
    smista_ritorno dd offset A0020,....
    
    l'operatore offset andrà a cercare il simbolo nel segmento dati (quello che per lei e il corrente)
    al contempo se la utilizzo nel segmento codice
    .code
    smista_ritorno dd offset A0020,....
    
    andrà prima a cercare in quello corrente e poi eventualmente in quello dati.
    di default funziona cosi l'operatore offset.

    comunque ancora grazie per la soluzione funziona mettendola nel .code
  • Re: Jmptable

    Tanto per cominciare non ho mai usato offset

    smista_ritorno dd A0020, A0008, A0011, A0017

    In secondo luogo, non ho alcun errore.

    Con cosa stai compilando?
  • Re: Jmptable

    Sto compilando con visual studio 2012
    e normale che tu non abbia errori perchè li tratti come un vettore costante
    mentre io li tratto come un vettore di indirizzi a label.
    adesso che me lo hai fatto notare mi chiedo come faccia a funzionare a te
  • Re: Jmptable

    Io ho usato Masm32

    Posta uno zip con il tuo progetto completo
  • Re: Jmptable

    Ecco un esempio completo:
    include \masm32\include\masm32rt.inc
    
    .data
    JmpTable	dd @bye, L1, L2, L3, L4
    
    .code
    start:
    	m2m ebx, 5  ; iniziamo con L4
    DecEbx:
    	dec ebx
    	jmp JmpTable[4*ebx]
    
    L1:	print "Label 1", 13, 10
    	jmp DecEbx
    
    L2:	print "Label 2", 13, 10
    	jmp DecEbx
    
    L3:	print "Label 3", 13, 10
    	jmp DecEbx
    
    L4:	print "Label 4", 13, 10
    	jmp DecEbx
    
    @bye:
    	inkey "bye"	
    	invoke ExitProcess, 0
    end start
    Non importa se JmpTable si trova in .data o .code - tanto è read only. Testato con Masm 6.14 ... 10.0 e UAsm64.
  • Re: Jmptable

    (visto che il problema grazie ad oregon e spostando in .code e risolto)
    A questo punto sorge una curiosità!
    se non è importante dove sia definita la jmptable
    come mai a me quando la definisco in .data non funziona
    e mi da l'errore in fase di compilazione di simbolo non definito per ogni label?
    mentre quando la definisco in .code funziona correttamante?
    il codice solo parti principale e il seguente:
    
            .486
            .model flat,stdcall
              option casemap:none
            .data
               estremi   dw ?
               dime      db ?
               errore    db ?
               carattere db ?
               include include\rosalinda3.sam
               partenza  db ?
               scelta    db ?
             align 4
               smista_ritorno dd  A0019, A0007, A0010, A0018
               routine   dd ?
            .code
                  Cressidra proc Arg1:Dword,Arg2:Dword,Arg3:Dword
                           pusha
                           ...........................
                           ...........................
                   A0003: jmp Dword ptr [smista_ritorno+eax*4]
                   ..............................
                   A0007: ......................
                   A0010:.......................
                   A0018:.......................
                   A0019:.......................
                           popa           ;-------------------
                    A0023: xor  eax,eax   ;* Fine Programma. *
                           mov  al,errore ;-------------------
                    A0024: ret  12
                  Cressidra Endp
              End       
              

    cosi mi da errore di compilazione errorA2006:undefined symbol:A0019
    che si ripete per ogni label
    probabilmente ometto qualche direttiva che, non conosco, mi faccia compilare correttamente.
    non posto l'intero progetto nel file zip perchè non so come fare!
  • Re: Jmptable

    Allora, per toglierti la curiosità, ecco lo stesso codice come sopra ma con piccole variazioni:
    include \masm32\include\masm32rt.inc
    
    .data
    JmpTable   dd @bye, L1, L2, L3, L4
    
    .code
    Eccolo proc	
       m2m ebx, 5  ; iniziamo con L4
    DecEbx:
       dec ebx
       jmp JmpTable[4*ebx]
    
    L1:   print "Label 1", 13, 10
       jmp DecEbx
    
    L2:   print "Label 2", 13, 10
       jmp DecEbx
    
    L3:   print "Label 3", 13, 10
       jmp DecEbx
    
    L4:   print "Label 4", 13, 10
       jmp DecEbx
    
    @bye:
      ret	
    Eccolo endp
    	
    start:
      call Eccolo
      inkey "bye"   	
      invoke ExitProcess, 0
    end start
    Prova ad assemblarlo: vedrai messaggi di errore. Poi, aggiungi un : al @bye: -> @bye::, e fa la stessa cosa con L1 ... L4
  • Re: Jmptable

    La versione di masm che utilizzo e la 11.00.610300 (vista da visual Studio)
    non ho quelle include
    ma sinceramente anche con la modifica non ho capito il perchè del comportamento differente nei 2 casi.
    se me lo spieghi te ne sarei grato
  • Re: Jmptable

    smalldragon ha scritto:


    La versione di masm che utilizzo e la 11.00.610300 (vista da visual Studio)
    non ho quelle include
    Se programmare in assembly ti interessa davvero, installa Masm32.
    ma sinceramente anche con la modifica non ho capito il perchè del comportamento differente nei 2 casi.
    se me lo spieghi te ne sarei grato
    Il mistero sta in un piccolo "dettaglio": Masm tratta i label dentro una prog come local... quindi sconosciuti alla sezione .data
    Si possono rendere global con un doppio ::
Devi accedere o registrarti per scrivere nel forum
19 risposte