FAQ | Points | Add... | Recent posts | Search | Register | Log in


[Assembler] Mnożenie i dzielenie.


Post new topic  This topic is locked      Main Page -> Forum Index -> Programming Generally -> [Assembler] Mnożenie i dzielenie.
Author
Message
lukaspaw
Poziom 12
Poziom 12


Joined: 10 Apr 2003
Posts: 100

Post#1 Post from the author of the topic 20 Apr 2004 18:44   

[Assembler] Mnożenie i dzielenie.


panowie mam pytanie dotyczace asemblera. próbuje podzielić w nim dowolna liczbę przez np 10 czy 100 (1000), ale nie znalazłem do tego odpowiednich komend (jeśli oczywiście istnieją). widziałem że to sie da robić w C wiec w asemblerze też powinno się dać. myślałem że może pomnożyć razy odwrotność ale wtedy takie x/100 zmienia się w x*1/100 czyli mnoże razy 0,01 a tu wychodzą liczby z przecinkiem. są komendy takie jak FMUL i FMULS ale kompletnie nie wiem jak ich używać, chociaż to jeszcze-bo mam ze dwa przykłady, ale jak odczytywać to nie mam pojęcia. według książki w tych komendach liczby są traktowane jako dziesietne z przecinkiem miedzy 7 i 6 bitem, ale co to znaczy tego już nie piszą (bo niby 00000010 to oznacza 0,2? czy cos innego i wtedy można by było mnozyć max razy 1,127-11111111? nie mam pojecia). robiłem próby na symulatorze ale wychodziły mi liczby, które nie wiem jak połaczyć z faktycznym wynikiem. jeśli ktos cos wie na ten temat to prosze o radę, ewentualnie o jakiś sposób dzielenia ale w asemblerze byłoby mi to potrzebne do przeliczenia wyników z ADC do wyswietlania na LCD-chyba że ktoś ma jakiś pomysł jak przerobić wynik z ADC od 0 do 1023 na wartość wyświetlaną od -15,00V do +15,00V. dzieki.

Zamykam. - arnoldziq
Back to top
   
Gavian
Poziom 12
Poziom 12


Joined: 28 Oct 2002
Posts: 85
Location: Bielsko

Post#2 20 Apr 2004 20:28   

Re: problem z asemblerem


Do dzielenia liczb w asemblerze bez znaku służy komenda div lub idiv.
Formaty
DIV reg
DIV mem

Dzielna musi być w AX lub DX:AX lub EDX:EAX.
Dla AX wynik jest w AL a reszta w AH (operandy 8bit)
Dla DX:AX wynik w AX reszta DX (operandy 16 bit)
Dla EDX:EAX wynik w EAX reszta w EDX (operandy 32 bit)

Do dzielenia ze znakiem służy idiv

Jak chcesz się bawić z FPU to załączam kilka materiałów o zmiennoprzecinkowych liczbach i FPU.



fpu.rar
 Filename:  fpu.rar
Download
 Contents:  PC Assem...age.doc , konwersje.txt , p5optima.txt , index.htm , konwersje , PC Assem...anguage , po2
See all...
 Filesize:  421.71 KB
 Punkty:  0.82 = 0.492 for transfer + 0.328 for the user (set automatically)

Back to top
   
Google

Google Adsense


Post# 20 Apr 2004 20:28   





Back to top
   
elektryk
Poziom 26
Poziom 26


Joined: 25 Apr 2002
Posts: 11092

Post#3 20 Apr 2004 22:08   

Re: problem z asemblerem


lukaspaw wrote:
są komendy takie jak FMUL i FMULS ale kompletnie nie wiem jak ich używać, chociaż to jeszcze-bo mam ze dwa przykłady, ale jak odczytywać to nie mam pojęcia. według książki w tych komendach liczby są traktowane jako dziesietne z przecinkiem miedzy 7 i 6 bitem, ale co to znaczy tego już nie piszą (bo niby 00000010 to oznacza 0,2? czy cos innego i wtedy można by było mnozyć max razy 1,127-11111111? nie mam pojecia). robiłem próby na symulatorze ale wychodziły mi liczby, które nie wiem jak połaczyć z faktycznym wynikiem.
To są rozkazy koprocesora który operuje na liczbach w postaci mantysy i wykładnika, najpierw trzeba je załadować do FPU a potem dopiero wykonywac rozkazy, do dzielienia stałoprzecinkowego polecam wspomniany rozkaz DIV
Back to top
   
Google

Google Adsense


Post# 20 Apr 2004 22:08   





Back to top
   
lukaspaw
Poziom 12
Poziom 12


Joined: 10 Apr 2003
Posts: 100

Post#4 Post from the author of the topic 21 Apr 2004 01:57   

Re: problem z asemblerem


ale czy to na pewno są komendy do mikrokontrolera, jak na razie przegladnołem kilka książek i takich nie znalazłem (chodzi konkretnie o mikrokontroler ATMELa)
Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 21 Apr 2004 01:57   





Back to top
   
elektryk
Poziom 26
Poziom 26


Joined: 25 Apr 2002
Posts: 11092

Post#5 21 Apr 2004 16:43   

Re: problem z asemblerem


lukaspaw wrote:
ale czy to na pewno są komendy do mikrokontrolera, jak na razie przegladnołem kilka książek i takich nie znalazłem (chodzi konkretnie o mikrokontroler ATMELa)
A gdzie kolega napisał że to ma być mikrokontroler? Podane rozwiązania są do procesora x86.
Back to top
   
lukaspaw
Poziom 12
Poziom 12


Joined: 10 Apr 2003
Posts: 100

Post#6 Post from the author of the topic 22 Apr 2004 01:08   

Re: problem z asemblerem


początkuje w programowaniu i robie zasilacz sterowany cyfrowo. wszystko mi chodzi od ustawiania napięcia ,ograniczenia pradowego jak i przetworników ADC. zostało mi tylko napisać procedure do obsługi tego nieszczęsnego LCD.wszystkie pomysły jakie mi przychodza do głowy wymagaja dzielenia (ewentualnie mnożenia z przecinkami) i jak na razie siedze nad tym już tydzień i nie wiem jak ruszyć. gdyby bity z ADC zmieniały się równomiernie co 1 na np. 0,1V nie byłoby problemu ale u mnie na 0,1V jest ich 3,12 wiec musiałbym jakoś je mnożyć czy dzielić przez ułamki.
Back to top
   
djgod
Poziom 2
Poziom 2


Joined: 22 Apr 2004
Posts: 2

Post#7 22 Apr 2004 21:01   

Re: problem z asemblerem


to moze



PROG2AA.zip
 Filename:  PROG2AA.zip
Download
 Contents:  PROG2AA.asm
See all...
 Filesize:  1.98 KB
 Punkty:  0.00

Back to top
   
h-doc
Poziom 21
Poziom 21


Joined: 02 Feb 2003
Posts: 1219

Post#8 22 Apr 2004 21:46   

problem z asemblerem


potrzebujesz odwzorowania:
0 = -15.00
1023 = +15.00

Najpierw pozbędziemy się kropki dziesiętnej:
0 = -1500
1023 = +1500

Teraz pozbędziemy się znaku:
0 = 0
1023 = 3000

Przekształcenie sprowadza się więc do pomnożenia wartości z ADC przez 2,93255132.
Pomnóżmy tę liczbę przez 256, otrzymamy 750,7331378, w przybliżeniu 751.

Mamy zatem mnożenie bez znaku dwóch liczb CAŁKOWITYCH dwubajtowych
(pierwsza z zakresu 0..1023 a druga to 751)

Wynik dzielisz przez 256 (czyli odrzucasz najmłodzy bajt wyniku, najstarszego też nie bierzesz, bo jest on zawsze 0).

Wynik masz zatem w dwóch środkowych bajtach i jest to liczba z zakresu 0..3000


Teraz odejmujesz 1500 i otrzymujesz zakres -1500..+1500

Dokonujesz konwersji bin->bcd i możesz to wrzucać na LCD.

Uwaga! Podana procedura obarcza wynik pewnym błędem - żeby go zmniejszyć można przeskalować współczynnik proporcjonalności (2,93255132) o większą liczbę niż 256.
Back to top
   
lukaspaw
Poziom 12
Poziom 12


Joined: 10 Apr 2003
Posts: 100

Post#9 Post from the author of the topic 23 Apr 2004 00:49   

Re: problem z asemblerem


a czy jest wogule w asemblerze dzielenie przez inne liczby niż 2 i jej wielokrotności bo znalazłem min. ldi r16,30/3 ale tylko tą komenda
Back to top
   
lukaspaw
Poziom 12
Poziom 12


Joined: 10 Apr 2003
Posts: 100

Post#10 Post from the author of the topic 23 Apr 2004 03:28   

Re: problem z asemblerem


dzieki za ZIP-a i RAR-a znowu troche wiadomosci sie zdobyło.zastanawiam sie nad sposobem H-DOC-a.ciekawy sposób- daje w końcu dla powiedzmy 1023bitów liczbe 1500 (bład o 1 ale to sie da poprawić)zapisana binarnie, czyli 101 1101 1100 (5 13 i 12)tylko jak to przetworzyć na BCD, bawiłem sie z binarnych na decymalne i hex-y oraz odwrotnie a o BCD znam zasade ich tworzenia z dziesietnych a jeśli chodzi o zamiane z binarnych to w ksiażce znalazłem tylko ze to cholernie cieżko wiec tego nie opisują. (ja kombinowałem wcześniej zeby dzielić te 1500 przez 1000 100 10 i 1 a potem dodać sobie do kazdego 48 i majac ASCII wysłać na LCD-no ale te dzielenie). mógłby mi ktoś wytłumaczyć jak to sie robi z binarnych na BCD?
Back to top
   
h-doc
Poziom 21
Poziom 21


Joined: 02 Feb 2003
Posts: 1219

Post#11 23 Apr 2004 09:45   

problem z asemblerem


Już kiedyś pisałem tutaj o konwersji bin->bcd. Są na to specjalne algorytmy. Ponieważ nigdy mi się nie chce ich szukać, konwersję przeprowadzam metodą łopatologiczną:
1. Odejmuję od zadanej liczby 1000 tyle razy, aż uzyskam wynik ujemny. Liczba odejmowań (pomniejszona o jeden) daje cyfrę tysięcy.
2. Koryguję liczbę po odejmowaniu (dodając z powrotem 1000, żeby uzyskać liczbę dodatnią) i odejmuję setki i zliczam ile razy te setki odjąłem aż do uzyskania liczby ujemnej. W ten sposób dostaję cyfrę setek.
3. i tak dalej aż do uzyskania jedności.
Back to top
   
Google

Google Adsense


Post# 23 Apr 2004 09:45   





Back to top
   
lukaspaw
Poziom 12
Poziom 12


Joined: 10 Apr 2003
Posts: 100

Post#12 Post from the author of the topic 26 Apr 2004 00:58   

Re: problem z asemblerem


panowie dzieki za rady już mi zaczyna powoli wszystko działać, parę korekt w srodku programu i jest ok.jeszcze raz dzieki
Back to top
   
Post new topic  This topic is locked      Main Page -> Forum Index -> Programming Generally -> [Assembler] Mnożenie i dzielenie.
Page 1 of 1
Similar topics
Dzielenie assembler AVR - attiny2313 (5)
Kalkulator w C źle liczy: dodawanie, mnożenie, dzielenie (3)
Mnożenie i dzielenie wielobajtowe asm 8051 - przykłady? (3)
algorytmy prostych operacji (mnożenie, dzielenie itp.) (5)
Programowe dzielenie, mnożenie impulsów. [BASCOM] (32)
[Asembler]Mnożenie i dzielenie liczb (2)
Assembler (DSM-51) dodawanie, mnożenie, komparator. (2)
[Assembler][Z80] Mnożenie dwóch liczb. (4)
Assembler 8051 dzielenie 16bitowe (10)

Page generation time: 0.21 seconds


FAQ || Administrator || Moderators || Widgets and banners || Contact
elektroda.pl topic RSS feed