Uneori, când scrieți programe, trebuie să efectuați operații aritmetice simple cu numere multibyte. Cu numere de un singur octet, totul este simplu, adăugarea și scăderea sunt efectuate de comenzile standard addwf, addlw, subwf, sublw, pentru numerele cu mai multe octeți va trebui să scrieți mici subrutine. Voi vorbi doar despre operațiuni întregi, fără părți fracționare.
În textul articolului și în cod, voi folosi prefixele la numele registrelor pentru a facilita parsarea numerelor de înregistrare superioare și inferioare. Mă voi limita la numerele de patru octeți, prefixele corespunzătoare, începând de la registrul superior la cel minor: HH, HL, LH, LL.
Să considerăm cea mai simplă variantă de adăugare a unui număr de două octeți și de un octet. Numărul de două octeți este reprezentat de registrele varLH (high-byte) și varLL (low byte), un număr de un octet din registrul tmpLL. Mai întâi, se adaugă registrele inferioare ale ambelor numere, aceasta este varLL, iar singurul registru este tmpLL în cazul unui număr de un singur octet. Apoi, verificăm o posibilă depășire a lui varLL ca rezultat al adunării (transferul celui mai mare bit), folosind bitul C al registrului STATUS. Dacă a existat o depășire (C = 1), creșteți varianta superioară varLH, altfel (C = 0) nu face nimic. În cazul unui număr de trei octeți (varHL, varLH, varLL), după incrementarea registrului varLH, este necesar să verificați depășirea cu comanda incfsz. În cazul în care are loc o depășire, creșteți cel mai înalt registru varHL în consecință.
În cifre multibyte de adiție, de exemplu doi octeți (varLH, varLL) + (tmpLH, tmpLL), așa cum a spus mai întâi rabatați registre inferioare și varLL tmpLL, varLL registru și preaplin este verificat ca urmare a adăugării, a cărei prezență este incrementată senior registru varLH. a adăugat următor și registrele mai vechi varLH tmpLH, aici nu verificare este efectuată în cazul în care este cunoscut faptul că rezultatul plus nu depășește numărul de doi octeți (valoare 65535). VarLH verificare preaplin registru, trebuie făcută dacă primul număr trehbaytnoe (varHL, varLH, varLL) și rezultatul adăugării depășește numărul 65535. În principiu, toate și în adăugarea zecimală a unei coloane pe hârtie.
Mai jos sunt codurile de subrutine pentru diferitele variante de adăugare. Numerele trebuie mai întâi încărcate în registrele corespunzătoare înainte de a apela subrutina, de asemenea, rețineți că rezultatul adăugării nu trebuie să depășească valoarea maximă pentru cel mai mare termen, altfel vom obține un rezultat greșit. De exemplu, dacă adăugați un număr de doi octeți și unul de byte, rezultatul nu trebuie să depășească valoarea maximă pentru un număr de două octeți - 65535:
hmm. În AVR pentru adăugarea numerelor multibyte există o comandă convenabilă - adc - adunarea a două numere ținând cont de pavilionul de transfer. Dacă adăugarea precedentă sa încheiat cu o depășire, atunci transferul va fi adăugat automat la cele două sume.
De exemplu, pentru o adăugare de patru octeți:
adăugați tempLL, varLL
adc tempLH, varLH
adc tempHL, varHL
adc tempHH, varHH
Dar când adăugați numere de mărimi diferite, nu se rotește, și va trebui să faceți același lucru ca în vârfuri))
În AVR-ul meu, puteți adăuga numere de diferite dimensiuni, luând în considerare transferul, de exemplu, adăugând un număr de patru octeți și un număr de doi octeți:
adăugați varLL, tmpLL
adc varLH, tmpLH
adc var HL, nr
adc varHH, nr
unde nol este un registru unde numărul 0
În vârfurile de adăugare, există numai 2 comenzi: addwf - adăugați conținutul bateriei cu orice registru și adăugați - adăugați conținutul bateriei cu o constantă, aceeași pentru scădere.
Nu uitați că în vârfurile de doar 35 de instrucțiuni în loc de sute de comenzi de la AVR)
Deci, este posibil să facem, dacă nu este păcat să alocăm un registru suplimentar pentru stocarea zero. Totul depinde de complexitatea programului și, uneori, fiecare registru este în cont.
Fantezii matematice, programe cool, pentru uz propriu, ceea ce aveți nevoie, Vă mulțumim pentru informațiile corecte.