PIC 30F3013

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
a1234567a
Příspěvky: 12
Registrován: 13 zář 2007, 00:00

PIC 30F3013

#1 Příspěvek od a1234567a »

Dobrý den,
začínám programovat tento procesor v assembleru a chtěl bych se zeptat zkušenějších jak poznám jestli instrukce počítá se znaménkem nebo bez?Například mám instrukci ADDC W0,W0,W0 a někdy se nastaví příznak N a OV a C zůstane log0. Předpokládám že jde o přetečení do znaménka. U popisu instrukcí jsem nenašel jestli počítají se znaménkem, nebo bez. Jak to tedy je, počítají všechny instrukce znaménkově, nebo záleží na operandech a nebo se to dá někde nastavit? Dále bych se chtěl zeptat jaký je přesný význam příznaků Carry a Overflow. Děkuji.
Uživatelský avatar
Atlan
Příspěvky: 4514
Registrován: 10 kvě 2004, 00:00
Bydliště: Košice

#2 Příspěvek od Atlan »

v asemblery neexistuju zaporne cisla, o vysledku ta bude informovat register a to si musis niekde poznacit ci vysledne cislo je zaporne.

Stym procakom rob v Ccku inak sa zblaznis. (res nebudes riesit taketo blbosti)
Uživatelský avatar
piitr
Příspěvky: 1003
Registrován: 19 říj 2007, 00:00
Kontaktovat uživatele:

#3 Příspěvek od piitr »

Nevím, jak je to zrovna u tohoto PICu, ale většinou (6502, 8080, 8086, PIC16F84) to bývá takto:

Ta instrukce ADD je jedna a funguje jak znaménkově (v doplňkovém kódu), tak neznaménkově.
Výsledek je totiž v obou případech stejný.
Liší se pouze to, jak poznat přetečení.
Pokud sčítáš bez znaménka, poznáš přetečení podle C=1 (C je carry).
Na tom asi není nic překvapivého.
Pokud sčítáš se znaménkem, poznáš přetečení podle O=1 (O je overflow).
Bývá tam ještě příznak N (někdy se možná značí S), do kterého se dává nejvyšší bit výsledku, takže pokud počítáš znaménkově, poznáš tak, že výsledek je záporný.
To O (overflow) se, myslím, nastavuje tehdy, pokud sečteš nezáporná čísla a vyjde záporné, nebo sečteš záporná a vyjde nezáporné.
Jinak snad nemůže nastat.
A procesor to počítá snad tak, že se přenos do nejvyššího řádu liší od přenosu z nejvyššího řádu.
To je asi dobré vědět, kdybys sčítal delší čísla pomocí více instrukcí.

Stejně se pak postupuje při porovnávání čísel.
Instrukce na porovnání je jedna - cmp, sub apod.
Pak ale použiješ jinou instrukci skoku pro znaménkové a pro neznaménkové porovnání.
Uživatelský avatar
a1234567a
Příspěvky: 12
Registrován: 13 zář 2007, 00:00

#4 Příspěvek od a1234567a »

Díky za odpověď,
teď po vysvětlení co je to overflow už je mi jasný že ADD a SUB budou fungovat stejně pro znaménkové i neznaménkové číslo. Já myslel že to musí procesor nějak vědět, protože těch výpočetních instrukcí je víc a mě dělala problém ještě instrukce porovnání se skokem CPSGT a CPSLT. Teď jsem znovu pročetl manuál a zjistil jsem že se ta instrukce jmenuje signed compare, skip if..., takže jsem podle rady vyzkoušel CP a test carry a chodí to jak potřebuju. Další výpočetní instrukce jsou dělení a násobení a tam je to také obsaženo v názvu instrukce. Takže problém vyřešen, děkuji.
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“