Oppure

Loading
04/02/12 14:34
Dante.cpp
Il codice seguente dovrebbe stampare a video l'indirizzo della cima dello stack, ossia la cella puntata dallo stack pointer.

#include <stdio.h>

unsigned long get_sp(){
          
          unsigned long stp;
           __asm
          {
                mov eax, esp
          }
}

void main(void){
          printf("\n0x%x", get_sp());
}


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 04/02/12 14:34
aaa
04/02/12 16:28
comina8
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).
aaa
04/02/12 16:35
dmr
Usando l'inline asm io avrei fatto:
#include <stdio.h>
int indirizzo=0;
int main()
{
  asm(".intel_syntax noprefix\n"
      "mov indirizzo,esp\n"
      ".att_syntax noprefix\n"
  );
  printf("%x\n",indirizzo);
  return 0;
}

Questo codice l'ho compilato con gcc , poi per verificare che indirizzo dello stack pointer era quello giusto ho fatto il debug con gdb.
aaa
04/02/12 17:08
HeDo
unsigned long GetEsp() {
	__asm {
		mov eax, esp;
	}
}
aaa
04/02/12 17:09
Dante.cpp
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!
aaa