[asm] met Linux geeft leuke fout :(

Pagina: 1
Acties:

  • active2
  • Registratie: Juni 2001
  • Laatst online: 17-07 21:56

active2

Google is your friend

Topicstarter
Ik heb het volgende programma fragment:
code:
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
                                                                                  
int main(void) {
  int a = 2, b = 4, v;
  __asm__ (
        "mov EAX,a",
        "mov EDX,b",
        "add EAX,EDX",
        "mov v,EAX"
  );
  printf("Uitvoer: %i\n", v);
}


Als ik dit compile met: gcc-2.95 -o voeruit voeruit.c dan krijg ik deze errors:
code:
1
2
/tmp/ccqNNMC7.s: Assembler messages:
/tmp/ccqNNMC7.s:18: Error: too many memory references for `mov'


Goed ga er maar aan staan wat het is maar ik zie het niet.

Who knows the solution? :)

Google, Het mirakel van de 21e eeuw!!!!


  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
Ik heb geen ervaring met die __asm__, maar ben je zeker dat je uw variabelen 'a' en 'b' niet moet concateneren:

code:
1
2
3
4
__asm__
(
    "mov EAX, "<<a;
)


Ik weet niet zeker of dat concateneren op de goeie manier is, het is al nl 3 jaar geleden dat ik nog eens een letter C++ geschreven heb :)

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


  • active2
  • Registratie: Juni 2001
  • Laatst online: 17-07 21:56

active2

Google is your friend

Topicstarter
da's niet nodig ik heb het geprobeerd maar dat werkt ook niet

En het is geen letter C++ hoor ;)

In elk geval bedankt voor de help :)

Google, Het mirakel van de 21e eeuw!!!!


  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
dat MOV geen c++ is , weet mijn kleine teen ook (zelfs mijn grote wist dat :P )

maar '<<' is wel c++

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 14:00

Reptile209

- gers -

Moet het niet zijn:
code:
1
2
3
4
  __asm__ { // <<-- accolade ipv haakje
    mov EAX, a;  // hier gewoon alleen de asm-code zonder quotes
    ... (etc.)
   };

[ Voor 4% gewijzigd door Reptile209 op 14-05-2003 14:11 ]

Zo scherp als een voetbal!


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

GNU gebruikt voor assembly de AT&T syntax, en niet de Intel syntax.

Bijv: zet de waarde 5 in EAX:

code:
1
mov eax,5

code:
1
movl $5,%eax


Daarbij kan je de compiler al de variabelen in de registers laten zetten (en eruit laten halen), dus jouw stukje gaat er als volgt uitzien:

C:
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
                                                                                  
int main(void) {
  int a = 2, b = 4, v;
  __asm__ (
        "addl %%edx, %%eax"
        : "=a" (v)
        : "a" (a), "d" (b)
  );
  printf("Uitvoer: %i\n", v);
}


Nog beter zou zijn om GCC zelf voor de registerallocatie te laten zorgen:

C:
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
                                                                                  
int main(void) {
  int a = 2, b = 4, v;
  __asm__ (
        "addl %1, %0"
        : "=q" (v)
        : "q" (a), "q" (b)
  );
  printf("Uitvoer: %i\n", v);
}


Zie ook hier voor de uitleg.

edit:
Ik moet m'n code zelf ook testen 8)7

[ Voor 20% gewijzigd door kenneth op 14-05-2003 14:40 ]

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.

Pagina: 1