| Author |
Message
|
lukaspaw Poziom 12

Joined: 10 Apr 2003 Posts: 100
|
#1
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

Joined: 28 Oct 2002 Posts: 85 Location: Bielsko
|
#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.
| 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

|
#
20 Apr 2004 20:28 |
|
|
|
|
|
| Back to top |
|
 |
elektryk Poziom 26

Joined: 25 Apr 2002 Posts: 11092
|
#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

|
#
20 Apr 2004 22:08 |
|
|
|
|
|
| Back to top |
|
 |
lukaspaw Poziom 12

Joined: 10 Apr 2003 Posts: 100
|
#4
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

|
#
21 Apr 2004 01:57 |
|
|
|
|
|
| Back to top |
|
 |
elektryk Poziom 26

Joined: 25 Apr 2002 Posts: 11092
|
#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

Joined: 10 Apr 2003 Posts: 100
|
#6
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

Joined: 22 Apr 2004 Posts: 2
|
#7
22 Apr 2004 21:01 Re: problem z asemblerem |
|
|
|
to moze
|
|
| Back to top |
|
 |
h-doc Poziom 21

Joined: 02 Feb 2003 Posts: 1219
|
#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

Joined: 10 Apr 2003 Posts: 100
|
#9
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

Joined: 10 Apr 2003 Posts: 100
|
#10
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

Joined: 02 Feb 2003 Posts: 1219
|
#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

|
#
23 Apr 2004 09:45 |
|
|
|
|
|
| Back to top |
|
 |
lukaspaw Poziom 12

Joined: 10 Apr 2003 Posts: 100
|
#12
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 |
|
 |