2015-10-19 2 views
1

У меня возникли проблемы с пониманием того, как дела 50, 52 и т. Д. Определялись на языке ассемблера.Сводные коды и операторы выводов операторов

Насколько я понимаю, таблица перехода соответствует действиям в каждом случае и что проверка того, что edx> 5 означает, что регистр варьируется от 0 до 5? Я считаю, что 1 не учитывается, потому что это случай по умолчанию, но почему осталось 5?

Я чувствую, что должен быть случай 55: где результат * = результат, нет?

Если кто-нибудь может помочь объяснить, это было бы здорово. Спасибо!

int switch_prob(int x) 
{ 
    int result = x; 
    switch (x) 
    { 
     case 50: 
     case 52: 
      result <<= 2; 
      break; 
     case 53: 
      result >>= 2; 
      break; 
     case 54: 
      result *= 3; 
      break; 
     default: 
      result += 10; 
    } 
    return result; 
} 

Рисунок 3.38 показывает разобранный код объекта для процедуры. Мы только заинтересованы в части кода, показанной на строках с 4 по 16. В строке 4 мы видим, что параметр x (при смещении 8 относительно% ebp) загружается в регистр% eax, соответствующий результат переменной программы , «Lea 0x0 (% ЭРИ),% ЭРИ» инструкция по линии 11 является NOP инструкции вставлен, чтобы сделать инструкцию по линии 12 запуска на адрес, который является кратного 16

таблица прыжка находится в различной области памяти. Используя отладчик GDB, , мы можем изучить шесть 4-байтовых слов памяти, начиная с адреса 0x8048468 с помощью команды x/6w 0x8048468. GDB выводит следующее:

(gdb) x/6w 
0x8048468: 0x080483d5 0x080483eb 0x080483d5 0x0x80483e0 
0x8048478: 0x080483e5 0x080483e8 
(gdb) 

ассемблер:

1: 080483c0 <switch_prob>: 
2: 80483c0: push %ebp 
3: 80483c1: mov %esp,%ebp 
4: 80483c3: mov 0x8(%ebp),%eax // X is copied into eax ; eax = x 
5: 80483c6: lea 0xffffffce(%eax),%edx // placeholder 
6: 80483c9: cmp $0x5, %edx // Compare edx (3rd argument) with 5; Edx - 5 // clearly, edx is x 
7: 80483cc: ja 80483eb <switch_prob+0x2b> // if edx - 5 > 0, Jump into line 16 (default) 
8: 80483ce: jmp *0x8048468(,%edx,4) // Go into the jump table 
9: 80483d5: shl $0x2, %eax // eax << 2 
10: 80483d8: jmp 80483ee <switch_prob+0x2e> // Jump to line 17 
11: 80483da: lea 0x0(%esi),%esi // esi = esi NOP. Filling in N bytes 
12: 80483e0: sar $0x2, %eax // eax >> 2 
13: 80483e3: jmp 80483ee <switch_prob+0x2e> // Jump to line 17 
14: 80483e5: lea (%eax, %eax, 2), %eax // eax = eax + 2(eax) 
15: 80483e8: imul %eax, %eax // eax *= eax 
16: 80483eb: add $0xa, %eax // eax += 10 
17: 80483ee: mov %ebp, %esp // esp = ebp 
18: 80483f0: pop %ebp 
19: 80483f1: ret 
+0

У вас есть пять случаев в коммутаторе. –

+0

Должен ли я иметь 6, поскольку Case 5 соответствует 0x80483e8? @JoachimPileborg – Crowning

+0

Счет на основе нуля, от '0' до' 5' (включительно) есть шесть номеров. :) –

ответ

4

сборка не соответствует исходному коду. Это соответствует нечто большее, как это:

int switch_prob(int x) 
{ 
    int result = x; 
    switch (x) 
    { 
     case 50: 
     case 52: 
      result <<= 2; 
      break; 
     case 53: 
      result >>= 2; 
      break; 
     case 54: 
      result *= 3; 
      // WARNING: Falls through 
     case 55: 
      result *= result; 
      // WARNING: Falls through 
     default: 
      result += 10; 
      break; 
    } 
    return result; 
} 

Это, вероятно, вызванные человеческой ошибки (например, обновление исходного кода в этом вопросе, так что это не совпадает с вопросом студентов в прошлом году получил, но забывая обновить сборку, чтобы соответствовать).

Никогда не предполагайте, что учителя/профессора не являются людьми ...

+0

Я согласен с человеческой ошибкой, кажется, что ответ был предоставлен неверно (ответ, вероятно, был основан на аналогичном упражнении из предыдущего семестра и не был должным образом обновлен) –

+0

Спасибо! Это имеет гораздо больший смысл. Проблема была связана с заданием Гарварда Lol – Crowning

+0

@Crowning: вы были участником на некоторое время и получили несколько хороших ответов на ваши различные вопросы. Вы можете принять пару из них: [Что делать, если кто-то отвечает на мой вопрос?] (Http://stackoverflow.com/help/someone-answers). Возможно, вам следует прочитать вводный [тур] некоторое время. (Не стоит беспокоиться - это коротко!это информативно! он заработает у вас значок в вашем профиле!) – usr2564301

Смежные вопросы