??? 05/18/07 13:36 Read: times |
#139486 - b) buffer at 256 byte boundary Responding to: ???'s previous message |
Erik Malund said:
b) by example: you locate a 200 character buffer accessed by the above method a a 256 byte boundary and just ignore testing for 'low address overflow' which no compiler would ignore.
Usually addresses for variables are only known after the linking stage. - Too late for the compiler to notice and generate more efficient code for aligned access. If instead the address of a variable is known at compile time (here by the use of the 'at' keyword) the compiler is given a chance to obmit testing the 'low address overflow': #include <8052.h> unsigned char xdata at 0xfe00 buffer[200]; void f(void) { unsigned char i; for(i=0; i!=sizeof buffer; i++) P3 = buffer[i]; } should compile to something like: 0000 338 _f: 347 ; buffer.c:8: for(i=0; i!=sizeof buffer; i++) 0000 7A 00 348 mov r2,#0x00 0002 349 00101$: 0002 BA C8 01 350 cjne r2,#0xC8,00110$ 0005 22 351 ret 0006 352 00110$: 353 ; buffer.c:9: P3 = buffer[i]; 0006 8A 82 354 mov dpl,r2 0008 75 83 FE 355 mov dph,#(_buffer >> 8) 000B E0 356 movx a,@dptr 000C F5 B0 357 mov _P3,a 000E 0A 359 inc r2 000F 80 F1 360 sjmp 00101$ with SDCC more recent than december 2003. |