C och Assembler för sig

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
SmourF
Inlägg: 268
Blev medlem: 13 april 2004, 15:33:58
Ort: Jönköping
Kontakt:

C och Assembler för sig

Inlägg av SmourF »

hej,

undrar nu ifall någon är haj på blandat C och Assembler :)

det jag vill göra är att använda C, men även Assembler,

man kan ju använda #asm -_- #endasm och andra alternativ i koden, men det blir helt konstigt när jag gör det, då det har vissa begränsningar, så läste jag även om att man kan koda C och Assembler seperat, och sedan via LINK länka ihop resultatet,

och det är just detta jag tänkte kolla ifall någon har lite mer kunskap i :)

CCS, mikroC och CC5X, där den sistnämnda compilatorn som jag tänkt använda,

C är rätt gött, men jag vi ha assembler med, känner mig bäst optimerad då :D

hoppas någon kan,

MVH SmourF
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: C och Assembler för sig

Inlägg av sodjan »

Finns det inga exempel i dokumentationen ?
bearing
Inlägg: 11672
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: C och Assembler för sig

Inlägg av bearing »

Manualen till CC5X beskriver hur kompilatorn kan ställas in att generera relocatable assembler, som sedan kan länkas ihop med annan relocatable assembler, c-genererad som handskriven.

Dock finns begränsningar, jag tror att det hade med funktionsargument att göra. Dessutom står det att koden inte blir lika optimerad på det sättet.

I CC5X finns ingen anledning att skriva inline assembler eller länka in assemblerfunktioner tycker jag. CC5X-kod går nämligen att skriva så att varje rad blir motsvarande en assemblerinstruktion, med några undantag som jag tycker saknar betydelse.

W-tillåts modifieras, och det finns "funktioner" som egentligen är assemblerinstruktioner, t.ex. rr(char) (rotate right through carry) och decsz(char). Kolla i mattebiblioteken för exempel på sån kod. (Och läs relevanta delar ur manualen.)


Exempel ur math16.h

Kod: Markera allt

uns16 operator* _mult8x8( uns8 arg1, uns8 arg2)
{
    uns16 rval;
    char counter = sizeof(arg2)*8;
    rval.high8 = 0;
    W = arg1;
    do  {
        arg2 = rr( arg2);
        if (Carry)
            rval.high8 += W;
        rval = rr( rval);
        counter = decsz(counter);
    } while (1);

    return rval;
}
EDIT: förtydligade att inlägget handlar om kompilatorn CC5X.
Senast redigerad av bearing 22 februari 2009, 18:02:23, redigerad totalt 1 gång.
MiSTer
Inlägg: 725
Blev medlem: 26 juli 2007, 03:55:18
Ort: Skene
Kontakt:

Re: C och Assembler för sig

Inlägg av MiSTer »

Alltså serriöst!
Jag blev intresserad och G00glade som en tok...
Lyckas inte lösa detta alltså...

Hittade exempel:

Kod: Markera allt

//main.c
main()
{
   int i = sqr(11);
   printf("%d\n",i);
}

//sqr.s
.globl sqr
sqr:
   movl 4(%esp), %eax
   imull %eax, %eax
   ret
Eller vice versa:

Kod: Markera allt

//print.c
print(int i)
{
   printf("%d\n",i);
}

//main.s
.globl main
main:
   movl $123, %eax
   pushl %eax
   call print
   addl $4, %esp
   ret
Nu gäller det bara att övertala nasm, gcc och en länkare att knåda ihop detta...
Detta är då under linux... och för att riktigt ställa till det; på en 64-bitars maskin...
Har en tråd på Svenska Ubuntuforumet om detta också... får se om nån där kommer med en livskraftig lösning...


EDIT: Detta "exempel" försöker jag jobba med i linux, distributionen Ubuntu (Ubuntu 8.04 - Hardy Heron), på en maskin med en AMD64 Dual Core.
Detta kanske är för mycket "Off Topic", i så fall ber jag om ursäkt.
Jag ville själv förstå hur och om det fungerar.
Senast redigerad av MiSTer 22 februari 2009, 23:59:32, redigerad totalt 1 gång.
SmourF
Inlägg: 268
Blev medlem: 13 april 2004, 15:33:58
Ort: Jönköping
Kontakt:

Re: C och Assembler för sig

Inlägg av SmourF »

tack för alla svar!,

sodjan: jag tolkade detta så iaf, stycke 6.6 ur CC5X pdf dokumentet, citerar,

men det stod inte så mycket mer, och jag fann inte så mycket mer i microchips dokument mer än bilduppsättnings som visade detta möjligt typ,
6.6 Inline Assembly
The CC5X compiler supports inline assembly located inside a C function. There are some restrictions
compared to general assembly. First, it is only possible to CALL other functions. Second, GOTO is
restricted to labels inside the function. If these restrictions makes program design too difficult, consider
using the linker support and link C and assembly modules using MPLINK.
bearing: helt klart värt att veta om den kompilatorn, det du skriver är sant, tanken är väl mer här, att man ska kunna använda koden sedan utan att behöva ha en C kompilator typ, och CC5X är ju inte ANSI-C heller, det var mest den tanken jag hade

mister: hehe, kul att du blev nyfiken du med :), men jag vet inte, det kanske inte är så lätt som man tror, jag vet inte,

för jag använder MACRO och när jag gör #include på macro filen för att använda de, skriks det i kompilatorn, CC5X, funkar utmärkt i assembler dock,
detta är när jag skriver assembler inom #asm ... #endasm

det är väl det som är kruxet kanske, annars klarar den tolka assembler mycket bra CC5X,

tack i förhand

MVH SmourF
bearing
Inlägg: 11672
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: C och Assembler för sig

Inlägg av bearing »

Visa oss hur CC5X och länkaren anropas, samt felmeddelandena, annars tror jag inte att vi kan hjälpa dig.
SmourF
Inlägg: 268
Blev medlem: 13 april 2004, 15:33:58
Ort: Jönköping
Kontakt:

Re: C och Assembler för sig

Inlägg av SmourF »

bearing: helt rätt, klart att det måste postas, usch, har varit mycket idag, åkte pulka, och man är inte 10 år längre heller hehe, när man ser småungarna åka de värsta backarna med ett leende sitter man där och puttrar på i 30 känns det som ;)

KODEN, väldigt basic, det den gör är blinkar en LED men TMR0 och SLEEP

Kod: Markera allt

#asm
#include	"../Macro/Instructions.asm"
#include	"16F877A_INIT"

;***** VARIABLE DEFINITIONS (examples)

#define	LED0	PORTA, 0
#endasm

void main ( void ) {
	while ( 1 ) {
		#asm
		 INIT_16F877A
		 
		MAIN_LOOP
		 MOVLF	10, DelayTemp
		 bsf	LED0
		 
		MAIN_DELAY_LOOP0
		 clrwdt
		 BFBC	INTCON, TMR0IF	; ~65536 us (65,5 ms)
		 goto	$-2
		 
		 bcf	INTCON, TMR0IF
		 
		 decfsz	DelayTemp, F
		 goto	MAIN_DELAY_LOOP0
		 
		 MOVLF	.75, DelayTemp
		 
		 bcf	LED0
		 
		MAIN_DELAY_LOOP1
		 sleep
		 
		 decfsz	DelayTemp, F
		 goto	MAIN_DELAY_LOOP1
		 
		 goto	MAIN_LOOP
		 #endasm
	} 
}
FELMEDDELANDET, kommer inte förbi det, har portat alla search paths till CC5X mappen,
CC5X Version 3.3H, Copyright (c) B Knudsen Data, Norway 1992-2009
--> DEMO, 8-32 bit int, 16-32 bit float, 8k code, not complete asm file
16F877ATMPO_C.c:


^------
Error[1] C:\MPLAB\16F877A\16F877ATMPO_C.c 1 : Unable to open file '16F877A.h'
(The file name or path can be wrong (Also consider option -cif))

Error options: -ew: no warning details -ed: no error details -eL: list details
BUILD FAILED: Sun Feb 22 19:52:33 2009
i första hand verkar den ha problem med att lokalisera include filen, H-filen, den finns ju i CC5X mapp, har även provat med, med samma resultat dock:
#pragma chip PIC16F877A
#include "16F877A.H"

MVH SmourF
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: C och Assembler för sig

Inlägg av sodjan »

Vad är det du försöker göra ?
Du frågade om separatkompilering/assemblering ac C resp ASM,
men sedan gör du "include" i C-filen !? Du ville väl bygga delarna
separat för att undvika begränsningarna med inline-ASM, eller ?

MiSTer, har ditt inlägg någonting alls med problemet att göra ?
Det verkar varken vara MPLAB, CC5X, PIC eller någonting annat som
har koppling till tråden...
SmourF
Inlägg: 268
Blev medlem: 13 april 2004, 15:33:58
Ort: Jönköping
Kontakt:

Re: C och Assembler för sig

Inlägg av SmourF »

sodjan: det jag försöker göra är kombinera C och Assembler, men efterson Inline assembler hade begränsningar läste jag om det andra sättet, så att säga, tänkte ifall det var avancerade grejer eller så,

men det jag i grund och botten vill göra är kombinera C och Assembler, på ett sådant sätt så man kan återanvända kod om man inte vill använda en C compilator, dvs det ska vara äkta assembler som man kan göra copy-n-paste med,

den där include filen inom #asm ... #endasm, den har jag när jag kompilerar med assembler, det är ett macro med initieringen av MCUn,
sedan har jag en till include fil med andra macron, som jag sedan använder i koden så att säga, eller kanske inte i denna kodsnutt, men tanken är så iaf,

hoppas jag har lyckats förklara det någorlunda bra :)

har du några tips eller så ?, fast include av headerfilen 16F877A.H vore ju rätt bra att komma förbi, jag vet inte vad som skaver där, kom ju förbi det igår, :(

MVH SmourF
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: C och Assembler för sig

Inlägg av sodjan »

Antingen får du köra med separat bygge av C resp ASM, eller så får du köra med inline-ASM.
Du säger att du vill göra det första, men koden du visar gör det senare.

> sedan har jag en till include fil med andra macron, som jag sedan använder i koden så att säga,

Fungerar det att göra include i en asm/endasm och sedan använda det i en annan asm/endasm ?
Det är lite tveksamt om det som du gör i en asm/endasm "syns" i de andra asm/endasm. Sannolikt
måste varje asm/endasm vara en självständig enhet, så att säga. Jag är inte säker, det bara känns så.

> fast include av headerfilen 16F877A.H vore ju rätt bra att komma förbi,

I värsta fall, om du inte hittar inställningen som saknas eller är fel, så får du väl lägga en
komplett path i include-komandot. Lite fult, men det bör fungera i alla fall. De flesta
verktyg brukar ha någon inställning för "include paths" eller "include files" eller liknande.
MiSTer
Inlägg: 725
Blev medlem: 26 juli 2007, 03:55:18
Ort: Skene
Kontakt:

Re: C och Assembler för sig

Inlägg av MiSTer »

Sodjan; Mitt inlägg gav väl ingen lösning på problemet.
Men det skadar väl inte att försöka att ta reda på hur det fungerar?
Det ger väl kanske en föraning om hur det skall gå till i andra kompilatorer...

Eftersom jag inte hittade nånting konkret om ämnet så tänkte jag testa i en miljö där man iaf vet vad som är upp & ner...

Men, men... är inlägget så sunkigt så kan väl nån moderator ta bort mig från tråden...

Man skall inte hugga jäms med fotknölarna innan man försökt förstå trådskaparens intentioner...
(Lite högre upp skall det vara, så det syns att nån stått där i dumkopf Schirmmütze...)
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: C och Assembler för sig

Inlägg av sodjan »

Du la in kod för en helt annan miljö utan att kommentera just det.
Och just detta (att blanda C och ASM) är nog ett område där olika
produkter kan ha vitt skillda lösningar, t.ex hur parameteröverföring
går till eller hur access till "variabler" i den ena eller den andra miljön
(C eller ASM) ser ut.

Hur som helst, kollade dokumentationen till CC5X lite snabbt, och kap
6.8 verkar ha detaljerna för länkning av blandad C och ASM kod. Ca
20 sidor med information som ser ganska komplett ut. Var det
inget där som fungerade ?
SmourF
Inlägg: 268
Blev medlem: 13 april 2004, 15:33:58
Ort: Jönköping
Kontakt:

Re: C och Assembler för sig

Inlägg av SmourF »

> I värsta fall, om du inte hittar inställningen som saknas eller är fel, så får du väl lägga en
komplett path i include-komandot. Lite fult, men det bör fungera i alla fall. De flesta
verktyg brukar ha någon inställning för "include paths" eller "include files" eller liknande.

nu har jag provat alla kombinationer, och grejen är den att, även om jag tar bort alla kod, har bara "void main (void){}" så generar den samma fel, dvs

"Error[1] C:\MPLAB\16F877A\16F877ATMPO_C.c 1 : Unable to open file '16F877A.h'
(The file name or path can be wrong (Also consider option -cif))"

det verkar något skumt, i kompilator inställningen har jag pekat allt mot C:\CC5X\, förutom ...WINASM och MPLINK,

känns som det är något med att den automatiskt försöker ladda H-filen baserat på processorinställningen, vilket låter rimligt då ingen exempelfil har #include mot H-filen,

har du använt CC5X sodjan ?

vore rätt gött att komma förbi det så man kan testa vidare,

MVH SmourF
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: C och Assembler för sig

Inlägg av sodjan »

Har läst kap 1.6 ?

> känns som det är något med att den automatiskt försöker ladda H-filen baserat
> på processorinställningen, vilket låter rimligt...

Speciellt som det är exakt så som dokumentationen säger att den fungerar. RTFM !

> har du använt CC5X sodjan ?

Nej. Jag har bara läst 30 sek i dokumentationen...

> vore rätt gött att komma förbi det så man kan testa vidare,

RTFM...
SmourF
Inlägg: 268
Blev medlem: 13 april 2004, 15:33:58
Ort: Jönköping
Kontakt:

Re: C och Assembler för sig

Inlägg av SmourF »

nu har jag gjort sodjan upprörd :), nej, skämt åt sido, jag förstår att du blir lite irriterad, men som jag skrev, har provat ALLA kombinationer, och 1.6 är genomläsd sen längesen, det ända jag inte provat är det med comandline, för det vet jag inte hur man gör i MPLAB, men som det stod, det gör den automatiskt,

iaf, efter mycket pillandet, så lyckades jag pilla bort problemet, löste det problem genom att lägga in sökvägarna i BUILD OPTION, INCLUDE etc...

så nu har jag kommit förbi det, men nu är ju det problem som jag fruktade, nämligen acceptering av mina kära macro :(

den klagar direkt på det första macro, och det är ju ytterst tråkigt :roll:

och föresten, så du vet, läser dokumentationen ständigt, har den uppe hela tiden och letar, tro mig, jag anstränger mig, men inte alltid lika lätt dock :(
uppskattar din hjälp, din effort oerhört mycket däremot, det ska du veta med :)
Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\CC5X\CC5X.EXE" 16F877ATMPO_C.c -CC -fINHX8M -p16F877A -I"C:\CC5X" -a -L -Q -V -FM
CC5X Version 3.3H, Copyright (c) B Knudsen Data, Norway 1992-2009
--> DEMO, 8-32 bit int, 16-32 bit float, 8k code, not complete asm file
16F877ATMPO_C.c:

;{
BANK0 macro
^------
Error[1] C:\MPLAB\Macro\Instructions.asm 8 : Syntax error
(The expression must be corrected. The marker ^------ shows
the approximate position where CC5X gives up. The documentation
should be checked if the cause is not obvious)

Error options: -ew: no warning details -ed: no error details -eL: list details
BUILD FAILED: Mon Feb 23 00:17:15 2009
Skriv svar