2012-04-15 2 views
-1

Я искал через некоторый код, и нашла 2 линии, которые меня недоумение:Смешение команды добавить в сборке x86

add -0x4(%esi,%ebx,4),%eax 
cmp %eax,(%esi,%ebx,4) 

Я привык к стандартному add src,dst и cmp x1,x2, и я не совсем уверен, что эти линии фактически делать.

Я считаю, что он скомпилирован с помощью GCC

+0

Это поможет, если вы отредактируете вопрос, чтобы включить более подробную информацию о конкретном ассемблере, который вы используете. Я не понимаю этот синтаксис, хотя я должен добавить, что прошло некоторое время, так как я искал ассемблер. –

ответ

2

Вот с помощью Base + (Index * Scale) + Смещение режима адресации. По крайней мере, я так думаю. Я не очень хорошо знаком с синтаксисом AT & T. Я думаю, что синтаксис Intel будет:

add eax,[esi + ebx*4 - 4] 
cmp [esi + ebx*4],eax 

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

int a[100]; 
int i = 10; 
int total = 0; 
total += a[i-1]; 

Теперь сделайте esi содержать адрес массива, ebx содержать значение i и eax удерживайте значение 33. Вы бы получить:

add eax,[esi + ebx*4 - 4] 

инструкции сравнения тестирование, чтобы увидеть, если результат (в eax) равно следующее значение в массиве. В примере C это эквивалентно сравнению total с a[i].

+1

Вы правы. Основы синтаксиса AT & T: http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html – DCoder