Jump to content
ELFORUM - Forumul electronistilor

C18 inline ASM


Recommended Posts

O situatie jenanta, dar stie cineva de ce codul:

unsigned char var1;void main(void){var1=0xaa;_asmbcf STATUS,0,0   ;Carryrlcf var1,1,0btfsc STATUS,0,0bsf var1,0,0_endasm//remaining code}
nu merge?

var1 ramane 0xaa dupa ce partea de asm este executata.

Multumesc.

Link to comment
  • Replies 7
  • Created
  • Last Reply

Top Posters In This Topic

@ sofian:

de fapt, in C18 trebuie sa scrii instructiunea asm ca la manual, cu toti parametrii sai.

bcf, complet, este

bcf registru, bit, access_bit
In plus, compilatorul de C18 nu cunoaste "C" ca fiind bitul de Carry, in sintaxa ASM ci cauta o eticheta (pe care nu o gaseste).

In concluzie, daca vreau sa scriu cod ASM inline, in loc de:

bcf STATUS,C
TREBUIE sa scriu

bcf STATUS,0,0
primul zero este bitul de carry

al doilea zero este pentru bitul de adresare.

Dupa ce am mai sapat un pic am gasit de fapt solutia, in sensul ca bitul de adresare trebuia setat. Codul corect este:

_asmbcf STATUS,0,1   ;Carryrlcf var1,1,1btfsc STATUS,0,1bsf var1,0,1_endasm
Acum, as extinde un pic intrebarea:

Cum pot muta codul ASM in alt fisier, ca de exemplu:

Fisierul C:

#include <p18cxxx.h>#include "asmstuff.h"#pragma config OSC = HS, OSCS = OFF, PWRT = OFF, BOR = OFF, WDT = OFF, CCP2MUX = OFF, LVP = OFFunsigned char var1;void main (void);void InterruptHandlerHigh (void);     //nu am mai copiat-o extern unsigned char asm_F(unsigned char);void main (){	var1=asm_f(0x00);	while (1)    {		;    }}
headerul asm:

#ifndef __ASMSTUFF_H#define __ASMSTUFF_H#include <p18cxxx.h>unsigned char asm_F(unsigned char);#endif
si fisierul ASM:

#include "P18CXXX.INC"	;processor specific variable definitionsASM_FCODE	CODEasm_F	movf INDF1, 0, 1	RETURN    	GLOBAL asm_F           ; export so linker can see it	END
la compilare dau eroarea:

Error - could not find definition of symbol 'asm_f' in file './main.o'.
De ce, cum repar asa ceva?

Multumiri anticipate.

Link to comment
Guest yo2lio

O situatie jenanta, dar stie cineva de ce codul:

unsigned char var1;void main(void){var1=0xaa;_asmbcf STATUS,0,0   ;Carryrlcf var1,1,0btfsc STATUS,0,0bsf var1,0,0_endasm//remaining code}
var1 este in access bank ?
Link to comment

C e case sensitive?

Adica asm_f nu e totuna cu asm_F.

Mda, am fost neatent... Am inlocuit cu asm_F. Degeaba, tot mesaj de eroare, dar pentru asm_F.

var1 este in access bank ?

Se pare ca la adresarea variabilei se tine cont de BSR.

Interesant ca variabilele locale nu pot fi accesate in cod asm in aceasta maniera, deoarece adresarea lor de face indirect, prin LFSR. Doar variabilele globale pot fi adresate in acest mod.

Revenind la intrebarea mea. Totusi, am scris rutinele de aceeasi maniera in care au fost scrise rutinele de delay din bibliotecile compilatorului. De ce alea merg si mizeriile mele nu?

Link to comment

Nu stiu daca asta aici e problema, da' eu pana acum de cate ori am folosit variabile/functii externe in C am facut invers decat e la tine.

Adica am definit variabila/functia intr-un fisier .c si am folosit-o cu extern in .h.

In cazul tau

#include <p18cxxx.h>#include "asmstuff.h"#pragma config OSC = HS, OSCS = OFF, PWRT = OFF, BOR = OFF, WDT = OFF, CCP2MUX = OFF, LVP = OFFunsigned char var1;void main (void);void InterruptHandlerHigh (void);     //nu am mai copiat-ounsigned char asm_F(unsigned char);void main (){   var1=asm_f(0x00);   while (1)    {      ;    }}
pentru fisieru .c

si

#ifndef __ASMSTUFF_H#define __ASMSTUFF_H#include <p18cxxx.h>extern unsigned char asm_F(unsigned char);#endif
pentru header.

 

Cred ca asta e varianta corecta (chiar daca nici asa n-o sa-ti mearga, pentru viitor), pentru ca Kernighan si Ritchie zic ca variabilele externe trebuie definite exact o data in afara oricarei functii si ca trebuie declarate in fiecare functie care le foloseste. Declararea se poate omite atunci cand nu exista confuzii.

Mai zic ei ca e "common practice" sa colectezi declaratiile extern intr-un fisier header, fisier inclus la inceputul fiecarui fisier sursa.

Daca tu definesti o variabila in fisierul .h, cand incluzi fisierul respectiv, practic redefinesti variabila in fiecare fisier "incluzator".

Link to comment

Multumesc pentru ajutor, intr-un fel am rezolvat-o.

Pur si simplu am adaugat la source files fisierul asm si gata, a mers.

Dar... a mai ramas sa conving var1 sa preia valoarea care ar trebui returnata de asm_F(). Rutina ASM nu era corecta. FSR1 arata urmatoarea locatie libera din stiva, deci trebuia mai intai decrementat si abia apoi atribut catre WREG. La return WREG va fi atribuit lui var1.

#include "P18CXXX.INC"	;processor specific variable definitionsASM_FCODE	CODEasm_F:	movf POSTDEC1, 1, 0	movf INDF1,0,0	RETURN    	GLOBAL asm_F           ; export so linker can see it	END
Codul C:

...unsigned char var1;void main (void);void InterruptHandlerHigh (void); extern unsigned char asm_F(unsigned char);void main (){	var1=asm_F(0x05);	Delay10TCYx(1);	while (1)    {		;    }}...
Mai departe, am vrut sa vad daca acel extern e musai. Nu-i, programul merge si fara, desi la manual scrie:

to call the function asm_delay from a C source file, an external prototype for the assembly function must be added, and the function called using standard C function notation: /* asm_delay is found in an assembly file */extern void asm_delay (void);void main (void){  asm_delay ();}
Pana cand n-am adaugat fisierul ASM la proiect, n-a mers, chiar si in varianta propusa de Liviu M. Daca analizam, de exemplu, rutina Delay10TCYx(), vedem ca arata cam la fel cu ce am scris eu, dar merge fara a fi adaugata la proiect si fara alte fineturi ca de exemplu "extern". Nu stiu de ce, cand o sa mai prind la minte ma voi dumiri.
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines