2015-06-21 78 views
1

我正在做炸弹实验室,我正确猜测这是斐波那契序列(0 1 1 2 3 5)。我无法理解下面几行:8048d11-8048d1a炸弹实验室组装说明

08048ce6 <phase_2>: 
8048ce6:  55      push %ebp 
8048ce7:  89 e5     mov %esp,%ebp 
8048ce9:  56      push %esi 
8048cea:  53      push %ebx 
8048ceb:  83 ec 30    sub $0x30,%esp 
8048cee:  8d 45 e0    lea -0x20(%ebp),%eax 
8048cf1:  89 44 24 04    mov %eax,0x4(%esp) 
8048cf5:  8b 45 08    mov 0x8(%ebp),%eax 
8048cf8:  89 04 24    mov %eax,(%esp) 
8048cfb:  e8 ca 04 00 00   call 80491ca <read_six_numbers> 
8048d00:  83 7d e0 00    cmpl $0x0,-0x20(%ebp) 
8048d04:  75 06     jne 8048d0c <phase_2+0x26> 
8048d06:  83 7d e4 01    cmpl $0x1,-0x1c(%ebp) 
8048d0a:  74 05     je  8048d11 <phase_2+0x2b> 
8048d0c:  e8 77 04 00 00   call 8049188 <explode_bomb> 
8048d11:  8d 5d e8    lea -0x18(%ebp),%ebx 
8048d14:  8d 75 f8    lea -0x8(%ebp),%esi 
8048d17:  8b 43 fc    mov -0x4(%ebx),%eax 
8048d1a:  03 43 f8    add -0x8(%ebx),%eax 
8048d1d:  39 03     cmp %eax,(%ebx) 
8048d1f:  74 05     je  8048d26 <phase_2+0x40> 
8048d21:  e8 62 04 00 00   call 8049188 <explode_bomb> 
8048d26:  83 c3 04    add $0x4,%ebx 
8048d29:  39 f3     cmp %esi,%ebx 
8048d2b:  75 ea     jne 8048d17 <phase_2+0x31> 
8048d2d:  83 c4 30    add $0x30,%esp 
8048d30:  5b      pop %ebx 
8048d31:  5e      pop %esi 
8048d32:  5d      pop %ebp 
8048d33:  c3      ret 

我知道,它保持了TMP变量存储前一个元素,并添加它,并在8048d1d与下一个比较。它是如何做到的(虽然lea,mov和add)?

回答

2

这基本上是这样做的:

int array[6];    // at ebp-0x20 
int *ebx = &array[2];  // lea -0x18(%ebp),%ebx 
int *esi = &array[6];  // lea -0x8(%ebp),%esi 
do { 
    int eax = *(ebx - 1); // mov -0x4(%ebx),%eax 
    eax += *(ebx - 2); // add -0x8(%ebx),%eax 
    if (eax != *ebx)  // cmp %eax,(%ebx) 
     explode_bomb(); 
    ebx++;    // add $0x4,%ebx 
} while (ebx != esi); 

记住的C指针运算按项目大小自动缩放,但组件总是以字节为单位。 ebx是指向当前元素的指针,代码总结前两个并检查相等性。 esi是指向数组末尾的指针,用于退出循环。