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

Jak wykonać dzielenie dwóch liczb w asemblerze?

Przemek Elektro 13 Maj 2004 18:06 2121 8
REKLAMA
  • #1 639580
    Przemek Elektro
    Poziom 16  
    Posty: 201
    Pomógł: 4
    Ocena: 5
    jak podzielic przes siebie dwie liczy w asm?
    bo jako takiego mnemomnika to nie ma
  • REKLAMA
  • REKLAMA
  • #3 639868
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 240
    Przemek Elektro napisał:
    jak podzielic przes siebie dwie liczy w asm?
    bo jako takiego mnemomnika to nie ma
    A może by tak nas kolega oświecił o jaki procesor chodzi? Na każdy da się to zrobić podobnie jak na palcach ale niektóre mają gotowe rozkazy. Przydałaby się też informacja o tym jakie kolega liczby chce dzielić.
  • REKLAMA
  • #4 639954
    h-doc
    Poziom 27  
    Posty: 1208
    Pomógł: 57
    Ocena: 20
    można "łopatologicznie" czyli poprzez sukcesywne odejmowanie odjemnika od odjemnej, czyli tak jak dzielenie pisemne. A poza tym zawsze pozostaje coś takiego jak "div"
  • #5 639974
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    z mojej rozmowy z nim (na gg) wynika że jest to atmega8535.. div nieumiem znaleźć w helpah ani nigdzie.. więc trzeba to zrobić programowo... sukcesywne odejmowanie (w/w) albo odejmowanie z przesuwaniem bitowym (szybsza metoda)
  • REKLAMA
  • #6 640066
    Przemek Elektro
    Poziom 16  
    Posty: 201
    Pomógł: 4
    Ocena: 5
    sorka zapomniałem napisac, chodzi o AVRy...
  • #7 640112
    Przemek Elektro
    Poziom 16  
    Posty: 201
    Pomógł: 4
    Ocena: 5
    Znalazłem :D
    Jak ktos bedzie chciał to dziele sie informacja:

    
    ;***** Subroutine Register Variables
    
    .def	drem8u	=r15		;remainder
    .def	dres8u	=r16		;result
    .def	dd8u	=r16		;dividend
    .def	dv8u	=r17		;divisor
    
    ;***** Code
    
    div8u:	sub	drem8u,drem8u	;clear remainder and carry
    	
    	rol	dd8u		;shift left dividend
    	rol	drem8u		;shift dividend into remainder
    	sub	drem8u,dv8u	;remainder = remainder - divisor
    	brcc	d8u_1		;if result negative
    	add	drem8u,dv8u	;    restore remainder
    	clc			;    clear carry to be shifted into result
    	rjmp	d8u_2		;else
    d8u_1:	sec			;    set carry to be shifted into result
    
    d8u_2:	rol	dd8u		;shift left dividend
    	rol	drem8u		;shift dividend into remainder
    	sub	drem8u,dv8u	;remainder = remainder - divisor
    	brcc	d8u_3		;if result negative
    	add	drem8u,dv8u	;    restore remainder
    	clc			;    clear carry to be shifted into result
    	rjmp	d8u_4		;else
    d8u_3:	sec			;    set carry to be shifted into result
    
    d8u_4:	rol	dd8u		;shift left dividend
    	rol	drem8u		;shift dividend into remainder
    	sub	drem8u,dv8u	;remainder = remainder - divisor
    	brcc	d8u_5		;if result negative
    	add	drem8u,dv8u	;    restore remainder
    	clc			;    clear carry to be shifted into result
    	rjmp	d8u_6		;else
    d8u_5:	sec			;    set carry to be shifted into result
    
    d8u_6:	rol	dd8u		;shift left dividend
    	rol	drem8u		;shift dividend into remainder
    	sub	drem8u,dv8u	;remainder = remainder - divisor
    	brcc	d8u_7		;if result negative
    	add	drem8u,dv8u	;    restore remainder
    	clc			;    clear carry to be shifted into result
    	rjmp	d8u_8		;else
    d8u_7:	sec			;    set carry to be shifted into result
    
    d8u_8:	rol	dd8u		;shift left dividend
    	rol	drem8u		;shift dividend into remainder
    	sub	drem8u,dv8u	;remainder = remainder - divisor
    	brcc	d8u_9		;if result negative
    	add	drem8u,dv8u	;    restore remainder
    	clc			;    clear carry to be shifted into result
    	rjmp	d8u_10		;else
    d8u_9:	sec			;    set carry to be shifted into result
    
    d8u_10:	rol	dd8u		;shift left dividend
    	rol	drem8u		;shift dividend into remainder
    	sub	drem8u,dv8u	;remainder = remainder - divisor
    	brcc	d8u_11		;if result negative
    	add	drem8u,dv8u	;    restore remainder
    	clc			;    clear carry to be shifted into result
    	rjmp	d8u_12		;else
    d8u_11:	sec			;    set carry to be shifted into result
    
    d8u_12:	rol	dd8u		;shift left dividend
    	rol	drem8u		;shift dividend into remainder
    	sub	drem8u,dv8u	;remainder = remainder - divisor
    	brcc	d8u_13		;if result negative
    	add	drem8u,dv8u	;    restore remainder
    	clc			;    clear carry to be shifted into result
    	rjmp	d8u_14		;else
    d8u_13:	sec			;    set carry to be shifted into result
    
    d8u_14:	rol	dd8u		;shift left dividend
    	rol	drem8u		;shift dividend into remainder
    	sub	drem8u,dv8u	;remainder = remainder - divisor
    	brcc	d8u_15		;if result negative
    	add	drem8u,dv8u	;    restore remainder
    	clc			;    clear carry to be shifted into result
    	rjmp	d8u_16		;else
    d8u_15:	sec			;    set carry to be shifted into result
    
    d8u_16:	rol	dd8u		;shift left dividend
    	ret
    
    :D :D :D
  • #8 640338
    tprzemko
    Poziom 22  
    Posty: 413
    Pomógł: 54
    Ocena: 21
    Witam
    Udać się na stronę Atmela i na pewno znajdziesz procedury dzielenie.
    Pozdrawiam
  • #9 642994
    Kriti
    Poziom 15  
    Posty: 94
    Pomógł: 9
    Ocena: 1
    Jak przez potęgi dwójki to szybko przesuwać bity w prawo.

Podsumowanie tematu

✨ Dyskusja dotyczy sposobów wykonania dzielenia dwóch liczb w asemblerze, szczególnie na mikrokontrolerach AVR, takich jak Atmega8535. W asemblerze AVR nie ma wbudowanej instrukcji div, dlatego dzielenie należy realizować programowo. Proponowane metody to sukcesywne odejmowanie dzielnika od dzielnej, co odpowiada dzieleniu pisemnemu, lub bardziej efektywne odejmowanie z przesuwaniem bitowym. Przykładowa implementacja subroutiny dzielenia 8-bitowego została udostępniona, wykorzystująca rejestry do przechowywania reszty, wyniku, dzielnej i dzielnika oraz operacje przesunięć i odejmowań. Wskazano również, że na stronie producenta Atmel można znaleźć gotowe procedury dzielenia. Dodatkowo zasugerowano, że dla dzielenia przez potęgi dwójki można stosować szybkie przesunięcia bitowe w prawo.
Wygenerowane przez model językowy.
REKLAMA