Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Indirizzo SP mix asm e C
Forum - C/C++ - Indirizzo SP mix asm e C

Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 15:34
Sabato, 04/02/2012
Il codice seguente dovrebbe stampare a video l'indirizzo della cima dello stack, ossia la cella puntata dallo stack pointer.

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. unsigned long get_sp(){
  4.          
  5.           unsigned long stp;
  6.            __asm
  7.           {
  8.                 mov eax, esp
  9.           }
  10. }
  11.  
  12. void main(void){
  13.           printf("\n0x%x", get_sp());
  14. }



tuttavia questo codice non mi gira, e sinceramente ho dei problemi anche a disassemblarlo, qualcuno mi può aiutare a capire l'errore e il codice!!!

Ultima modifica effettuata da Dante.cpp il 04/02/2012 alle 15:34
PM Quote
Avatar
comina8 (Normal User)
Pro


Messaggi: 86
Iscritto: 18/06/2011

Segnala al moderatore
Postato alle 17:28
Sabato, 04/02/2012
Il valore di ritorno viene posto in eax solo in funzioni assembly definite come tali (senza inline). Al posto di eax devi specificare che il valore di esp deve essere posto in "stp" e dopo l'__asm devi inserire un "return (stp);".

Mi pare di capire che stai compilando in ambiente Visual Studio quindi ti dovrebbe bastare (non sono molto pratico di quell'IDE) sostiture "eax" direttamente con "stp".
Nel caso compilassi con MinGW o GCC devi specificare l'operando di output (e in ogni caso quel codice non compilerebbe).

PM Quote
Avatar
dmr (Normal User)
Pro


Messaggi: 141
Iscritto: 04/01/2012

Segnala al moderatore
Postato alle 17:35
Sabato, 04/02/2012
Usando l'inline asm io avrei fatto:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. int indirizzo=0;
  3. int main()
  4. {
  5.   asm(".intel_syntax noprefix\n"
  6.       "mov indirizzo,esp\n"
  7.       ".att_syntax noprefix\n"
  8.   );
  9.   printf("%x\n",indirizzo);
  10.   return 0;
  11. }


Questo codice l'ho compilato con gcc , poi per verificare che indirizzo dello stack pointer era quello giusto ho fatto il debug con gdb.

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 18:08
Sabato, 04/02/2012
Codice sorgente - presumibilmente C/C++

  1. unsigned long GetEsp() {
  2.         __asm {
  3.                 mov eax, esp;
  4.         }
  5. }


PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 18:09
Sabato, 04/02/2012
Anche io uso gpp, questo codice mi gira, verificando con debuger l'indirizzo torna; tuttavia mi piacerebbe capire anche come funziona utilizzando il registro eax, senza il return. Mi postereste un codice funzionante, poi provvederò io a capirlo a fondo? Comunque grazie mille per le risposte!

PM Quote