2012-05-10 2 views
0

Я читал экзамен по практике для одного из моих классов. Архитектура для вопроса - x86. Вопрос:Возможная ошибка с этим примером сборки x86

Which of the following lines of pseudo C code performs the same operation as the 
assembly statement 
    lea 0xffffffff(%esi), %eax ? 

Варианты:

a) *(esi-1) = eax 
b) esi = eax + 0xffffffff 
c) eax = esi - 1 
d) eax = *(esi -1) 

Потому что это «Леа» операции, я чувствую, что ответ должен быть (с), но, видимо, ключевой ответ говорит (а). Это опечатка? Или у меня плохое понимание. Спасибо.

+0

это не может быть сделано в C, так как инструкция 'lea' переносит результат в регистр, а не кусок памяти. – Hawken

+0

Я понимаю, что это не физически возможно в C, но вопрос в основном запрашивает код sudo C. Я сделал разъяснение, приведенное выше. – de1337ed

+0

Ах, извините, я довольно новичок в сборке, пытаясь сохранить свой ум острым :) – Hawken

ответ

1

Наиболее правильная интерпретация будет:

eax = (esi + 0xFFFFFFFF) & 0xFFFFFFFF; 

Конечно, это может быть упрощено до:

c) eax = esi - 1; 

Делая обратное (преобразование псевдо-C обратно к AT & T):

a) movl %eax,0xffffffff(%esi) 
b) lea 0xffffffff(%eax),%esi 
c) lea 0xffffffff(%esi), %eax 
d) movl 0xffffffff(%esi), %eax 
2

Ответ c является правильным.

Этот код часто генерируется компиляторами (и некоторыми людьми :-)), чтобы использовать тот факт, что lea является неразрушающей версией add, которая позволяет до трех входных операндов и оставляет флаги нетронутыми.

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