Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2013
    Messaggi
    20

    [ASM - C++] Errore con IMUL

    Stavo ripassando le varie istruzione assembler, credo sia un errore causato dal tipo di variabili
    Ma sono incappato in un errore
    errore c2400 errore di sintassi dell'assembler inline in 'secondo operando'. trovato 'newline' riga 45
    IMUL BX
    B è inserto dall'utente tramite cin, é un signed short
    Ecco il codice specifico
    codice:
        signed short A, B;                           //Inizializzazione variabili            
        cin>>B;
        cin>>A;
    codice:
    //SEMPLICE IF
        // if (B < 0) {                                 //confronto salto
          //  B = B * -1;
        
     _asm
     {
      
      mov AX, B
      mov BX, 0
      cmp AX, BX
      jnl finese2   //se (AX<BX) esegui istruzione se no salta
      MOV AX, B
      MOV BX, -1             //MUL usa sempre il registro privilegiato AX
      IMUL BX,              //IMUL Moltiplicazione con segni  MUL sorgente: AX=AX*BX
      mov word ptr B, ax
      finese2:
     
     }

    Ecco tutto il programma( non ha un senso visto che stavo solo testando le istruzioni)
    codice:
    #include<iostream>
    using namespace std;
     
    void IF()
    {
        signed short A, B;                           //Inizializzazione variabili            
        cin>>B;
        cin>>A; 
        // IF AND
        //if ((A < 0) && (B < 0)) {                             //confronto-salto con AND      
        //    cout << "A e B sono entrambi negativi" << endl;
        //}
     _asm {
     mov AX, A
     mov bx, 0
     cmp ax, bx
     jnl finese       
     mov ax, bx
     mov bx, 0
     cmp ax, bx
     jnl finese
        }
           cout << "A e B sono entrambi negativi" << endl;
        _asm {
    finese:
        }
     //SEMPLICE IF
        // if (B < 0) {                                 //confronto salto
          //  B = B * -1;
        
     _asm
     {
      
      mov AX, B
      mov BX, 0
      cmp AX, BX
      jnl finese2   //se (AX<BX) esegui istruzione se no salta
      MOV AX, B
      MOV BX, -1             //MUL usa sempre il registro privilegiato AX
      IMUL BX,              //IMUL Moltiplicazione con segni  MUL sorgente: AX=AX*BX
      mov word ptr B, ax
      finese2:
     
     }
     
     //IF CON XOR  if(B<10||B>30)
     //{
     // B++
     //}
     cin>>B;
     _asm
     {
      mov AX,B
      CMP AX,10
      JL istruzione
      mov AX,B
      CMP AX,30
      JG istruzione
      JMP saltaist
    istruzione:
      INC B
            
    saltaist:
     }
     system("pause");
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,461
    A prescindere dal resto del codice, deve essere

    IMUL BX

    la virgola finale non serve ...


    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2013
    Messaggi
    20
    Grazie mille, alla fine sistemandolo mi ha dato un altro errore uguale su una graffa di chiusura asm, ma chiederò spiegazioni domani al mio professore.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,461
    Quale altro errore?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2013
    Messaggi
    20
    No scusa l'esercizio precedente l'ho risolto, è un altro l'esercizio con il medesimo errore.(Non viene compilato e mi lo stesso errore che mi dava prima sull'IMUL)

    Verso 130-131
    }
    codice:
    #include<iostream>
    using namespace std;
    void main()
     
    {
        signed short A, B;                           //Inizializzazione variabili            
        signed short temp, temp1, temp2, Ris;        //Inizializzazione variabili
     cout<<"Esercizio di Xxxxx Yyyyy ZZ"<<endl;
        cout << "inserisci A = "; 
        cin >> A;
        cout << "inserisci B = ";
        cin >> B;
      
        //if ((A < 0) && (B < 0)) {                             //confronto-salto con AND      
        //    cout << "A e B sono entrambi negativi" << endl;
        //}
     _asm {
     mov AX, A
     mov bx, 0
     cmp ax, bx
     jnl finese
     mov ax, bx
     mov bx, 0
     cmp ax, bx
     jnl finese
        }
           cout << "A e B sono entrambi negativi" << endl;
        _asm {
    finese:
        }
       
     
     //if (A < 0) 
     //{                                  //confronto-salto
          //  A = A * -1;
        // }
      _asm {
      mov AX, A
      mov BX, 0
      cmp AX, BX
      jnl finese1
      MOV AX, A 
      MOV BX, -1
      IMUL BX, AX
     finese1:
      }
    
        // if (B < 0) {                                 //confronto salto
          //  B = B * -1;
        
     _asm
     {
      mov AX, B
      mov BX, 0
      cmp AX, BX
      jnl finese2
      MOV AX, B 
      MOV BX, -1
      IMUL BX
      finese2:
     
     }
     
        cout << "calcolo con somme e sottrazioni successive ";
                                    
      cout << "calcolo con somme e sottrazioni in assembly ";
            
     //Ciclo While
     /* while (temp > 0)                       
     {                   
            temp1 = temp1 + A;
            temp = temp - 1;
        }
        temp2 = 0;
        temp = B; */
     _asm
     {
     MOV AX,0
     MOV temp1,AX
     MOV BX,B
        MOV temp,BX
     
    iniz_ciclo:
      CMP temp,0  
      JLE fin_ciclo
      MOV AX,temp1
      ADD AX,A
      MOV temp1,AX
      MOV BX,temp
      SUB BX,1
      MOV temp,BX
      JMP iniz_ciclo
    fin_ciclo:
      MOV temp2,0
      MOV CX,B
      MOV temp,CX
    
    inizio_ciclo2:
      CMP temp,3
      JLE fin_ciclo2
      MOV AX,temp
      SUB AX,3
      MOV temp,AX
      MOV BX,temp2
      ADD BX,1
      MOV temp2,BX
      MOV AX,temp1
      ADD AX,temp2
      MOV Ris,AX
      
     fine_ciclo2
     }
     
        cout << "(A * B) + (B / 3) = ";
        cout << Ris << endl;
        system("pause");
    }
    La penultima graffa, comunque se ti salta all'occhio bene se no non ti preoccupare che risolvo domani.
    Ultima modifica di MItaly; 03-06-2014 a 00:03

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,461
    Prima della parentesi la label è sbagliata

    fin_ciclo2:
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.