logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Szybka procedura dzielenia przez 100 w ASM 51 dla 12-bitowej liczby

bolek 01 Wrz 2006 19:55 1487 6
  • #1 2977662
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    Na gwałt potrzebuje procedury w asm 51 która SZYBKO podzieli mi liczbe. Wartość wejściowa to maksymalnie 12 bitów, a dzielona będzie zawsze przez 100 (dziesiętnie). Nie interesuja mnie rady- nie mam ochoty już nad tym ślęczeć... ale na koniec możemy podyskutować publicznie . Sposób dowolny, liczy się tylko szybkość obliczenia wyniku. Aktualnie procedura zajmuje ok 400-500cykli zegara. Potrzebuje zejść jak najniżej, ale myślę że 150 cykli będzie dobrym wynikiem.
    Stawiam browara, lub coś równie zadowalającego :)
  • Pomocny post
    #2 2977717
    Father
    Poziom 26  
    Posty: 681
    Pomógł: 88
    Ocena: 13
    	MOV	R1,#0XXH		;Upper byte
    	MOV	R0,#0XXH		;Lower byte
    	MOV	R2,#100
    
    DZIEL:
    	PUSH	7
    	MOV	R7,#9
    	MOV	A,R1
    DIV0:	MOV	R1,A
    	MOV	A,R0
    	RLC	A
    	MOV	R0,A
    	DJNZ	R7,DIV1
    	CPL	A				;Wynik w A
    	POP	7
    	RET
    DIV1:
    	MOV	A,R1
    	RLC	A
    	CLR	C
    	SUBB	A,R2
    	JNC	DIV0
    	ADD	A,R2
    	SJMP	DIV0
    
  • #3 2977787
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    Wedle symulatora działa, zobaczymy jak w praktyce. numer konta proszę przesłać na PW.

    Ma ktos jeszcze cos ciekawego do dodania? :)
  • #4 2977837
    lbugiera
    Poziom 21  
    Posty: 348
    Pomógł: 45
    Ocena: 5
    Ja bym tylko dodał, że 150 cykli na 51 będzie ciężko osiągnąc, ponieważ procedurka podawana przez Atmela, zoptymizowana na prędkość, dzielaca 16 bit przez 16 bit bez znaku na AVR'ACH zajmuje 173 cykle (worst-case).
    Poniewaz w 51 trzeba wszystko przepchac przez akumulator to raczej bedzie gorzej. Poza tym do dzielenia przez 100, świetnie nadaje się zamiana na BCD. Dwie najmniej znaczące liczby BCD pomijasz i wszystko.

    Powodzenia.
    Boogie.
  • #5 2977865
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    No procedura Fathera idzie w 148 cykli, ale jak masz coś ciekawego to też możesz pokazać.
  • #6 2977883
    Father
    Poziom 26  
    Posty: 681
    Pomógł: 88
    Ocena: 13
    Chyba da się ją jeszcze lekko przyśpieszyć, bo nie myślałem o optymalizacj jak ją kiedyś pisałem :) Mogą być punkty na elektrodzie zamiast twardej waluty ;)
  • #7 2977910
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    nie ma sprawy, jutro wkleje procedurke i zobacze jak to śmiga. Jak chce ci się odchudzać to nie ma sprawy...

Podsumowanie tematu

✨ Dyskusja dotyczy optymalizacji procedury dzielenia 12-bitowej liczby przez 100 w asemblerze dla mikrokontrolera 8051 (ASM 51). Autor poszukuje szybkiego rozwiązania, które znacząco skróci czas wykonania z obecnych 400-500 cykli zegara do około 150 cykli. Zaproponowano kod dzielący przez 100 wykorzystujący rejestry R0, R1 i R2 oraz pętle i operacje bitowe, który według symulatora działa poprawnie i osiąga około 148 cykli. Wskazano jednak, że osiągnięcie 150 cykli na 8051 jest trudne ze względu na architekturę, gdzie wszystkie operacje muszą przechodzić przez akumulator. Poruszono także alternatywne podejście polegające na konwersji liczby do formatu BCD i pominięciu dwóch najmniej znaczących cyfr, co może uprościć dzielenie przez 100. Wymieniono również porównanie do procedur dzielenia 16-bitowych liczb na mikrokontrolerach AVR, które zajmują około 173 cykli, co podkreśla wyzwania optymalizacji na 8051. Autorzy dyskusji deklarują chęć dalszej wymiany kodów i optymalizacji, oferując symboliczne nagrody za efektywne rozwiązania.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA