在以下代码块中,在循环的第一次迭代之后,num_insts
被重新分配给0
。
inst_t buf[5] = {0};
num_insts = 10;
int i = 5;
for( ; i > 0; i-- )
{
buf[i] = buf[i-1];
}
buf[0] = next;
我想不出这种行为有任何可能的正当理由,但我也被剥夺了睡眠,所以第二种意见将不胜感激。
为buf shift执行的程序集是这样的:
004017ed: mov 0x90(%esp),%eax
004017f4: lea -0x1(%eax),%ecx
004017f7: mov 0x90(%esp),%edx
004017fe: mov %edx,%eax
00401800: shl $0x2,%eax
00401803: add %edx,%eax
00401805: shl $0x2,%eax
00401808: lea 0xa0(%esp),%edi
0040180f: lea (%edi,%eax,1),%eax
00401812: lea -0x7c(%eax),%edx
00401815: mov %ecx,%eax
00401817: shl $0x2,%eax
0040181a: add %ecx,%eax
0040181c: shl $0x2,%eax
0040181f: lea 0xa0(%esp),%ecx
执行上面第一个汇编指令之前的寄存器内容是:
eax 0
ecx 0
edx 0
ebx 2665332
esp 0x28ab50
ebp 0x28ac08
esi 0
edi 2665432
eip 0x4017ed <main+1593>
按照这些说明,这个:
eax 0
ecx 0
edx 2665432
ebx 2665332
esp 0x28ab50
ebp 0x28ac08
esi 0
edi 2665456
eip 0x401848 <main+1684>
我不知道是否有足够的装配来理解这一点,但也许有人回答这个问题会从中受益。
答案 0 :(得分:5)
使用i = 5
进行第一次迭代时,您需要编码:
for( ; i > 0; i-- ) // i = 5 > 0 = true
{
buf[i] = buf[i-1]; // b[5] = b [5 - 1]
}
buf[5] = buf[4];
是buf
,因为5
的大小只有4
,最大索引值可能是buf[5]
,因此您的代码中的错误=数组中的错误=索引问题=&gt; rhs {{1}}。