我在Cygwin GCC(v 4.5.3)中发现了一个错误吗?

Dan*_*Dan 2 c assembly gcc cygwin

在以下代码块中,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;
Run Code Online (Sandbox Code Playgroud)

我想不出这种行为可能有任何正当理由,但我也被剥夺了睡眠,所以第二意见将不胜感激.

为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
Run Code Online (Sandbox Code Playgroud)

并且在执行上面的第一个汇编指令之前的寄存器内容是:

eax 0
ecx 0
edx 0
ebx 2665332
esp 0x28ab50
ebp 0x28ac08
esi 0
edi 2665432
eip 0x4017ed <main+1593>
Run Code Online (Sandbox Code Playgroud)

按照这些说明,这个:

eax 0
ecx 0
edx 2665432
ebx 2665332
esp 0x28ab50
ebp 0x28ac08
esi 0
edi 2665456
eip 0x401848 <main+1684>
Run Code Online (Sandbox Code Playgroud)

我不知道几乎有足够的装配来理解这一点,但也许有人回答这个问题会从中受益.

Gri*_*han 5

对于i = 5您的第一次迭代代码:

for( ; i > 0; i-- ) // i = 5 > 0 = true
{
   buf[i] = buf[i-1];  // b[5] = b [5 - 1] 
}
Run Code Online (Sandbox Code Playgroud)

buf[5] = buf[4]; 因为buf只是大小5,最大索引值可以是4你的代码中的错误=数组超出索引问题=> rhs buf[5].

  • 我现在要在一个洞里爬行.谢谢. (4认同)