Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięRobię błąd w prostym programie
Moderatorzy:Jacek Bogusz, Moderatorzy
Piszę program w Avr asembler. Program jest prosty, ale robie jakiś błąd, którego nie widzę. Czy ktoś mogłby to sprawdzić?
Zmienne V,H,T od 0 do 90
;W=V+100*(H+100*T)
;pomocniczy rejestr R30
.def A1 = R16; A1 mlodszy bajt zmiennej A
.def A2 = R17; A2 starszy bajt zmiennej A
.def A3 = R18;
.def B1 = R19; B1 mlodszy bajt zmiennej B
.def B2 = R20; B2 starszy bajt zmiennej B
.def B3 = R21;
.def T = R25;
.def H = R26;
.def V = R27;
.def MSB = R2
.equ ccc = $45
zmienne:
ldi T,23
ldi H,36
ldi V,47
ldi R30,100
oblicz_adres:
mul T,R30;
; w R1 mamy bardziej znaczacy bajt =5
; w R0 mniej znaczacy bajt =220
; R1 R0
; 101 11011100
; w sumie 10111011100 czyli 1500
mov A1,R0
mov A2,R1
add A1,H
adc A2,B2
mul A1,R30
mov B1,R0
mov B2,R1
mul A2,R30
mov A1,R0
mov A2,R1
ldi R29,0
add A1,B2
adc R23,R27
cpi R23,0
breq skok
ldi R29,1
add A2,R29
skok:
add B1,V
;Wynik znajduje sie w A2 - najstarszy bajt; A1 - mlodszy, B1 - najmlodszy
koniec:
rjmp koniec
Zmienne V,H,T od 0 do 90
;W=V+100*(H+100*T)
;pomocniczy rejestr R30
.def A1 = R16; A1 mlodszy bajt zmiennej A
.def A2 = R17; A2 starszy bajt zmiennej A
.def A3 = R18;
.def B1 = R19; B1 mlodszy bajt zmiennej B
.def B2 = R20; B2 starszy bajt zmiennej B
.def B3 = R21;
.def T = R25;
.def H = R26;
.def V = R27;
.def MSB = R2
.equ ccc = $45
zmienne:
ldi T,23
ldi H,36
ldi V,47
ldi R30,100
oblicz_adres:
mul T,R30;
; w R1 mamy bardziej znaczacy bajt =5
; w R0 mniej znaczacy bajt =220
; R1 R0
; 101 11011100
; w sumie 10111011100 czyli 1500
mov A1,R0
mov A2,R1
add A1,H
adc A2,B2
mul A1,R30
mov B1,R0
mov B2,R1
mul A2,R30
mov A1,R0
mov A2,R1
ldi R29,0
add A1,B2
adc R23,R27
cpi R23,0
breq skok
ldi R29,1
add A2,R29
skok:
add B1,V
;Wynik znajduje sie w A2 - najstarszy bajt; A1 - mlodszy, B1 - najmlodszy
koniec:
rjmp koniec
Ostatnio zmieniony 9 kwie 2005, o 09:44 przez darecki23, łącznie zmieniany 1 raz.
Re: Robię błąd w prostym programie
Po pierwsze, to wynik tego mnożenia jest inny. R30=100 * R25=23 -> 2300 dec = 8FC hexPiszę program w Avr asembler. Program jest prosty........
;W=V+100*(H+100*T)
;pomocniczy rejestr R30
.def A1 = R16; A1 mlodszy bajt zmiennej A
.def A2 = R17; A2 starszy bajt zmiennej A
.def A3 = R18;
.def B1 = R19; B1 mlodszy bajt zmiennej B
.def B2 = R20; B2 starszy bajt zmiennej B
.def B3 = R21;
.def T = R25;
.def H = R26;
.def V = R27;
.def MSB = R2
.equ ccc = $45
zmienne:
ldi T,23
ldi H,36
ldi V,47
ldi R30,100
oblicz_adres:
mul T,R30;
; w R1 mamy bardziej znaczacy bajt =5
; w R0 mniej znaczacy bajt =220
; R1 R0
; 101 11011100
; w sumie 10111011100 czyli 1500
(ale to nie jest w kategorii błędu).
Masz dodawanie 16-bitowe, ale rejestr B2 ma (przynajmniej w pokazanym fragmencie) niezainicjowaną zawartość i to należy traktować w kategorii błędu..........
mov A1,R0
mov A2,R1
add A1,H
adc A2,B2
Dalej nie chciało mi się już patrzeć (też mogą być błędy).
Instrukcja LDI laduje STALA do rejestru. Ty probujesz zrobic cos dziwnego. LDI T,23 ?? Co to jest ? Nie mozesz zaladowac stalej do zmiennej w ten sposob ktory napisales. W procesorze jest 32 rejestry ogolnego przeznaczenia. Ale tylko 16 (R16-R31) wspolpracuje z instrukcja LDI.
UPDATE:
Ok teraz zauwazylem ze definiujesz te rejestry, zmylilo mnie pierwsze zdanie ze V,H,T to zmienne od 0 do 90.
Pozdro
Dexter
UPDATE:
Ok teraz zauwazylem ze definiujesz te rejestry, zmylilo mnie pierwsze zdanie ze V,H,T to zmienne od 0 do 90.
Pozdro
Dexter
-> darecki23
Nie chciało mi się szukać szmaty w twoim programie, łatwiej jest napisać swoją wersję.
Potrzebuję rejestru roboczego (nazwany jest acc).
;W=V+100*(H+100*T)
.def A1 = R16; A1 mlodszy bajt zmiennej A (wyniku)
.def A2 = R17; A2 średni bajt zmiennej A (wyniku)
.def A3 = R18; A3 najstarszy bajt zmiennej A (wyniku)
.def acc=r20
.def T = R25;
.def H = R26;
.def V = R27;
ldi T,23
ldi H,36
ldi V,47
ldi R30,100
; dla tak podanych wartości zmiennych wynik wynosi (jest 3-bajtowy):
; w=47+100*(36+100*23)=233647=390AF
mul t,r30
mov a1,r0
mov a2,r1
ldi a3,0
ldi acc,0
add a1,h
adc a2,acc
mul a1,r30
mov acc,a2
mov a1,r0
mov a2,r1
mul acc,r30
add a2,r0
adc a3,r1
add a1,v
ldi acc,0
adc a2,acc
adc a3,acc
;
; i masz w rejestrach A3=3 A2=90 A1=AF
koniec:
rjmp koniec
Zastanów się na powyższą wersją, swoją wersją i błęda sam znajdziesz.
Nie chciało mi się szukać szmaty w twoim programie, łatwiej jest napisać swoją wersję.
Potrzebuję rejestru roboczego (nazwany jest acc).
;W=V+100*(H+100*T)
.def A1 = R16; A1 mlodszy bajt zmiennej A (wyniku)
.def A2 = R17; A2 średni bajt zmiennej A (wyniku)
.def A3 = R18; A3 najstarszy bajt zmiennej A (wyniku)
.def acc=r20
.def T = R25;
.def H = R26;
.def V = R27;
ldi T,23
ldi H,36
ldi V,47
ldi R30,100
; dla tak podanych wartości zmiennych wynik wynosi (jest 3-bajtowy):
; w=47+100*(36+100*23)=233647=390AF
mul t,r30
mov a1,r0
mov a2,r1
ldi a3,0
ldi acc,0
add a1,h
adc a2,acc
mul a1,r30
mov acc,a2
mov a1,r0
mov a2,r1
mul acc,r30
add a2,r0
adc a3,r1
add a1,v
ldi acc,0
adc a2,acc
adc a3,acc
;
; i masz w rejestrach A3=3 A2=90 A1=AF
koniec:
rjmp koniec
Zastanów się na powyższą wersją, swoją wersją i błęda sam znajdziesz.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 16 gości