Problem z odczytem wartosci z pamieci w asm/c++


(fedora24x) #1

System pokazuje komunkat segmentation fault na :

  #include <iostream>
    using namespace std;
    int main()
    {

    	double *y0, *y1, *y2, *y3;
    	double x;

    	__asm__ __volatile__ (
    		"movq %%rbp, %0\n"
    		"movq %%rsp, %1\n"

    		"pushq %%rbp\n"
    		"movq %%rsp, %%rbp\n"
    		"subq $8, %%rsp\n"

    		"movl $123, -8(%%ebp)\n"
    		
    		"movq %%rbp, %2\n"
    		"movq %%rsp, %3\n"

    		"leaq -0x8(%%ebp), %%rax\n"
    		"movq %%rax, %4\n"
    		""
    		""
    		""
    		""
    		:"=r"(y0), "=r"(y1), "=r"(y2), "=r"(y3), "=r"(x)
    		:
    		:
    		);
    	cout << "rbp = " << y0 << endl;
    	cout << "rsp = " << y1 << endl;

    	cout << endl;

    	cout << "rbp = " << y2 << endl;
    	cout << "rsp = " << y3 << endl;
    	
    	cout << endl;
    	cout << x << endl;
    	return 0;
    }

i mam pytanie jak moge odczytac wartosc z asm do c++ ?


(Johny) #2

Dlaczego zmienne robisz jako wskażniki ?.Nie mają przypisanych adresów w pamięci i dlatego się sypie
double *y0, *y1, *y2, *y3;
zmiana
double y0, y1, y2,y3;
double *pointer;
pointer=&a; //przypisanie adresu zmiennej wskażnikowi,a musi być double aby zajmowało tyle samo pamięci.
W programie assemblerowym możesz używać nazw zmiennych,zostaną zamienione na adresy w pamięci przy kompilacji.
Wysypuje się przy cout,bo bez adresu nie wie skąd odczytać wartość.
To jest assembler AT.


(tomms) #3

Ze wstawki asm zwracasz wskaznik więc niech ‘x’ tęż będzie wskaźnikiem.
A czy musi on być konkretnie na double to inna sprawa.

Musisz pamiętać aby odtworzyć rbp na końcu.

Co tu chciałeś zrobić? jeśli to ma być zamiast ‘pop’ to powinieneś użyć ‘add’.

Używasz bezpośrednio rax a co jeśli rax będzie którymś rejestrem wyjściowym?

Tutaj tego misia trzeba dopisać.

Poniżej poprawiony kod:

#include <iostream>
using namespace std;
int main()
{

	void *y0, *y1, *y2, *y3;
	void *x;

	__asm__ __volatile__ (
   		    "movq %%rbp, %0\n"
    		"movq %%rsp, %1\n"

    		"pushq %%rbp\n"
    		
    		"movq %%rsp, %%rbp\n"
    		//"decq $8, %%rsp\n"

    		"movl $123, -8(%%rbp)\n"
    		
    		"movq %%rbp, %2\n"
    		"movq %%rsp, %3\n"

    		"leaq -0x8(%%ebp), %%rax\n"
    		"movq %%rax, %4\n"    		

            "popq %%rbp\n"    		
    	:"=r"(y0), "=r"(y1), "=r"(y2), "=r"(y3), "=r"(x)
		:
		: "cc", "memory", "%rax"
		);
		
	cout << "rbp = " << y0 << endl;
	cout << "rsp = " << y1 << endl;

	cout << endl;

	cout << "rbp = " << y2 << endl;
	cout << "rsp = " << y3 << endl;
	
	cout << endl;
	cout << x << endl;
	return 0;
}