[Assembler,Delphi] Binarne

0

Mam taka funkcje w delphi ktora dodaje mi dwie zmienne:

function TForm1.dodaj(a,b:word):word;stdcall;
asm
{funkcja dodaje do siebie dwie liczby
najpierw trzeba zapisac na stos wartosci rejestrow
ktore bedziemy uzywac}
push ax {odklada na stos wartosc z ax - jako pierwsza}
push bx {odklada na stos wartosc z bx - jako druga}
mov ax, a {przypisujemy jednemu rejestrowi wartosc liczby 1}
mov bx, b {przypisujemy drugiemu rejestrowi wartosci liczby 2}
add ax, bx {dodajemy przy pomocy mnemonika "add" - cel zawsze ax}
mov @result, ax {przypisujemy adresowi funkcji wartosc z ax}
pop bx {pobieramy ze stosu wartosc rejestru bx - jako pierwszy bo ostatni zostal odlozony}
pop ax {pobieramy ze stosu wartosc rejestru ax - jako drugi bo pierwszy zostal odlozony (przed bx)}
end;

BEGIN
a:=111;
b:=1111;
dodaj(a,b);
END.

Moje pytanie to jak zrobic zeby zmienne a i b byly traktowane jako liczby binarne ? I zeby wynik tego dodawania przypisany do funkcji tez byl w systemie dwojkowym?

Na assemblerze sie nie znam wiec prosze was o pomoc!!!! Wiem ze ideą tego forum nie jest pisanie gotowych programów ale ja zupelnie nie wiem jak to zrobic a zalezy mi na szybkim dodawaniu liczb binarnych.

Znalazlem jak mozna uzywac binarnych zamiast dziesietnych ale nie wiem jak to przerobic :( http://www.koder.org.pl/forum/lofiversion/index.php/t299.html

PROSZE POMOZCIE!!!!

0

Moje pytanie to jak zrobic zeby zmienne a i b byly traktowane jako liczby binarne ? I zeby wynik tego dodawania przypisany do funkcji tez byl w systemie dwojkowym?

Odp. Nic.

Dodawanie w komputerze jak i wszystko inne zawsze jest operacją bitową czyli na systemie dwójkowym.

Nie znam sie zabardzo na pascalu, ale zdaje mi się, że: a:=111; oznacza przypisanie do "a" wartości 111 dziesiętnej, a nie binarnej. A jeżeli to jest zamierzone to musze powiedzieć, że conajmniej dziwne.

Dodawanie liczb binarnych daje takie same wyniki jak dodawanie w jakim kolwiek innym systemie i nie powinno być raczej określane pojęciem "szybkie" bo to jest normalne dodawanie jak każde inne. To czy uważasz, że argumenty dodawania są liczbami w takim czy innym systemie liczbowym jest tylko interpretacją liczb.

przykład:
b - oznacza liczbe binarna, d - liczba w systemie dziesietnym
11b + 101b = 1000b = 3d + 5d = 8d

Zdaje mi się jednak, że sprecyzowałeś swojego pytania odpowiednio do twojego problemu bo w takiej postaci jak je zadałeś to żadnego problemu w twoim programie nie ma.

0

Być może autorowi postu chodzi o to, że liczby przekazywane do funkcji mają być w zapisie binarnym, ale jako string. Póżniej funkcja ma je przekształcić na włąściwe liczby, po czym je dodać i wynik zwrócić ponownie jako string, ale w zapisie binarnym. Czy o to chodzi?

0

Wiem ze w pascalu liczba przypisana do zmiennej "a" jest traktowana jako dziesietna. Ale chodzi mi o to zeby ta zmienna "a" byla parametrem funkcji i kiedy do niej wchodzi to zeby byla traktowana jako liczba binarna. Czyli nie 111 a 111b. I zeby rezultatem działania funkcji byl wynik dodawania zmiennych "a" i "b" w postaci binarnej.

A o szybkim dodawaniu to mialem na mysli ze wynik bedzie od razu ;). Bo jak na razie to uzywam metody pisemnej i jest ona nieco wolna bo wykonuje sie tyle razy ile bitów ma najwieksza liczba.

0

No powiem sprawa nie jest prosta. Znaczy do zrobienia, ale kod wynikowy nie musi być ani <ort>krutki </ort>ani szybki. Proponuje abyś powiedział do czego ci to jest potrzebne to może jakoś bardziej bym mół pomóc.

Można by to też zrobić zupełnie inaczej.
Napisać 2 funkcje:

  1. Do zamiany tej pseudodwójkowej liczby na zwykłą
  2. Do zrobienia operacji odwrotnej co poprzednia.

Wtedy traktujesz oba składniki funkcją1 potem normalnie dodajesz je, a końcowy wynik pociągniesz z funkcji2.

Ale lepiej żebyś dał pare wskazówek skąd taki pomysł i do czego to ma być.

(Łatwiej by to było zrobić jak by ta liczba dwójkowa była zapisana w postaci szesnastkowej, ale to wiadomo)

0

Moim celem było zrobienie kalkulatora binarnego ktory dzialal by na duzych liczbach rzedu np 5000 bitów lub wiecej... Wykonanie tego nie bylo zadnym problemem bo wszystkie dzialania czyli +, -, * wykonuje pisemnie na stringach. Ale przy dużej ilosci bitów zajmuje to troche czasu.

Wiec wymyslilem ze dodawanie mozna wykonac segmentami, a ze pascal czy delphi nie maj zadnej funkcji ktora operowala by na systemie dwojkowym wiec musial bym uzyc tu assemblera w ktorym aby liczba byla traktowana jako binarna wystarczy napisac "b". Wtedy dzielilm bym tego stringa na 31bitów(bo tyle maksymalnie pomiesci asembler).

I teraz kiedy mial bym sume liczb np 62bitowa + 62bitowa to wykonal bym tylko 2 operacje a tak pisemnie zrobie az 62 operacje bo kazdy bit z kazdym.

Troche to zawile, ale mam nadzieje ze zrozumiecie

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