2015-06-21 4 views
1

Я занимаюсь лабораторией бомб, и я правильно понял, что это последовательность Фибонаци (0 1 1 2 3 5). У меня возникают проблемы с пониманием следующих строк: 8048d11-8048d1aBomb lab assembly описание

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 - указатель на конец массива, который используется для выхода из цикла.