Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C, Assembly x86] Compilazione ed errore

    Ciao a tutti, stavo realizzando un esercizio che determinasse il massimo di un vettore di interi. Il programma in C deve richiamare il codice assembly. Provo a compilare l'assembly

    codice:
    as --32 max.s -o max.o
    ma:
    codice:
    max.s: Assembler messages:
    max.s:18: Error: junk `(,%edi,4)' after register
    Ho provato a googlare il problema, ma ho trovato tutti con assembly inline.

    Vi riporto di seguito i listati dei due file:
    codice:
    //max_main.c
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int max(int* v, size_t size);
    
    int main(int argc, char** argv){
    
        int vect[] = {10, 32, 39, 29};
        
        printf("Max value: %d", max(vect, 4));
        return 0;
    }
    codice:
    #max.s
    .globl max
    
    max:
        pushl %ebp
        movl %esp, %ebp
    
        movl 8(%ebp), %ebx
        movl 12(%ebp), %ecx
    
        cmpl $0, %ecx
        je end_max
    
        movl (%ebx), %eax
        movl $1, %edi
    loop:
        cmpl %ecx, %edi
        je end_max
        movl %ebx(,%edi,4), %edx
        incl %edi
    
        cmpl %edx, %eax
        jge loop
        movl %edx, %eax
        jmp loop
    
    end_max:
        movl %ebp, %esp
        popl %ebp
        ret
    Alla fine per linkare i due file assieme mi basta:
    codice:
    gcc -m32 max_main.c max.o -o output
    giusto?

    Spero di poter contare in un vostro aiuto.
    Ciaoooo

  2. #2
    Questa
    codice:
        movl %ebx(,%edi,4), %edx
    non è un'istruzione valida. La sintassi AT&T per gli operandi è
    codice:
    segment:displacement(base register, offset register, scalar multiplier)
    Probabilmente intendi:
    codice:
        movl (%ebx, %edi, 4), %edx
    (anche se personalmente eviterei la sintassi AT&T, è atroce; in sintassi Intel sarebbe più semplicemente:
    codice:
    mov edx, dword ptr[ebx + edi*4]
    )
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Grazie, avevo già risolto, ma ieri sera mi sono dimenticato di postarlo.
    Il problema era proprio quello.
    Per la compilazione basta:
    codice:
    gcc -m32 file.c file.s -o output
    In questo modo si ottiene il codice a 32 bit. (l'ho scritto casomai qualcuno in futuro debba avere il mio stesso problema )

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 © 2020 vBulletin Solutions, Inc. All rights reserved.