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

[Atmega8] Assembler dzielenie 32b / 32b

Asmodat 21 Gru 2011 22:40 1759 5
REKLAMA
  • #1 10289934
    Asmodat
    Poziom 10  
    Szukałem w googlarce ale znalazłem co najwyżej 24b/16b

    Ma ktoś może jakiś pomysł jak to zrobić, jakieś źródło, kod, cokolwiek przydatnego ?

    Mógłbym dodawać dzielną do siebie samej tak długo aż wynik przewyższy dzielnik i potem zająć się resztą ale trwało by to wieki ...
  • REKLAMA
  • REKLAMA
  • Pomocny post
    #3 10293547
    asembler
    Poziom 32  
    
    ;DZIELENIE LICZB 4 BAJTOWYCH R9..6 PRZEZ R5..2
    ;WYNIK W R9..6
    
    SDZIELI   LD R16,0
              LD R17,0
              LD R18HL,R16HL
              LD R20,4*8+1
              JR DZ46
    
    DZ410     ROL R16
              ROL R17
              ROL R18
              ROL R19
    
              CPC R16,R2
              CPC R17,R3
              CPC R18,R4
              CPC R19,R5
    
              JC DZ46
    
              SUB R16,R2
              SBC R17,R3
              SBC R18,R4
              SBC R19,R5
    
    DZ46      ROL R6
              ROL R7
              ROL R8
              ROL R9
    
              DEC R20
              JNZ DZ410
    
              COM R6
              COM R7
              COM R8
              COM R9
              RET
    
  • REKLAMA
  • #4 10295452
    Asmodat
    Poziom 10  
    @asembler
    Jaka jest precyzja tego dzielenia ?, ile miejsc po przecinku,

    bo w precyzji do liczb dziesiętnych to tak jak w pierwszym pisałem poście, zrobiłem taki paskudny kod, a przydało by mi się chociaż 1, 2 miejsca po przecinku:



    ;               L                 R
    ;Compare R12,R13,R14,R15 && R16,R17,R18,R19
    Cp_R12R19_32b:
    
     cp R15, R19
     breq cp32r_same3
     brlo cp32r_rg
     rjmp cp32r_lg
    
     cp32r_same3:
     cp R14, R18
     breq cp32r_same2	
     brlo cp32r_rg		
     rjmp cp32r_lg
    
     cp32r_same2:
     cp R13, R17 
     breq cp32r_same1
     brlo cp32r_rg
     rjmp cp32r_lg
    
     cp32r_same1:
     cp R12, R16 
     breq cp32r_same
     brlo cp32r_rg
     rjmp cp32r_lg
    
    
     cp32r_same:
     sez	;Z = 1
     rjmp cp32r_end
     cp32r_rg:
     clz	;Z = 0
     sec	;C = 1
     rjmp cp32r_end
     cp32r_lg:
     clz	;Z = 0
     clc	;C = 0
    
    
    cp32r_end:
    ret
    ;-------------- CP END
    
    
    
    ;-------------- ADD START
    ;                 R                 L
    ;Add L to R R16,R17,R18,R19 && R20,R21,R22,R23
    Add_32b:
    
     add R16, R20
     adc R17, R21
     adc R18, R22
     adc R19, R23
     brcc NoOverflowAdd32b
     sev
     rcall Add_32b_end
     NoOverflowAdd32b:
     clv
    
    Add_32b_end:
    ret
    ;-------------- ADD END
    
    
    ;-------------- DIV START
    ;result in R0
    Div_32b:
     clr R0 ;counter
    
     loopDiv32b:
     	rcall Cp_R12R19_32b
     	breq div32vs_eq
     	brcs div32vs_rg
    
     	inc R0
     	rcall Add_32b
      rjmp loopDiv32b
    
    
     div32vs_eq:
     inc R0
    
     div32vs_rg: 
    ret
    ;-------------- DIV END
  • REKLAMA
  • Pomocny post
    #5 10295943
    kedzi1
    Poziom 18  
    Najpierw poczytaj co to są liczby stałoprzecinkowe i zmiennoprzecinkowe. Takie dzielenie jak tu zostało zaprezentowane jest na liczbach stałoprzecinkowych. W takim przypadku to ty decydujesz gdzie będzie przecinek i czy w ogóle będzie.
    Po za tym powtórzę się za kol koodpl: po co takie rzeczy rzeźbić w asm?
  • Pomocny post
    #6 10296166
    asembler
    Poziom 32  
    9 miejsc znaczących
REKLAMA