变量定义如下
u8 TempMD5[16];// 16Byte,0x200216DB~0x200216F1
u8 j; // r5
u32 sector = 0; // r6
u8 buf[5]; // sp 5Byte 0x200216D0~0x200216D7=
u8 *p; // r4
p = buf;
*p = 0x01;
buf[0] = 0x02;
*buf = 0x03;
*(p+1) = 0x11;
buf[1] = 0x12;
*(p+6) = 0x21;
buf[6] = 0x22; //
- 变量分布
进入函数后可以看到汇编语句SP移动,但是两个数据加到一块有21(16+5=21)个字节,与24(0x18)不对应。
然后又查看Memory,buf从0x200216D0开始,而TempMD5是从0x200216DB开始并不是从0x200216D5。这是因为STM32F4系列是32字节对齐,所有buf占用地址为~0x200216D7,实际只用了5个字节。所以定义数组时长度尽量要用4的整位数。
- 数组与指针
执行*(p+6) =0x21;语句将p指向的地址偏移6个单位后的字节赋值0x21,但buf[6]=0x22;MDK有告警提示,运行时没有溢出,查看汇编只将0x22赋给r0寄存器,就这一条指令。