This article from Keil's support knowledge database shows that one can directly write to ACC from C51 code. http://www.keil.com/support/docs/1619.htm I would like to know if there are any rules when writing to ACC from C code. I have noticed that the following line in my code was entirely commented out when I chose Code Optimization Level-9.
unsigned char data uDataIndex, uDataArray[5]; void main() { . . ACC=uDataArray[uDataIndex%5]; . }
"can directly write to ACC from C51 code." Of course you can - ACC is just another SFR!
With ACC being just another SFR and SFR's being implicitly volatile (I thought they were, but now after a brief search didn't find that characteristic explicitly mentioned), shouldn't the compiler avoid optimizing out the access, regardless of optimization level?
I Write to ACC directly from C, and use Optimization Level-9 with no problem! I do this for same reason, parity check.
You will not have any problem if you check P right after. The mistake I made was I had another if statement placed before if (P == ...) {}. Then again, I think since the only legitimate reason to write to ACC directly is to get the parity bit, Keil perhaps should consider running a get_parity function in its intrinsic function library.
"a get_parity function" I wrote my parity() function in assembler precisely to avoid any possible doubt about what the compiler might get up to... ;-)
I use the following to get the parity after loading the accumulator.
// Disable Interrupts parity = (ACC=0x12,P); // Restore Interrupts