Witam
Potrzebuje program który pobiera w c++ 2 argumenty i przekazuje je do asm.
Asm sobie dodaje i zwraca wartość do c++.
Nie bardzo wiem jak sie zabrać z to czy ktoś może coś pomóc ? Z samym programem w c sobie poradze ale asm to czarna magia
Napisz tą funkcję w C/C++ potem skompiluj z opcją utworzenia kodu assemblera (większość kompilatorów to ma), i masz gotowca.
Możesz użyć wstawki asemblerowej?Jeśli tak,to masz dość prosto:
int funkcja(int sum1,int sum2)
{
_asm
{
mov eax,sum1
add eax,sum2 //funkcje w c/c++ zwacają inty w rejestrze eax
}
}
To jest takie absolutne potrzebne minimum.Działa dobrze (cóż,przynajmniej na VS2003 ;P) póki suma nie przekroczy maxymalnej wartości inta.Możesz wzbogacać tą funkcję w jakieś badania znacznika nadmiaru i stosowne operacje wówczas,ale to już od ciebie zależy co chcesz
To działa w VS? Niektórzy to mają dobrze ;) W Gcc którego używam najbliższym odpowiednikiem byłoby
asm(""
"mov eax,sum1\n"
"add eax,sum2\n");
Ale to nie zadziała bo sum1 i sum2 nie są nazwami dla asemblera. Ja zazwyczaj bawię się w takim przypadku ręcznie z ramką stosu, może da się prościej, nie wiem...
@msm U do it wrong dude!
asm("movl $sum1, %eax\n"
"addl $sum2, %eax\n");
Przecież GCC korzysta ze składni AT&T, która dość znacznie odbiega od intelowskiej.
Przecież GCC korzysta ze składni AT&T, która dość znacznie odbiega od intelowskiej.
co i tak nie zadziała z drugiego powodu.
ale żeby było jeszcze śmieszniej, takie coś
asm("movl $5, %eax\n");
też nie działa — funkcja zwraca mi 0.
Nie mam siły do tej składni. działa takie coś:
; plik asmtesta.asm
[bits 32]
section .text
global _funkcja
_funkcja:
mov eax,[esp+4]
add eax,[esp+8]
ret
// plik asmtestc.c
#include <stdio.h>
extern int funkcja(int sum1,int sum2);
int main()
{
printf("%d\n",funkcja(2,3));
}
kompilacja:
c:\pp\MYPROGS\C>nasm asmtesta.asm -fwin32
c:\pp\MYPROGS\C>gcc asmtestc.c asmtesta.obj -o asmtest.exe
c:\pp\MYPROGS\C>asmtest
5
Przecież GCC korzysta ze składni AT&T, która dość znacznie odbiega od intelowskiej.
gcc a.cpp -masm=intel
i mamy składnię intelowską.
AT&T to imo jedno wielkie WTF.
A powiedzcie mi jak to upakować teraz w 2 programy ? Jeden w asm a drugi w c ++ ?
Ja naskrobałem coś takiego:
int sum(int a, int b) {
asm ( "mov eax, %0\n"
"add eax, %1"
/*
* Wersja AT&T
* "movl %0, %%eax\n"
* "addl %1, %%eax"
*/
:
: "r" (a), "r" (b));
}
int main(int argc, char* argv[]) {
int a = 1, b = 10;
printf("a = %d, b = %d, sum = %d\n", a, b, sum(a,b));
return 0;
}
W wyniku daje:
a = 1, b = 10, sum = 11
Napisałem coś takiego:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main(){
int a,b,c;
cout << "wpisz 1 liczbe"<<endl;
cin >>a;
cout << "wpisz 2 liczbe"<<endl;
cin >>b;
asm("movl -4(%ebp), %eax; \
add -8(%ebp), %eax; \
movl %eax, -12(%ebp)");
cout << c;
system ("pause");
return 0;
}
Ale coś z adresami jest chyba nie tak bo wychodzą mi dziwne rzeczy, moglby ktoś to poprawić ?
Przecież podałem Ci działający kod.
Z tego co ja pamiętam to printf to jest składnia c a nie c++, ale mogę sie mylić, natomiast ani Qt+ ani Dev nie chce skompilowąć tego kodu który dałeś - dlatego pytam co zrobiłem źle.
Sorry, moj błąd. Program który podałem działa, jak by ktoś miał kiedyś taki problem jeszcze ;)
Pozdrawiam
i dziękuje za pomoc.
No i mam jeszcze jeden problem, programy jednak muszą być w 2 osobnych plikach i skompilowane borlandem 3.1
i jestem w czarnej.....
Jak by mogł mi ktoś napisać ten program w asm ale do c++ ?
skompilowane borlandem 3.1
i DOPIERO o tym piszesz?
mayka napisał(a)
Z tego co ja pamiętam to printf to jest składnia c a nie c++, ale mogę sie mylić, natomiast ani Qt+ ani Dev nie chce skompilowąć tego kodu który dałeś - dlatego pytam co zrobiłem źle.
Sorry, moj błąd. Program który podałem działa, jak by ktoś miał kiedyś taki problem jeszcze ;)
Pozdrawiam
i dziękuje za pomoc.
Składnia jak najbardziej jest z C++. printf
to jest jedynie funkcja ze standardowej biblioteki C, a kod nie chciał się skompilować jako C++ bo nie masz na szczycie dołączonego nagłówka #include <stdio.h>
lub (bardziej w stylu C++) #include <cstdio>
. Niestety nie mam zielonego pojęcia jak wygląda asm w tym relikcie jakim jest Borland 3.1 (który o LuL jest starszy ode mnie :P). Mój kod na pewno działa poprawnie pod GCC 4.5.3 (Debian 4.5.3-1).
Azarien napisał(a)
skompilowane borlandem 3.1
i DOPIERO o tym piszesz?
No dopiero, bo poszedłem na zaliczenie tego zadania i Pan wykładowca raczył nas poinformować o tym że mamy to zrobić przy pomocy bcc...
"należy zapytać wykładowcę o rok wydania Borland C++ 3.1 (1992), rok bieżący (2011) i czy ma jakieś spostrzeżenia z tym związane."
Wersja dosowa więc jak najbardziej '92, spostrzeżeń żadnych, skompilować z pomocą: "bcc plik.cpp plik.asm" i tym skonsolidować. Tyle.