16bitx16bit-multiplikation mit c166(16bit-Mikrokontroller)

Peter Muthesius <newsname@gmx.de> schrieb:
... ein gar grauslich durch Zeilenumbruch zerstückeltes Programm ....

Hallo,

was sagt Du dann erst zu einem 'normal' aussehendem Quelltext? Der ja
vergleichsweise strotzt vor lauter Zeilenumbrüchen?

Sich schmunzelnd fragend - und nicht widerstehen könnend - Peter
Bester Peter, ich bezog mich darauf, dass mein News-Reader
auf 76 Zeichen eingestellt war, und daher beim Posten ohne Sinn und
Verstand einfach Zeilenumbrüche eingefügt hatte, wo sie syntaktisch
nicht korrekt waren.

Ich hoffe doch, dass Du Zeilenumbrüche nur dort einfügst, wo
sie die Korrektheit deines Programms nicht negativ beeinflussen. :)

Gruß
Gerd
 
schon klar. Sorry, ich habe wohl den Smiley vergessen und das "SCNR" durch
Entabkürzung und Übersetzung verschleiert...

Ciao - Peter
 
"Peter Muthesius" <newsname@gmx.de> schrieb:

was sagt Du dann erst zu einem 'normal' aussehendem Quelltext? Der
ja vergleichsweise strotzt vor lauter Zeilenumbrüchen?
Nee, wenn Du seine C-Bruchstücke versucht hättest zu compilieren,
wüßtest Du, was er mit den grauseligen Zeilenumbrüchen meinte. Die
haben nämlich zu Syntaxfehlern geführt, da teilweise mitten in einer
Zahl umgebrochen worden ist...
--
Jörg Wunsch

"Verwende Perl. Shell will man können, dann aber nicht verwenden."
Kristian Köhntopp, de.comp.os.unix.misc
 
"Robert Theiß" <Robert.Theiss@rwth-aachen.de> wrote:
: Nabend,
: eigentlich sollte sich meine Frage an ein C166-Forum richten, aber ich hab
: nur ein schlecht besuchtes gefunden.
: Ich möchte 2 signed int's miteinander multiplizieren und das ergebnis auf
: einem signed long abspeichern.
: Dabei kommt immer grober Mist raus :(

: C-code:
: signed long a;
: a = (-32666*32666);

: das ergebnis ist dann -10404
Das ist AFAIK normal, da der Compiler den ints nicht ansieht, wieviele
Stellen sie haben. Funktionieren sollte aber ein explizites cast mit
(long) bzw. eine Zuweisung und dann die Multiplikation.
Also entweder:
a=((long)-32666*(long)32666);
oder
a=-32666;
a*=32666;
 
Jan Reucker schrieb:
Was falsch laufen kann wurde im Thread ja schon lang und
breit besprochen. Vielleicht noch eine Anregung: Bietet der Keil
vielleicht auch intrinsische C-Funktionen, die direkt auf
die MUL/DIV-Anweisungen des C16x umgesetzt werden? Das kenne
ich vom Tasking-Compiler. Ist zwar nicht portabel, aber man
weiss an der Stelle dann wenigestens genau, wieviel Bits mit
wieviel Bits multipliziert werden und was als Ergebnis dabei
herauskommt.
Hallo,

Du kannst bei Keil Assemblerbefehle in C Code einfügen,
#pragma asm
#pragma endasm

so habe ich mir schon mal eine 24 Bit Integer Arithmetik gebaut um lange
Zählerwerte zu verarbeiten.

Bye
 
Am Tue, 27 Jan 2004 09:20:06 +0100 schrieb Uwe Hercksen:

Du kannst bei Keil Assemblerbefehle in C Code einfügen,
#pragma asm
#pragma endasm
Klar, das geht beim Tasking auch. Nur muss man hier halt genau
hinschauen, was man mit welchem Register macht, oder man
muss Pseudoregister verwenden, was den Compiler u.U. zu
Umkopierorgien zwingt. Die Intrinsic-Befehle finde ich da
deutlich sicherer. Mit #pragma asm ... endasm kann man z.B.
wunderbar die Auto-Frame-Erzeugung einer Interrupt-Funktion
aushebeln, da der asm-Code am C-Compiler vorbei an den
Assembler gereicht wird. Bei optimierter Frame-Erzeugung
spart sich der Compiler dann z.B. die Sicherung der
Multiplikationsregister, wenn ausserhalb des #pragma keine
Multiplikationsanweisung steht. Das führt zu teuflisch gut
versteckten Bugs...

MfG
Jan

--
Jan Reucker
email: jan dot reucker at web dot de
web: http://www.reucker-online.de
 

Welcome to EDABoard.com

Sponsor

Back
Top