视频: 京华时报:追索“肉身坐佛”,民间力量
??? ?? ??? ???? ??? ???? ?? ??? ??? ?? ???? ? ?? ??? CPU? ??? ?? ??? ?? ???? ??? ??? ????. ???? ??? ???? CPU? ???? ???? ??(???)? ????. RAM?? ROM/FLASH ?? ?? ??? ??. MCU(8051,...)? ??? ?? ?? ??? ??? ??? ?? ????? ?? ??. 8051? ??? 256??? ?? ??? ?? ??. 256???? ?? ?? ??? ?? ??? ????? 16??? ?? ??? ?? ????? ???? ??? ??? ?? ??. ?? ??? ???? 8?? ?? 16??? ????.
C??? UNIX ??? OS ?? ? ? ??????? ??? ???? ??? ?? ??? ?? ?? ??? ??? ? ? ??.
??? ??? ??
[+/-]??? ??? *? ???? ?? ??. ???? ???? ???? ??? ???? ??? ???? ??? ?? ??? ?? ??? ??? ??? ??. ??? ?? ??? ??? & ???? ?? ??.
int ival;
int *pval;
// ...
pval = &ival; // ival? &???? ival? ???? ?? ?????.
*pval = 30; // pval? ival? ???? ??? ????,
// ? ???? ?? ?? 30? ? ??? ????
// ? ??? ?? ?? ??.
printf("?? pval? ???? ?? ???? 0x%08X, ??? ??? ???? ??? 0x%08X\n", &pval, pval );
ival? ??? ???? ???? ????. ?, ?? ??? ?? ??. ??? ?? pval? ??? ??? ??? ???? ??? ??? ???? ???? ?? ???. CPU? ?????? ???? ???? ?? ???? ???? ?? ? ???? ??? ??? ?? ???. ??? ??? ???? ??? ???? ???? ????? ?? ? ? ??.
NULL ??
[+/-]??? ??? ?? ?? ??? ????(malloc(), new)? ?? ???? ?? ??? ???? ????. ?????? ??? ????? ???? ??? ??? ? ? ??. ?? ???? ??? ??? ?? ????? NULL? ??? ? ??.
NULL ?? ?:
char data8;
char *pval = NULL; // ???? ??? ????? ???? ???.
if (pval == NULL)
pval = data8; // ?? pval? ??? ?? ??? ?? data8? ?? ??.
*pval = 10; // ??? ??? data8? 10? ??.
C/C++?? NULL? ?? 0?? ?? ?? ??. ???? ???? '??'? ??? null? ?????, ??? ?? ??? ??? ?? ???? ?? 1? ??? ??. ??? C/C++??? 0?? ?? ?? ???? ???? 0???? ???? ???? ???.
?? ??? ??? ??? ????? ???? ???? NULL? ???? ??? ??? ??? ?????.
??? ???? ???
[+/-]??? ??? ??(??? ???)? ????????? ?? ??. ?, ????????? ?? ??? ??? ??? ?? ??? ?? ??? C/C++??? ????? ?? ?? ???. ?, ??? ??? ??? CPU ????? ?? ?? ???? ?? ???? ??? ??. ???? ? ??? ?? ?? ?, ?? ???? ????? ??? ? ? ??? ??? ??(???)? ???? ??? ??.
32?? CPU? ???? 32?? ????? 32?? ??? ??? ??? ???? ?? ?? 32???? ?? ??:
// ?? ???? ??? ?? ??? 32?? CPU? ??
char buff[1024];
int *pdata = (int*) buff; // ?? ??? ?? ??? ? ?, 32?? ????? ??? ?? ?? ??
*pdata = 23; // 32?? ??? ??, ??? 23? 32?? ??? ??.
*((char*)pdata) = -1; // ??? char 8?? ????? ?? ????? -1? 8?? ?????.
// 8?? ?? -1 : 11111111b
void *pval; // ??? ??? ??(??? ?? ??)? ?? ???? ??.
// ?? ???? 32?? ?? ????.
pval= (void *) buff; // ?? ?? ???? ? ??
*pval = 10; // '''error : ??? ??? ??? ? ??. ??? ??? ??? ??? ? ??.
*(char*)pval = 10; // ??? ??? 8?? ???, 10? 8?? ????? ? ?? ???.
?? ? *pval = 10;? pval? void???? ??? ?, 10? ??? ???? ??? ?? ??. ?? 10? ????? ?? ??? ?? ???? 8,16,32??? ???. ??? pval? ???? ??? ???? ????? ???? void??? ?? ??? ??.
?
[+/-]#include <stdio.h>
#include <string.h>
/// Global Variables
char name[124];
char tel[] = "010-2345-6789";
// func.
char *read_name(char *pstr, int szmax);
int main(int argc, char**argv)
{
char *pstr;
pstr = read_name(name, 120);
printf("? ? = %s\n", pstr );
printf("?? ?? = %s\n", tel);
return 0;
}
char *read_name(char *pstr, int szmax)
{
size_t leng;
static char bstr[256];
gets(bstr);
leng = strlen(bstr);
if (leng >= (size_t)szmax)
leng = szmax -1;
strncpy (pstr,bstr,leng);
*(pstr+leng) = 0;
return pstr;
}
? ???? ??? ?? ??? ??? ??? ?? ?? name, tel, bstr ?? ???. ??? pstr??? ??? ???? ??? ??? ??? ???? ????? ??? ???? ????. CPU? ????? ?? ????? ???? ??? ???? ???. ? ??? ??? ??? ???? ??? ??? ??? ??? ???? ??? ?? ??.
??? ???? ???? ??
[+/-]??? ??? ?? ???? ???? ?? ???? 2?? ?? ? ???. ??? CPU?? ALU? ?? ?? ??.
???? 32?? CPU? ????? ?? 32?? ??? ???? ?? ??. ??? CPU? ???? ????? ?? ?? ??, ??, ?? ?? ????.
#define SZ_DATA 100
int main()
{
int ival[SZ_DATA];
int *pval = NULL;
pval = &ival; // ival? &???? ival? ???? ?? ?????.
for (int cnt = 0;cnt < SZ_DATA;cnt++) {
*pval = 0;
pval++;
}
// ...
}
pval++?? ??? ++? ???? ???? ?? ??? ?? ? ???? ???. ??? ??? ???? 1? ??? ????? ???? ???? ? ? ? ??? ????. ??? ??? 1? ??? ?? ??? ??? ??? ?? int?? ???? ????.
pval++?? ++ ??? :
- ++ : ??? ??? + sizeof(int) => ??? ??
?? ?? ?? &ival[0] == pval == 0x00301200 ??? :
0x00301200 + sizeof(int) : 0x00301200 + 4 => 0x00301204 ==> pval == &ival[1]
?, ival? ???? 0?? 1? ?? ??.
#include <stdio.h>
#define SZ_DATA 100
char gname[SZ_DATA];
char gbuff[SZ_DATA];
int main()
{
char *psstr = gname;
char *pdstr = gbuff;
gets(gname);
while (*psstr && *psstr != ' ')
*pdstr++ = *psstr++;
*pdstr = 0;
printf("%s\n", gbuff);
return 0;
}
psstr++ ??, ?? ?? ?? psstr == 0x00301200 ??? :
0x00301200 + sizeof(char) : 0x00301200 + 1 => 0x00301201 ==> psstr
? ?? char ??? ? ??? ??? ?? ?? ??? ???? 1? ALU? ?? ?? ??.
typedef struct {
char *name;
int age;
} Man, *PMan;
Man man[] = {
{ "???", 23 },
{ "Kim", 20 },
{ "Song", 19 },
};
#define SZ_MAN sizeof(man)/sizeof(man[0])
int main()
{
PMan pman = man;
printf("sizeof(Man) = %d, man=0x%08X\n", sizeof(Man), man );
for (int cnt = 0;cnt < SZ_MAN;cnt++) {
printf("0x%08X : %s, %d\n", pman+cnt, (pman+cnt)->name, (pman+cnt)->age);
}
return 0;
}
???? :
sizeof(Man) = 8, man=0x00E070A8 0x00E070A8 : ???, 23 0x00E070B0 : Kim, 20 0x00E070B8 : Song, 19
? ??? pman+cnt??
cnt = 1? ?, ???? ?? ??? ?? ??? ? ??:
0x00E070A8 + sizeof(Man)*cnt : 0x00E070A8 + 8*1 => 0x00E070B0 ==> &man[1]
??? ??? ??
[+/-]??? ??? ?? ???? ?? ??? ???? ??? ????.??? CPU? ?? ??? ????. CPU? ??? ????? ???? ?? ?? ???? ??? ?? CPU? ??? ??? ???? ??? ??. ?? 8?? CPU? 16??? ???? ???. ??? 8?? ?? MCU ??? ??? ???? ?? ??? ????. 8??? 16??? ????? ??. ?? CPU?? 8??? 16??? ?? ????? ??? ??.
Z-80 | 16?? ???? |
8051 | 8??? 16?? ?? |
- 8051? Keil Complier ? [1]
#define LEDPORT0 *(unsigned char xdata*) 0xc0000 // ?? ??? ?? 0xc0000??
xdata char gGrapLedData[1024]; // ?? ??? ?? - 16?? ?? ??,
// 8051? ?? RAM? 256??? ??? ? ??? ?? ??
xdata char *pxled; // sizeof(pxled) = 2 : ?? ??? ?? - 16?? ?? ??
char g_ledData[4]; // ?? ??? ?? - 8?? ?? ??
char *pledfont; // sizeof(pledfont)=1 : ?? ??? ?? - 8?? ?? ??
void main()
{
// CPU ???
while (1) {
// ...
LEDPORT0 = *pledfont++;
}
}
CPU? ?????? CPU? ??? ??? ?? ?? ? ??? ??? ??? ? ? ??.
?? ?? 32??? ?? 32??? ?? ?? ?? ???. ?? ?? CPU? 32?? ??? ??? 8?? CPU ?? ??? ?? ?? ??. 64??? ?? ? ?? ?? ?? ?? ???.
x86(IA-32) | 32?? ???? |
68000?? | 32?? ???? |
ARM | 32?? ???? |
??? ??? ??? ???? ??? ??? ?? ???? ???? ???? ???? CPU? ?? ?? ?? ???? ?? ????? ??? ??.
??? ??? ???? ??? ? :
#include <stdio.h>
struct Man {
char name[40];
int age;
} ;
struct Man man;
int main(int argc, char**argv)
{
int leng;
printf("sizeof(int)=%d\n", sizeof(int) );
printf("sizeof(int*)=%d\n", sizeof(int*) );
printf("sizeof(struct Man)=%d\n", sizeof(struct Man) );
printf("sizeof(struct Man *)=%d\n", sizeof(struct Man *) );
// ...
return 0;
}
???? ??? ??? ???
CPU | ? | ???? | ??? | ??? ?? |
---|---|---|---|---|
8?? CPU | 8080, Z-80 | 16?? | 2 | sizeof(int*) = sizeof(char*) = sizeof(void*)=...= 2 |
8?? MCU | 8051, SAM8 | 8/16?? ?? | ?? | ??? ??? ?? 1 ?? 2??? - ????? ?? ?? ?? ??. |
32?? CPU | x86(IA-32), 68000, ARM | 32?? | 4 | sizeof(int*) = sizeof(char*) = sizeof(void*)=...= 4 |
- 32??? CPU?? ??? ???? ?[1]
int a[10];
int *pa;
void printvar()
{
printf("&a[0] = 0x%08X\n", &a[0]);
printf("&pa = 0x%08X\n", &pa);
printf("pa = 0x%08X\n", pa);
printf("fun= 0x%08X\n", (int) fun1);
return;
}
void fun(int cnt)
{
pa = a;
while (cnt) {
*pa = cnt;
pa++;
cnt--;
}
}
x86? ???? ? ?
&a[0] = 0x0040DF04 &pa = 0x0040DF00 pa = 0x0040DF2C fun= 0x00401060