Wątek przeniesiony 2018-11-07 15:37 z Inne języki programowania przez Marooned.

[Asembler] Dodawanie liczb

0

Za zadanie mam napisać program na mikrokontroler 8051, który sumuje 2 liczby 8 bitowych a wynik w postaci dziesiętnej wyświwtla na wyświetlaczu LED. Napisałem program, który sumuje mi dwie liczby i wyświetla wynik tylko gdy wynik jest 2 cyfrowy. Mam problem z napisaniem programu gdy wynik jest 3 cyfrowy, czyli dodawanie jest z przeniesienm np. FF+FF powinno wyświetlić 510. Proszę o jakąś podpowiedź. Używam edsim51

MOV 30h, #11000000B   ; 0 
MOV 31h, #11111001B   ; 1
MOV 32h, #10100100B   ; 2
MOV 33h, #10110000B   ; 3
MOV 34h, #10011001B   ; 4
MOV 35h, #10010010B   ; 5
MOV 36h, #10000010B   ; 6
MOV 38h, #10000000B   ; 8
MOV 39h, #10010000B   ; 9 
        
MOV r0, #7dh
mov r1, #4h
       
MOV a, r0      
add a, r1
mov b, #0Ah
div AB

petla:

next0:
CJNE a, #0, next1
mov p1, 30h  
jmp koniec

next1:
CJNE a, #1, next2
mov p1, 31h 
jmp koniec

next2:
CJNE a, #2, next3
mov p1, 32h
jmp koniec

next3:
CJNE a, #3, next4
mov p1, 33h  
jmp koniec

next4:
CJNE a, #4, next5
mov p1, 34h 
jmp koniec

next5:
CJNE a, #5, next6
mov p1, 35h 
jmp koniec

next6:
CJNE a, #6, next7
mov p1, 36h
jmp koniec

next7:
CJNE a, #7, next8
mov p1, 37h 
jmp koniec

next8:
CJNE a, #8, next9
mov p1, 38h 
jmp koniec

next9:
CJNE a, #9, next0
mov p1, 39h 
jmp koniec

koniec:  
mov a, b 
clr p3.3 
setb p3.4   
jmp petla
0

chodzi ci o liczby większe od 255?

Bo 255 to liczba 3 cyfrowa, ale 1 bajt może mieć max od 0 do 255.

0

Do 21 jak napiszesz coś więcej, to ci pomogę bo idę grać w cs go.

Liczby możesz trzymać jako znaki tekstowe np. 63 to a.

Lub jako binarne 0x10, to 16.

Anyway konwertowanie z dwójkowego na dzisiętny reszty z dzielenia dla każdej z liczby czyli podzielonej przez 10, 100, 1000 przez wszystkie liczby + offset znaku zero daje ci liczbę którą możesz wypisać.

0

To że podzielić przez 10, 100 itd mogę to wiem, problem bardziej pojawia się gdy jest ustawiona flaga bo wówczas jestem 256 do tyłu -> jak dodamy np. FF + FF to mamy 1FE - więc ustawia mi flagę i mam FE czyli 254. Na wyświetlaczu wyświetli mi 254, a powinno 510 w moim rozumieniu tego zadania.

0

A jak wyświetlasz te dane?

Jeśli nie chcesz mieć wyniku ujemnego czyli Signed Int, to poinformuj (a)/(A)ssembler/linker/kompilator, że zależy Ci tylko na wyniku dodatnim, czyli Unsigned Int.

Jeśli używasz funkcji z wyższych poziomów, to wtedy byłoby mniej więcej coś takiego:

format: db "%d",0 ;Signed Int
format: db "%u",0 ;Unsigned Int

Jeśli chodzi o to, jak to działa, to postaram się wytłumaczyć. Ostatni bit, np. z 16-bitowego rejestru oznacza bit znaku (Signed Bit). Liczysz jaką wartość ma ten bit znaku, a ma 32,768. Załóżmy, że ustawiasz formatowanie na Signed Int, czyli w rejestrze np. AX znajduje się taka wartość -32,768; jeśli dałbyś formatowanie %u, to byłaby to liczba dodatnia, ale my chcemy rozpatrzyć ten pierwszy przypadek dla liczby ujemnej. Czyli -32768 to binarnie taka liczba:

1000 0000 0000 0000

Teraz jakikolwiek bit ustawiony na jakiejkolwiek pozycji (15-bit jest już ustawiony na 1 (bit-znaku)) dodaje do tej liczby jakąś wartość, np. gdy ustawimy bit 0 na 1, to wtedy ta liczba będzie wyglądać tak:

1000 0000 0000 0001 (bin) oraz -32767 (dec)

Inny przykład, np. taki:

1000 0000 0000 1111 (bin) oraz -32753 (dec)

Myślę, że się nie pomyliłem w obliczeniach.

Na koniec jeszcze dodam, że bity numeruje się od zera (0), od prawej strony do lewej, czyli tak:

3-bit 2-bit 1-bit 0-bit
1 0 0 0

W tym przykładzie bit-0, bit-1, bit-2 jest ustawiony na 0, a bit-3 na 1. Liczba ta decymalnie wynosi osiem (8).

Edit: Teraz zauważyłem, że pytasz o sprzęt z inną architekturą processora, bo myślałem, że pytasz o 8086 (x86).

1 użytkowników online, w tym zalogowanych: 0, gości: 1