Stránka 1 z 1
PIC 30F3013
Napsal: 13 bře 2013, 09:06
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.
Napsal: 13 bře 2013, 11:03
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)
Napsal: 13 bře 2013, 11:20
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í.
Napsal: 13 bře 2013, 22:18
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.