Would appreciate if someone can tell/show me how to combine C and assembly code in the Uvision 2?
Does this help? http://www.keil.com/support/docs/1671.htm Keil Support
Do you mean how to put inline assembler within a 'C' source file, or how to build a uVision Project comprising both 'C' and Assembler source files? Or both?
Do you mean you want uVision to display both the C source code and ASM at the same time as you debug? - Mark
pls can have some example of the combination of the C and 8051 assemable language. thank u
yes thank u. what must be done with i want to combine both language. must i save both language in different file name?? If not, what should i include in the program. thank for your reply. thank u.
You still haven't said exactly what you want to do: 1. In your 'C' source file, include a little bit of assembler for some "tricky" task; 2. Make a project which contains both 'C' and assembler source files; 3. In the listing file, view the assembler code generated by the compiler for your 'C' source; 4. While debugging, view both 'C' source and corresponding assembler. So here we go: 1. To include some assembler within a 'C' source file, use the #pragma asm - as described on p12 of the C51 User's Guide [1]. Note that you also need to specify the SRC directive to make the Compiler emit assembler source, and then pass that to the assembler to generate the object! (in uVision2, just check the 'Generate Assembler SRC File' and 'Assemble SRC File' options in the file properties for the 'C' source) 2. To make a project comprising both 'C' and assembler files: just add the sources to your Project. uVision will ensure that the appropriate translator (compiler or assembler) is used to generate the object, and then the linker just links all the objects. See the C51 User's Guide p141 for details of interfacing 'C' and Assembler. See also the uVision User's Guide [2] 3. View both source & assembler in the compiler listfile: use the CODE directive - see User's Guide p15. Or check 'Assembly Code' in the uVision 'Listing' options for your Project. (Unfortunately this gives the 'C' and assembler in separate parts of the listing - Keil C51 does not produce an "interleaved" C+Assembler listing). 4. View both source & assembler while debugging: With uVision in Debug mode (Debug/Start Debug Session), use View/Disassembly window. In this case you do get "interleaved" C+Assembler Note that you must have enable Debug Info generation for this to work (Project's 'Output' options). References: [1] C51 User's Guide 03.2000 [2] uVision User's Guide 06.2000, "Getting Started and Creating Applications" All the manuals are on the free CD in PDF format.
The other way is to use #pragma asm (assembly code and assembly style comments) #pragma endasm But, there is a very good reason why not to ever do this. I have a Nohau emulator, and the emulator started treating all the code in the file that used this as mixed mode (forced line by line assembly). I quickly pulled the pragmas out and took the asm code to another file as a set of procedures. I still wish that I could include these procedures in-line some how, but there is not a in_line command/pragma/whatever, and there would have to be a list of things to do so that one does not trash the registers of the code that gets this function in-line. Sean
Well, I suppose it would do that, wouldn't it! As noted elsewhere in this thread, when you use #pragma asm ... #pragma endasm in your 'C' source you also have to use the SRC directive, and then pass the resulting assembly source to the Assembler. Thus it is not the Compiler which generates the object code, but the Assembler. Therefore it is the Assembler which inserts the debug info into the object file, and not the Compiler. Therefore the debug info (including line numbers) will refer to the Assembly source, and not to the 'C' source!
thank for ur help. pls check if what i,am doing is right. example: mov DPTR,#IO_PORT0 mov A,#55h movx @dptr,A can it be done as in C: extern xdata unsigned char IO_PORT=0x9800; void main() {unsigned charx; x&=0x55; } can it be write in this way?? if not how should i write?hope that u can show me. pls also should i use extern? xdata or idata? What is the main different?? pls may i know when should i use XBYTE.
Problem: You want to move 0x55 to XDATA address IO_PORT at 0x9800. Solution:
// Do not forget volatile. volatile unsigned char IO_PORT _at_ 0x9800; void main(void) { unsigned char charVal; // Write. IO_PORT = 0x55; // Read. charVal = IO_PORT; // Read again. if (IO_PORT & 0x80) { // High bit set. } }
Never use XBYTE May I ask why?
Just because it's a macro and I don't like macros when the implementation provides a clean way to do the same thing. Every thing I say is of course an opinion, take it with a grain of salt. Regards. - Mark
when should the word extern. when xdata should or should not be use. is xdata does the same as xbyte. pls, how can i increase DPTR when i want to write it in C? Also how can i just increase DPL? And how can i write the push and pop of assembly to. pls show me with some example. Is there any side where i can find out more about using c to to control 8051. Thank you.
extern is only need on variables when you need to define them in one C file but use them in at least one other C file. The variables are extern'd in an include (.h) file typically which is included by all C files that require that variable. You can access DPTR via the sfr keyword extension. Read you C51 manual. I don't advise touching the DPTR however since you may clobber the compiler's use of it. Likewise you can access ports on the 8051 like this:
sfr port0 = 0x80; sbit portBit0_0 = port0 ^ 0; sbit portBit0_1 = port0 ^ 1; ... sbit portBit0_7 = port0 ^ 7; port0 = 0xFF; // Set all pins high portBit0_1 = 0; // Set Port 0.1 low
char xdata myVariable;
char idata someVar; int data otherVar;
char xdata aVar _at_ 0x8000; int code bVar _at_ 0xFFFE;
How will acess a code in assembly language through a simple progrse in C language? Please mail me the answer as soon as posssible. Aasif_mansoor1@yahoo.com