fedora24x
(fedora24x)
12 Lipiec 2017 16:38
#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
(Johny)
13 Lipiec 2017 06:45
#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
(tomms)
15 Lipiec 2017 20:45
#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.
asm volatile (
“movq %%rbp, %0\n”
“movq %%rsp, %1\n”
“pushq %%rbp\n”
“movq %%rsp, %%rbp\n”
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’.
“movl $123, -8(%%ebp)\n”
“movq %%rbp, %2\n”
“movq %%rsp, %3\n”
“leaq -0x8(%%ebp), %%rax\n”
“movq %%rax, %4\n”
Używasz bezpośrednio rax a co jeśli rax będzie którymś rejestrem wyjściowym?
“”
""
""
""
:"=r"(y0), “=r”(y1), “=r”(y2), “=r”(y3), “=r”(x)
:
:
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;
}
1 polubienie