hi, is there anybody out there who can explain, how i can call c-code from asm-code? for tests i wrote some little code for my atmega8: asm_code in atmel-avr-assembler: .include "m8def.inc" .include "test_c.c" .def temp = r16 ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp nop nop nop RCALL test_c nop nop c_code (external file named test_c.c): #include <avr/io.h> #include <stdio.h> int main (void) { DDRB = 0xff; PORTB = 0x03; PORTB = 0x07; while(1) { /* "empty*/ } return 0; } if i try to build the asm-section, i get the following errors: E:\elektronik\atmega8\c aus asm\test.c(1): error: Cannot find include file: avr/io.h E:\elektronik\atmega8\c aus asm\test.c(2): error: Cannot find include file: stdio.h E:\elektronik\atmega8\c aus asm\test.c(4): error: syntax error, unexpected FUNCTION what is wrong? do i have to compile the test.c first? but then i get these files: test_c.aps test_c.aws test_c.c test_c.o test_c.map test_c.lss test_c.eep test_c.elf test_c.hex do i have to include one of them?? thanks for help!!!
1) Why would you want to do so 2) Looking at your code, I can see a lot of misinformation and gotchas 3) Start with either programming in assembler or programming in C. Calling assembler from C is something, that is rarely needed. But calling a C function from assembler is something you will not want to do. 4) you cannot include a C-code file into assembler. The assembler translates assembler code. Translating C-code files is the job of the compiler, not the assembler. The output of both independent jobs is then linked together to form the entire executable. 5) One calls functions, not files. Your function is named 'main', not 'test_c' 6) If you want to mix assembler with C, you have to play by the rules. The rules are made by the compiler, not by yourself. So you have to take care about things like register usage and stack calling conventions. 7) If, as a C programmer, you feel the need to do something in assembler, step back and look again. While there are sometimes things, that should be done in assembler for speed reasons, those things are seldome necessary but often show a lack of C or algorithmic knowledge. Those reasons often circle around pushing/poping registers in ISR-functions. Other then that, there seldom is a need for writing something in assembler when writing C programs. But when you do, it is most of the time: C calls assembler and not the other way round. 8) If you feel the need, that you have to do things before main starts, (in avr-gcc) there are documented functions you can inherit, which are called during the C-runtime startup process and which are the correct places you can hook into the startup process.
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.