We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
I use #pragma asm/#pragma endasm to embed Assembler Code in C Function.
My question is:
How can I accessing a variable in Assembler Code,which define by C code.
Just like this:
I need height speed to accessing XDATA from Addr 0x0000.
void Func() {
unsigned char Var_C,i=0;
#pragma asm
mov DPTR,#0x0000
#pragma endasm
while(i++ < 0x10)
{
Var_C = ReadOneByte();
if(Var_C == 0xff)
Var_C = 0;
}
MOV A,Var_C /* This line is not work */
MOVX @DPTR,A
INC DPTR
Build target 'Target 1'
compiling main.c...
main.src(181): error A45: UNDEFINED SYMBOL (PASS-2)
Thanks!!!
If you just use assembly code just after the return from a function,then the return value resides in the register bank which the called function using(If you don't know the accuracy location,see C51.pdf).For the Keil compiler uses register banks to transfer parameters and return values.
In your case,searching the .SRC file generated form the .C file will lead you to the right place.
By the way,I guess your source code style would well make criticisms unhappy like Erik,Andy...
"In your case, searching the .SRC file generated form the .C file will lead you to the right place."
Also, reading the section in the Manual titled "Interfacing C to Assembler".
The clue is in the name!
http://www.keil.com/support/man/docs/c51/c51_ap_ctoasm.htm
"I guess your source code style would well make criticisms"
It's not the style of the source itself - it's the inability to follow the simple instructions that are clearly given in the Notes right above the Message window when you make your post!
If you can't sope with such obvious stuff, how are you going to work out the intricacies of interfacing 'C' to assembler...?
"I need height speed to accessing XDATA from Addr 0x0000."
It's hard to see what your code is actually doing, because you didn't follow the instructions when posting it - see above.
Anyhow, it seems very unlikely that you are going to gain any advantage by simply throwing odd bits of inline assembler into your 'C' source.
For a start, if speed is what you need, then a function call is not the way to read a single byte!
Have you read "Writing Optimum Code" in the Manual?
http://www.keil.com/support/man/docs/c51/c51_xc.htm
Have you enabled optimisation & examined the code that the compiler generates? It could well be pretty good anyhow!
If not, you probably need to write the whole function in assembler.
"main.src(181): error A45: UNDEFINED SYMBOL (PASS-2)"
Which symbol is it saying is undefined?