C++ i Assembler

0

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

0

Napisz tą funkcję w C/C++ potem skompiluj z opcją utworzenia kodu assemblera (większość kompilatorów to ma), i masz gotowca.

0

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

0

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...

0

@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.

0

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
0

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.

0

A powiedzcie mi jak to upakować teraz w 2 programy ? Jeden w asm a drugi w c ++ ?

0

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

0

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ć ?

0

Przecież podałem Ci działający kod.

0

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.

0

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++ ?

0

skompilowane borlandem 3.1
i DOPIERO o tym piszesz?

0
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).

0
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...

0

"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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1