2015-03-10 3 views
0

Я только начал с сборки; извините, если это вопрос noob.Умножающие указатели в сборе x86

Итак, мне дается i, из другой функции, которая является указателем на int. Мне нужно умножить 5 на это, но все, что я пробовал, дает мне ошибки.

lea (i), $ebp 
lea (i), $ebx 

addl %ebx, %ebx #error: no such instruction: `add1 %ebp,%ebp' 
add1 %ebx, %ebx 
addl %ebx, %ebp 

movl %ebp,(i) 

поэтому, я попробовал это по-другому. Не удалось заставить его работать. Я продолжал менять синтаксис на второй лиге и, вероятно, делал это хуже.

lea (i),$ebp 
lea $ebp, $ebp + $ebp * 4 

movl %ebp,(i) 

обновление: Я сделал исправление, предложенное Мичелем. Теперь я получаю "Ошибка: суффикс или операнды недопустим для` LEA»"

+2

'no such instruction: 'add1% ebp,% ebp'' Это потому, что вы написали цифру' 1' вместо буквы 'l'. – Michael

+0

Вы пытаетесь загрузить адрес эффекта указателя (получить «указатель на указатель»)? Код должен в основном быть «mov» (для загрузки указателя из стека в регистр EAX), а затем один «lea» (% eax,% eax, 4),% eax', чтобы умножить его на 5 (обратите внимание: это гораздо яснее в синтаксисе Intel - например, 'lea eax, [eax * 4 + eax]'). – Brendan

+0

Умножающие указатели не имеют смысла. Как вы увеличиваете свой домашний адрес на 5? Типичный доступ к массиву будет иметь базовый адрес ** плюс ** index * sizeof (type) –

ответ

1

Попробуйте это:

movl (i), %eax 
lea %eax + 4 * %eax, %eax 
movl %eax, (i) 

или более длинная версия:

movl (i), %eax 
movl %eax, %ebx 
addl %eax, %eax 
addl %eax, %eax 
addl %ebx, %eax 
movl %eax, (i) 

Использование lea в первой строке неправильно. «LEA» означает «Load Effective Address», поэтому он дает вам адрес, а не контент. i уже адрес, и

lea (i), %ebp 

бы просто загрузить %ebp с адрес выражения (i), которая просто i снова, а не его содержимое. Но вам нужен контент, поэтому используйте movl.

Другими словами:

lea (i), %eax 

эквивалентно

movl i, %eax 

, и это не то, что вы хотите. Вы хотите, чтобы содержание i, так что вы пишете:

movl (i), %eax 

Отказ

  • Я надеюсь, что я получил, что (ужасный, IMO) AT & T синтаксис справа.
  • Приведенные выше инструкции являются LEA, MOVL и ADDL, но, по-видимому, принято писать их в нижнем регистре.
+0

Упрощенный из-за синтаксиса 'ужасный' at & t. (какой беспорядок). – Johan