2017-02-06 19 views
4

У меня возникли трудности с переводом кода сборки IA32 обратно на его код кода C. Я нахожусь на 99% пути, но смещения байтов и хранилище регистра меня смущают.Преобразование сборки IA32 в код C

Код сборки в вопросе, movl %edx, %eax, кажется, устанавливает значение, хранящееся в %eax равным значению в %edx, но не то, что будет означать sub = result?

Я новичок в этом, поэтому ваше руководство ценится!

int d(int x, int y, int z)  // x at %ebp+8, y at %ebp+12, z at %ebp+16 
{ 
    int sub, result; 

    sub = z - y;    // movl 12(%ebp), %edx 
    result = sub;    // subl 16(%ebp), %edx 

    ???????????    // movl %edx, %eax 

    result <<= 31;    // sall $31, %eax 
    result >>= 31;    // sarl $31, %eax 

    result = sub * result;  // imull 8(%ebp), %edx 

    sub ^= x;     // xorl %edx, %eax 

    return result; 
} 
+0

Я уверен, что у вас есть опечатки. Например, 'movl 12 (% edx),% eax', вероятно,' movl 12 (% ebp),% eax'. Также 'eax' является' result' not 'sub' (так как' eax' является возвращаемым значением). 'subl 16 (% ebp),% edx' тоже не имеет смысла, так как' edx' не был установлен. – Jester

+0

Я просто сравнил его с моей спецификацией и сделал некоторые исправления, однако строка 'movl12' немного отличается от предложенной вами. Работа над этим теперь ... Редактирование: все еще не уверены, как изменить код C в ответ на изменение IA32. –

ответ

3

Первые две строк ассемблера фактически первая линия C, но обратные и выполняются в двух частях:

sub = y;     // movl 12(%ebp), %edx 
sub -= z;     // subl 16(%ebp), %edx 

Вы, кажется, есть небольшая проблема с тем, что при & т синтаксиса (что это) помещает операнд назначения справа. Таким образом, movl %edx, %eax действительно является result = sub, как написано в коде. Кроме того, imull 8(%ebp), %edx отчетливо записывается в edx, так что это sub = x * result (неявный операнд eax). Наконец, xorl %edx, %eax - это, конечно, result ^= sub. x, который является 8(%ebp), даже не упоминается на этой линии.