У меня возникли трудности с переводом кода сборки 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;
}
Я уверен, что у вас есть опечатки. Например, 'movl 12 (% edx),% eax', вероятно,' movl 12 (% ebp),% eax'. Также 'eax' является' result' not 'sub' (так как' eax' является возвращаемым значением). 'subl 16 (% ebp),% edx' тоже не имеет смысла, так как' edx' не был установлен. – Jester
Я просто сравнил его с моей спецификацией и сделал некоторые исправления, однако строка 'movl12' немного отличается от предложенной вами. Работа над этим теперь ... Редактирование: все еще не уверены, как изменить код C в ответ на изменение IA32. –