C к сборке - leaq инструкция

Насколько я понял:

  • %rdi = 1-й аргумент = х
  • %rsi = 2-й аргумент = y
  • %rdx = 3-й аргумент = z
  • Остальные манипулируют этими регистрами... и сохраняют в регистре возвращаемое значение.

3-я строка кода сборки leaq (%rsi, %rsi, 2), %rdx, что, как я перевожу: z = y + 2*y.

Я запутался, этот код неправильный или это магия сборки?

введите здесь описание изображения


person dud3    schedule 22.03.2017    source источник
comment
Он делает y*48 как y*3*16   -  person Jester    schedule 23.03.2017
comment
Да, я только что заметил это, я думаю, что это похоже на 3y << 4 = y * 48.   -  person dud3    schedule 23.03.2017
comment
@Jester, некоторые из этих инструкций довольно трудно переварить (для меня), у вас случайно нет хороших ссылок?   -  person dud3    schedule 23.03.2017
comment
Для других, проанализировавших его еще раз, этот код кажется правильным.   -  person dud3    schedule 23.03.2017
comment
Помимо официальной ссылки на набор инструкций Intel? Что еще тебе нужно :)   -  person Jester    schedule 23.03.2017


Ответы (1)


https://web.cecs.pdx.edu/~kimchris/cs201/slides/10%20-%20x86%20Basics,%20Part%202.pdf

простое объяснение

он перемещает адрес, а не значения

person Arun Kumar    schedule 16.01.2019
comment
Можете ли вы процитировать наиболее важную часть ссылки PDF? - person Will Cain; 17.01.2019
comment
leaq (%rsi, %rsi, 2), %rdx означает %rdx=2*rsi+rsi, что равно 3*rsi в двоичном формате, мы пишем 3 как 000011, поэтому после 4 осталось sfift (sal-shift в соотв. слева) 110000 что 48 - person Arun Kumar; 18.01.2019